2026-06-03T09:00:19.392 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:00:19.392 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:00:49.423 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:00:49.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:00:49.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:00:49.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:00:49.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:00:50.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:00:50.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:00:50.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:00:50.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:00:50.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:00:50.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:00:50.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:00:50.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:00:53.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:00:53.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:00:53.658 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:00:53.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:00:53.668 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:00:53.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:00:53.681 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:00:53.682 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:00:53.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:00:53.682 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:00:53.683 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:00:53.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:00:53.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:00:53.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:00:53.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:00:53.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:00:53.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:00:53.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:00:54.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:00:54.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:00:54.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:00:54.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:00:54.013 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:00:54.084 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:00:49
2026-06-03T09:00:54.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85614, datetime.datetime(2026, 6, 3, 9, 0, 49), datetime.datetime(2026, 6, 3, 9, 0, 48), 'salt', 6.75, 98.83, None, 54.79, 97.58, 0.17, 823.91, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T09:00:54.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:00:54.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:00:54.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:00:48, diff=6.091132s, valid=True
2026-06-03T09:00:54.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:00:54.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:00:54.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:01:12, diff=-17.905556s, valid=True
2026-06-03T09:00:54.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:00:54.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:00:54.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:00:46, diff=8.102269s, valid=True
2026-06-03T09:00:54.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:00:54.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:00:54.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:00:54.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:00:54.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:00:54.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:00:54.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:01:12, diff=-17.894176s, valid=True
2026-06-03T09:00:54.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:00:54.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:00:54.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:00:54.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=44251.106592s, valid=False
2026-06-03T09:00:54.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:00:54.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:00:54.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:00:54.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:00:54.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:00:54.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:00:54.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:00:54.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:00:54.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:00:54.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:00:54.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:00:54.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:00:54.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:00:54.425 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:00:54.638 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:00:54.982 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:00:55.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:00:55.084 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:00:55.084 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:00:55.252 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:00:55.253 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:01:25.282 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:01:25.282 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:01:25.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:01:25.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:01:25.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:01:25.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:01:25.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:01:25.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:01:25.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:01:25.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:01:25.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:01:25.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:01:25.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:01:28.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:01:28.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:01:28.360 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:01:28.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:01:28.371 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:01:28.383 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:01:28.384 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:01:28.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:01:28.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:01:28.385 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:01:28.386 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:01:28.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:01:28.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:01:28.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:01:28.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:01:28.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:01:28.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T09:01:28.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:01:28.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T09:01:28.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:01:28.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:01:28.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:01:28.724 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:01:28.796 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:01:19
2026-06-03T09:01:28.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85615, datetime.datetime(2026, 6, 3, 9, 1, 19), datetime.datetime(2026, 6, 3, 9, 1, 18), 'salt', 6.88, 98.93, None, 55.15, 93.59, 0.15, 823.85, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T09:01:28.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:01:28.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:01:28.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:01:18, diff=10.804021s, valid=True
2026-06-03T09:01:28.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:01:28.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T09:01:28.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:01:12, diff=16.807649s, valid=True
2026-06-03T09:01:28.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:01:28.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:01:28.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:01:18, diff=10.816194s, valid=True
2026-06-03T09:01:28.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:01:28.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:01:28.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:01:28.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:01:28.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:01:28.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T09:01:28.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:01:12, diff=16.820129s, valid=True
2026-06-03T09:01:28.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:01:28.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:01:28.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:01:28.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=44285.820995s, valid=False
2026-06-03T09:01:28.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:01:28.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:01:28.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:01:28.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:01:28.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:01:28.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:01:28.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:01:28.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:01:28.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:01:29.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:01:29.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:01:29.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:01:29.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:01:29.210 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:01:29.424 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:01:29.769 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:01:29.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:01:29.877 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:01:29.877 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:01:30.050 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:01:30.050 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:02:00.079 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:02:00.079 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:02:00.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:02:00.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:02:00.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:02:00.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:02:00.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:02:00.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:02:00.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:02:00.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:02:00.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:02:00.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:02:00.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:02:03.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:02:03.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:02:03.300 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:02:03.300 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:02:03.310 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:02:03.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:02:03.323 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:02:03.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:02:03.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:02:03.324 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:02:03.324 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:02:03.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:02:03.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:02:03.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:02:03.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:02:03.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:02:03.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:02:03.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:02:03.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:02:03.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:02:03.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:02:03.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:02:03.654 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:02:03.734 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:01:49
2026-06-03T09:02:03.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85616, datetime.datetime(2026, 6, 3, 9, 1, 49), datetime.datetime(2026, 6, 3, 9, 1, 49), 'salt', 6.78, 98.89, None, 42.37, 87.2, 0.16, 824.03, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:02:03.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:02:03.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:02:03.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:01:49, diff=14.742238s, valid=True
2026-06-03T09:02:03.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:02:03.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:02:03.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:02:12, diff=-8.254249s, valid=True
2026-06-03T09:02:03.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:02:03.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:02:03.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:01:49, diff=14.753945s, valid=True
2026-06-03T09:02:03.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:02:03.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:02:03.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:02:03.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:02:03.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:02:03.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:02:03.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:02:12, diff=-8.242337s, valid=True
2026-06-03T09:02:03.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:02:03.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:02:03.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:02:03.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=44320.758472s, valid=False
2026-06-03T09:02:03.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:02:03.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:02:03.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:02:03.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:02:03.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:02:03.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:02:03.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:02:03.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:02:03.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:02:03.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:02:03.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:02:03.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:02:04.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:02:04.079 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:02:04.293 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:02:04.639 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:02:04.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:02:04.740 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:02:04.740 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:02:04.910 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:02:04.960 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:02:34.978 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:02:34.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:02:34.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:02:35.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:02:35.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:02:35.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:02:35.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:02:35.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:02:35.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:02:35.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:02:35.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:02:35.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:02:35.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:02:38.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:02:38.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:02:38.397 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:02:38.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:02:38.406 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:02:38.419 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:02:38.420 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:02:38.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:02:38.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:02:38.421 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:02:38.421 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:02:38.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:02:38.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:02:38.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:02:38.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:02:38.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:02:38.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T09:02:38.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:02:38.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T09:02:38.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:02:38.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:02:38.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:02:38.753 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:02:38.823 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:02:20
2026-06-03T09:02:38.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85617, datetime.datetime(2026, 6, 3, 9, 2, 20), datetime.datetime(2026, 6, 3, 9, 2, 19), 'salt', 6.78, 98.99, None, 43.43, 92.04, 0.14, 824.25, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:02:38.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:02:38.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:02:38.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:02:19, diff=19.829343s, valid=True
2026-06-03T09:02:38.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:02:38.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T09:02:38.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:02:12, diff=26.832726s, valid=True
2026-06-03T09:02:38.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:02:38.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:02:38.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:02:13, diff=25.840751s, valid=True
2026-06-03T09:02:38.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:02:38.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:02:38.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:02:38.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:02:38.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:02:38.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T09:02:38.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:02:12, diff=26.844394s, valid=True
2026-06-03T09:02:38.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:02:38.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:02:38.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:02:38.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=44355.845207s, valid=False
2026-06-03T09:02:38.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:02:38.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:02:38.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:02:38.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:02:38.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:02:38.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:02:38.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:02:38.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:02:38.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:02:38.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:02:39.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:02:39.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:02:39.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:02:39.164 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:02:39.378 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:02:39.722 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:02:39.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:02:39.824 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:02:39.824 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:02:39.997 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:02:39.998 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:03:10.000 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:03:10.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:03:10.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:03:10.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:03:10.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:03:10.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:03:10.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:03:10.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:03:10.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:03:10.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:03:10.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:03:10.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:03:10.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:03:13.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:03:13.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:03:13.257 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:03:13.257 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:03:13.265 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:03:13.277 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:03:13.277 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:03:13.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:03:13.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:03:13.277 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:03:13.277 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:03:13.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:03:13.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:03:13.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:03:13.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:03:13.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:03:13.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T09:03:13.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:03:13.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T09:03:13.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:03:13.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:03:13.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:03:13.575 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:03:13.646 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:02:50
2026-06-03T09:03:13.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85618, datetime.datetime(2026, 6, 3, 9, 2, 50), datetime.datetime(2026, 6, 3, 9, 2, 49), 'salt', 6.78, 98.93, None, 40.61, 104.55, 0.15, 824.22, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:03:13.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:03:13.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:03:13.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:02:49, diff=24.65375s, valid=True
2026-06-03T09:03:13.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:03:13.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T09:03:13.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:03:12, diff=1.656998s, valid=True
2026-06-03T09:03:13.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:03:13.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:03:13.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:02:44, diff=29.664684s, valid=True
2026-06-03T09:03:13.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:03:13.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:03:13.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:03:13.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:03:13.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:03:13.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T09:03:13.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:03:12, diff=1.668139s, valid=True
2026-06-03T09:03:13.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:03:13.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:03:13.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:03:13.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=44390.668891s, valid=False
2026-06-03T09:03:13.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:03:13.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:03:13.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:03:13.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:03:13.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:03:13.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:03:13.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:03:13.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:03:13.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:03:13.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:03:13.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:03:13.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:03:13.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:03:13.986 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:03:14.273 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:03:14.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:03:14.718 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:03:14.718 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:03:14.718 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:03:14.790 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:03:14.790 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:03:44.793 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:03:44.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:03:44.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:03:45.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:03:45.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:03:45.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:03:45.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:03:45.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:03:45.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:03:45.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:03:45.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:03:45.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:03:45.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:03:48.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:03:48.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:03:48.074 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:03:48.074 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:03:48.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:03:48.099 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:03:48.100 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:03:48.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:03:48.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:03:48.101 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:03:48.101 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:03:48.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:03:48.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:03:48.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:03:48.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:03:48.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:03:48.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T09:03:48.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:03:48.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T09:03:48.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:03:48.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:03:48.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:03:48.433 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:03:48.504 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:03:20
2026-06-03T09:03:48.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85619, datetime.datetime(2026, 6, 3, 9, 3, 20), datetime.datetime(2026, 6, 3, 9, 3, 19), 'salt', 6.55, 98.89, None, 35.67, 95.63, 0.16, 824.28, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:03:48.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:03:48.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:03:48.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:03:19, diff=29.512041s, valid=True
2026-06-03T09:03:48.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:03:48.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T09:03:48.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:03:12, diff=36.515499s, valid=True
2026-06-03T09:03:48.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:03:48.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:03:48.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:03:14, diff=34.523726s, valid=True
2026-06-03T09:03:48.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:03:48.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:03:48.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:03:48.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:03:48.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:03:48.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T09:03:48.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:03:12, diff=36.527413s, valid=True
2026-06-03T09:03:48.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:03:48.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:03:48.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:03:48.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=44425.528252s, valid=False
2026-06-03T09:03:48.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:03:48.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:03:48.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:03:48.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:03:48.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:03:48.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:03:48.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:03:48.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:03:48.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:03:48.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:03:48.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:03:48.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:03:48.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:03:48.848 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:03:49.062 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:03:49.407 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:03:49.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:03:49.509 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:03:49.509 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:03:49.667 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:03:49.667 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:04:19.690 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:04:19.690 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:04:19.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:04:19.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:04:19.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:04:20.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:04:20.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:04:20.132 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:04:20.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:04:20.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:04:20.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:04:20.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:04:20.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:04:22.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:04:22.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:04:22.796 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:04:22.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:04:22.807 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:04:22.820 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:04:22.821 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:04:22.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:04:22.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:04:22.822 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:04:22.822 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:04:22.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:04:22.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:04:22.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:04:23.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:04:23.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:04:23.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T09:04:23.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:04:23.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T09:04:23.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:04:23.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:04:23.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:04:23.150 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:04:23.221 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:04:21
2026-06-03T09:04:23.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85621, datetime.datetime(2026, 6, 3, 9, 4, 21), datetime.datetime(2026, 6, 3, 9, 4, 20), 'salt', 6.85, 98.96, None, 31.3, 104.9, 0.15, 824.16, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:04:23.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:04:23.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:04:23.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:04:20, diff=3.228947s, valid=True
2026-06-03T09:04:23.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:04:23.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T09:04:23.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:04:12, diff=11.232419s, valid=True
2026-06-03T09:04:23.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:04:23.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:04:23.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:04:16, diff=7.240642s, valid=True
2026-06-03T09:04:23.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:04:23.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:04:23.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:04:23.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:04:23.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:04:23.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T09:04:23.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:04:12, diff=11.244337s, valid=True
2026-06-03T09:04:23.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:04:23.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:04:23.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:04:23.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=44460.245156s, valid=False
2026-06-03T09:04:23.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:04:23.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:04:23.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:04:23.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:04:23.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:04:23.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:04:23.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:04:23.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:04:23.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:04:23.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:04:23.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:04:23.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:04:23.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:04:23.636 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:04:23.848 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:04:24.191 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:04:24.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:04:24.293 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:04:24.293 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:04:24.451 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:04:24.451 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:04:54.482 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:04:54.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:04:54.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:04:54.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:04:54.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:04:54.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:04:54.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:04:54.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:04:54.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:04:54.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:04:54.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:04:54.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:04:54.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:04:57.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:04:57.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:04:57.980 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:04:57.981 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:04:57.992 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:04:58.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:04:58.012 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:04:58.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:04:58.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:04:58.013 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:04:58.013 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:04:58.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:04:58.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:04:58.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:04:58.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:04:58.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:04:58.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:04:58.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:04:58.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:04:58.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:04:58.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:04:58.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:04:58.339 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:04:58.407 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:04:51
2026-06-03T09:04:58.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85622, datetime.datetime(2026, 6, 3, 9, 4, 51), datetime.datetime(2026, 6, 3, 9, 4, 50), 'salt', 6.85, 98.89, None, 35.39, 97.39, 0.16, 824.16, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:04:58.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:04:58.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:04:58.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:04:50, diff=8.415258s, valid=True
2026-06-03T09:04:58.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:04:58.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:04:58.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:05:12, diff=-13.581244s, valid=True
2026-06-03T09:04:58.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:04:58.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:04:58.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:04:47, diff=11.427016s, valid=True
2026-06-03T09:04:58.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:04:58.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:04:58.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:04:58.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:04:58.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:04:58.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:04:58.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:05:12, diff=-13.569219s, valid=True
2026-06-03T09:04:58.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:04:58.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:04:58.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:04:58.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=44495.431584s, valid=False
2026-06-03T09:04:58.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:04:58.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:04:58.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:04:58.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:04:58.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:04:58.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:04:58.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:04:58.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:04:58.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:04:58.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:04:58.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:04:58.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:04:58.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:04:58.753 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:04:58.967 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:04:59.312 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:04:59.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:04:59.413 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:04:59.413 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:04:59.683 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:04:59.683 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:05:29.714 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:05:29.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:05:29.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:05:29.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:05:29.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:05:30.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:05:30.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:05:30.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:05:30.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:05:30.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:05:30.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:05:30.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:05:30.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:05:32.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:05:32.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:05:32.779 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:05:32.780 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:05:32.789 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:05:32.802 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:05:32.802 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:05:32.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:05:32.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:05:32.803 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:05:32.804 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:05:32.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:05:32.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:05:32.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:05:33.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:05:33.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:05:33.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T09:05:33.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:05:33.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T09:05:33.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:05:33.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:05:33.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:05:33.139 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:05:33.208 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:05:21
2026-06-03T09:05:33.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85623, datetime.datetime(2026, 6, 3, 9, 5, 21), datetime.datetime(2026, 6, 3, 9, 5, 20), 'salt', 6.85, 98.99, None, 43.54, 86.76, 0.15, 824.28, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:05:33.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:05:33.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:05:33.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:05:20, diff=13.216178s, valid=True
2026-06-03T09:05:33.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:05:33.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T09:05:33.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:05:12, diff=21.219693s, valid=True
2026-06-03T09:05:33.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:05:33.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:05:33.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:05:19, diff=14.227892s, valid=True
2026-06-03T09:05:33.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:05:33.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:05:33.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:05:33.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:05:33.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:05:33.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T09:05:33.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:05:12, diff=21.2316s, valid=True
2026-06-03T09:05:33.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:05:33.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:05:33.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:05:33.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=44530.232427s, valid=False
2026-06-03T09:05:33.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:05:33.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:05:33.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:05:33.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:05:33.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:05:33.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:05:33.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:05:33.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:05:33.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:05:33.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:05:33.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:05:33.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:05:33.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:05:33.619 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:05:33.833 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:05:34.183 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:05:34.285 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:05:34.285 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:05:34.285 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:05:34.557 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:05:34.557 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:06:04.587 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:06:04.587 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:06:04.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:06:04.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:06:04.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:06:04.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:06:04.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:06:04.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:06:04.993 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:06:05.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:06:05.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:06:05.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:06:05.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:06:07.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:06:07.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:06:07.563 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:06:07.563 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:06:07.572 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:06:07.585 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:06:07.585 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:06:07.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:06:07.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:06:07.586 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:06:07.587 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:06:07.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:06:07.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:06:07.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:06:07.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:06:07.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:06:07.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:06:07.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:06:07.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:06:07.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:06:07.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:06:07.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:06:07.940 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:06:08.010 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:05:51
2026-06-03T09:06:08.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85624, datetime.datetime(2026, 6, 3, 9, 5, 51), datetime.datetime(2026, 6, 3, 9, 5, 51), 'salt', 6.85, 98.93, None, 43.22, 101.41, 0.15, 824.03, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:06:08.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:06:08.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:06:08.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:05:51, diff=17.017741s, valid=True
2026-06-03T09:06:08.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:06:08.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:06:08.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:06:12, diff=-3.978854s, valid=True
2026-06-03T09:06:08.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:06:08.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:06:08.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:05:50, diff=18.029079s, valid=True
2026-06-03T09:06:08.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:06:08.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:06:08.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:06:08.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:06:08.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:06:08.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:06:08.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:06:12, diff=-3.967267s, valid=True
2026-06-03T09:06:08.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:06:08.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:06:08.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:06:08.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=44565.033526s, valid=False
2026-06-03T09:06:08.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:06:08.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:06:08.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:06:08.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:06:08.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:06:08.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:06:08.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:06:08.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:06:08.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:06:08.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:06:08.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:06:08.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:06:08.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:06:08.354 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:06:08.569 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:06:08.914 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:06:09.017 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:06:09.017 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:06:09.017 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:06:09.270 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:06:09.271 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:06:39.301 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:06:39.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:06:39.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:06:39.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:06:39.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:06:39.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:06:39.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:06:39.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:06:39.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:06:39.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:06:39.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:06:39.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:06:39.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:06:42.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:06:42.525 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:06:42.525 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:06:42.526 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:06:42.535 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:06:42.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:06:42.548 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:06:42.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:06:42.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:06:42.549 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:06:42.549 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:06:42.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:06:42.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:06:42.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:06:42.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:06:42.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:06:42.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T09:06:42.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:06:42.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T09:06:42.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:06:42.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:06:42.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:06:42.875 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:06:42.943 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:06:22
2026-06-03T09:06:42.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85625, datetime.datetime(2026, 6, 3, 9, 6, 22), datetime.datetime(2026, 6, 3, 9, 6, 21), 'salt', 6.85, 98.96, None, 49.33, 97.81, 0.15, 823.91, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T09:06:42.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:06:42.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:06:42.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:06:21, diff=21.951059s, valid=True
2026-06-03T09:06:42.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:06:42.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T09:06:42.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:06:12, diff=30.954466s, valid=True
2026-06-03T09:06:42.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:06:42.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:06:42.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:06:15, diff=27.962329s, valid=True
2026-06-03T09:06:42.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:06:42.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:06:42.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:06:42.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:06:42.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:06:42.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T09:06:42.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:06:12, diff=30.965981s, valid=True
2026-06-03T09:06:42.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:06:42.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:06:42.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:06:42.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=44599.966784s, valid=False
2026-06-03T09:06:42.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:06:42.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:06:42.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:06:42.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:06:42.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:06:43.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:06:43.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:06:43.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:06:43.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:06:43.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:06:43.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:06:43.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:06:43.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:06:43.350 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:06:43.563 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:06:43.910 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:06:44.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:06:44.012 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:06:44.012 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:06:44.211 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:06:44.211 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:07:14.241 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:07:14.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:07:14.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:07:14.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:07:14.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:07:14.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:07:14.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:07:14.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:07:14.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:07:14.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:07:14.831 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:07:14.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:07:14.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:07:17.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:07:17.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:07:17.787 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:07:17.787 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:07:17.796 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:07:17.808 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:07:17.809 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:07:17.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:07:17.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:07:17.810 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:07:17.810 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:07:17.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:07:17.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:07:17.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:07:18.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:07:18.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:07:18.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T09:07:18.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:07:18.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T09:07:18.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:07:18.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:07:18.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:07:18.152 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:07:18.221 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:06:52
2026-06-03T09:07:18.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85626, datetime.datetime(2026, 6, 3, 9, 6, 52), datetime.datetime(2026, 6, 3, 9, 6, 51), 'salt', 6.75, 98.89, None, 50.21, 92.62, 0.16, 824.22, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T09:07:18.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:07:18.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:07:18.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:06:51, diff=27.228428s, valid=True
2026-06-03T09:07:18.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:07:18.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T09:07:18.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:07:12, diff=6.23176s, valid=True
2026-06-03T09:07:18.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:07:18.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:07:18.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:06:45, diff=33.239539s, valid=True
2026-06-03T09:07:18.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:07:18.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:07:18.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:07:18.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:07:18.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:07:18.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T09:07:18.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:07:12, diff=6.24304s, valid=True
2026-06-03T09:07:18.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:07:18.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:07:18.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:07:18.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=44635.243798s, valid=False
2026-06-03T09:07:18.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:07:18.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:07:18.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:07:18.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:07:18.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:07:18.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:07:18.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:07:18.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:07:18.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:07:18.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:07:18.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:07:18.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:07:18.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:07:18.562 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:07:18.775 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:07:19.118 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:07:19.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:07:19.219 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:07:19.219 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:07:19.481 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:07:19.481 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:07:49.511 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:07:49.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:07:49.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:07:49.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:07:49.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:07:50.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:07:50.120 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:07:50.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:07:50.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:07:50.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:07:50.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:07:50.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:07:50.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:07:52.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:07:52.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:07:52.790 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:07:52.790 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:07:52.799 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:07:52.812 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:07:52.813 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:07:52.813 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:07:52.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:07:52.814 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:07:52.814 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:07:52.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:07:52.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:07:52.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:07:53.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:07:53.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:07:53.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:07:53.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:07:53.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:07:53.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:07:53.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:07:53.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:07:53.143 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:07:53.212 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:07:52
2026-06-03T09:07:53.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85628, datetime.datetime(2026, 6, 3, 9, 7, 52), datetime.datetime(2026, 6, 3, 9, 7, 52), 'salt', 6.81, 98.89, None, 39.91, 98.99, 0.15, 824.28, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:07:53.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:07:53.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:07:53.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:07:52, diff=1.220184s, valid=True
2026-06-03T09:07:53.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:07:53.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:07:53.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:08:12, diff=-18.77636s, valid=True
2026-06-03T09:07:53.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:07:53.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:07:53.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:07:46, diff=7.231771s, valid=True
2026-06-03T09:07:53.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:07:53.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:07:53.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:07:53.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:07:53.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:07:53.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:07:53.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:08:12, diff=-18.764509s, valid=True
2026-06-03T09:07:53.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:07:53.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:07:53.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:07:53.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=44670.236301s, valid=False
2026-06-03T09:07:53.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:07:53.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:07:53.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:07:53.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:07:53.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:07:53.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:07:53.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:07:53.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:07:53.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:07:53.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:07:53.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:07:53.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:07:53.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:07:53.555 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:07:53.767 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:07:54.110 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:07:54.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:07:54.225 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:07:54.225 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:07:54.446 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:07:54.446 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:08:24.470 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:08:24.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:08:24.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:08:24.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:08:24.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:08:24.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:08:24.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:08:24.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:08:24.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:08:24.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:08:24.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:08:24.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:08:24.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:08:27.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:08:27.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:08:27.647 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:08:27.647 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:08:27.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:08:27.671 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:08:27.672 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:08:27.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:08:27.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:08:27.673 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:08:27.673 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:08:27.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:08:27.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:08:27.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:08:27.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:08:27.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:08:27.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T09:08:27.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:08:28.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T09:08:28.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:08:28.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:08:28.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:08:28.017 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:08:28.099 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:08:23
2026-06-03T09:08:28.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85629, datetime.datetime(2026, 6, 3, 9, 8, 23), datetime.datetime(2026, 6, 3, 9, 8, 22), 'salt', 6.85, 98.93, None, 37.15, 91.92, 0.15, 824.4, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:08:28.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:08:28.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:08:28.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:08:22, diff=6.106733s, valid=True
2026-06-03T09:08:28.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:08:28.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T09:08:28.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:08:12, diff=16.11024s, valid=True
2026-06-03T09:08:28.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:08:28.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:08:28.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:08:17, diff=11.118558s, valid=True
2026-06-03T09:08:28.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:08:28.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:08:28.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:08:28.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:08:28.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:08:28.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T09:08:28.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:08:12, diff=16.12235s, valid=True
2026-06-03T09:08:28.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:08:28.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:08:28.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:08:28.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=44705.123167s, valid=False
2026-06-03T09:08:28.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:08:28.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:08:28.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:08:28.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:08:28.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:08:28.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:08:28.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:08:28.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:08:28.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:08:28.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:08:28.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:08:28.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:08:28.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:08:28.488 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:08:28.760 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:08:29.105 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:08:29.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:08:29.206 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:08:29.206 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:08:29.375 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:08:29.376 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:08:59.406 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:08:59.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:08:59.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:08:59.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:08:59.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:08:59.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:08:59.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:08:59.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:08:59.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:08:59.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:08:59.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:08:59.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:08:59.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:09:02.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:09:02.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:09:02.862 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:09:02.862 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:09:02.874 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:09:02.887 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:09:02.887 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:09:02.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:09:02.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:09:02.888 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:09:02.888 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:09:02.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:09:03.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:09:03.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:09:03.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:09:03.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:09:03.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:09:03.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:09:03.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:09:03.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:09:03.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:09:03.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:09:03.235 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:09:03.309 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:08:53
2026-06-03T09:09:03.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85630, datetime.datetime(2026, 6, 3, 9, 8, 53), datetime.datetime(2026, 6, 3, 9, 8, 52), 'salt', 6.78, 98.96, None, 30.91, 103.52, 0.15, 824.4, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:09:03.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:09:03.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:09:03.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:08:52, diff=11.316662s, valid=True
2026-06-03T09:09:03.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:09:03.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:09:03.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:09:12, diff=-8.679809s, valid=True
2026-06-03T09:09:03.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:09:03.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:09:03.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:08:48, diff=15.328389s, valid=True
2026-06-03T09:09:03.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:09:03.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:09:03.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:09:03.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:09:03.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:09:03.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:09:03.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:09:12, diff=-8.667875s, valid=True
2026-06-03T09:09:03.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:09:03.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:09:03.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:09:03.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=44740.332936s, valid=False
2026-06-03T09:09:03.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:09:03.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:09:03.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:09:03.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:09:03.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:09:03.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:09:03.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:09:03.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:09:03.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:09:03.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:09:03.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:09:03.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:09:03.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:09:03.657 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:09:03.873 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:09:04.222 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:09:04.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:09:04.324 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:09:04.324 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:09:04.500 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:09:04.500 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:09:34.530 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:09:34.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:09:34.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:09:34.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:09:34.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:09:35.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:09:35.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:09:35.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:09:35.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:09:35.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:09:35.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:09:35.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:09:35.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:09:37.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:09:37.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:09:37.799 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:09:37.799 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:09:37.810 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:09:37.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:09:37.823 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:09:37.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:09:37.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:09:37.825 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:09:37.825 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:09:37.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:09:37.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:09:37.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:09:38.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:09:38.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:09:38.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T09:09:38.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:09:38.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T09:09:38.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:09:38.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:09:38.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:09:38.160 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:09:38.227 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:09:23
2026-06-03T09:09:38.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85631, datetime.datetime(2026, 6, 3, 9, 9, 23), datetime.datetime(2026, 6, 3, 9, 9, 22), 'salt', 6.85, 98.89, None, 31.9, 102.04, 0.16, 824.28, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:09:38.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:09:38.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:09:38.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:09:22, diff=16.235107s, valid=True
2026-06-03T09:09:38.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:09:38.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T09:09:38.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:09:12, diff=26.238509s, valid=True
2026-06-03T09:09:38.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:09:38.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:09:38.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:09:20, diff=18.246363s, valid=True
2026-06-03T09:09:38.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:09:38.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:09:38.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:09:38.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:09:38.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:09:38.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T09:09:38.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:09:12, diff=26.249973s, valid=True
2026-06-03T09:09:38.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:09:38.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:09:38.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:09:38.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=44775.25075s, valid=False
2026-06-03T09:09:38.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:09:38.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:09:38.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:09:38.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:09:38.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:09:38.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:09:38.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:09:38.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:09:38.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:09:38.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:09:38.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:09:38.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:09:38.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:09:38.645 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:09:38.857 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:09:39.200 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:09:39.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:09:39.298 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:09:39.299 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:09:39.444 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:09:39.444 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:10:09.444 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:10:09.445 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:10:09.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:10:09.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:10:09.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:10:09.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:10:09.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:10:09.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:10:09.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:10:09.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:10:09.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:10:09.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:10:09.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:10:12.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:10:12.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:10:12.473 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:10:12.474 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:10:12.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:10:12.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:10:12.497 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:10:12.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:10:12.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:10:12.498 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:10:12.498 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:10:12.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:10:12.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:10:12.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:10:12.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:10:12.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:10:12.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:10:12.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:10:12.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:10:12.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:10:12.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:10:12.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:10:12.845 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:10:12.915 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:09:53
2026-06-03T09:10:12.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85632, datetime.datetime(2026, 6, 3, 9, 9, 53), datetime.datetime(2026, 6, 3, 9, 9, 53), 'salt', 6.88, 98.99, None, 29.46, 101.15, 0.14, 824.28, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:10:12.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:10:12.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:10:12.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:09:53, diff=19.923219s, valid=True
2026-06-03T09:10:12.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:10:12.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:10:12.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:10:12, diff=0.927983s, valid=True
2026-06-03T09:10:12.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:10:12.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:10:12.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:09:51, diff=21.937612s, valid=True
2026-06-03T09:10:12.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:10:12.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:10:12.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:10:12.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:10:12.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:10:12.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:10:12.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:10:12, diff=0.941989s, valid=True
2026-06-03T09:10:12.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:10:12.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:10:12.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:10:12.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=44809.942935s, valid=False
2026-06-03T09:10:12.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:10:12.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:10:12.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:10:12.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:10:12.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:10:13.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:10:13.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:10:13.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:10:13.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:10:13.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:10:13.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:10:13.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:10:13.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:10:13.266 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:10:13.481 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:10:13.826 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:10:13.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:10:13.928 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:10:13.928 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:10:14.099 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:10:14.099 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:10:44.118 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:10:44.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:10:44.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:10:44.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:10:44.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:10:44.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:10:44.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:10:44.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:10:44.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:10:44.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:10:44.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:10:44.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:10:44.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:10:47.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:10:47.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:10:47.527 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:10:47.527 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:10:47.537 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:10:47.549 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:10:47.550 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:10:47.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:10:47.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:10:47.550 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:10:47.550 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:10:47.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:10:47.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:10:47.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:10:47.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:10:47.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:10:47.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:10:47.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:10:47.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:10:47.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:10:47.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:10:47.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:10:47.856 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:10:47.926 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:10:24
2026-06-03T09:10:47.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85633, datetime.datetime(2026, 6, 3, 9, 10, 24), datetime.datetime(2026, 6, 3, 9, 10, 23), 'salt', 6.81, 98.93, None, 31.19, 85.49, 0.15, 824.22, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:10:47.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:10:47.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:10:47.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:10:23, diff=24.933555s, valid=True
2026-06-03T09:10:47.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:10:47.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:10:47.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:10:12, diff=35.936859s, valid=True
2026-06-03T09:10:47.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:10:47.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:10:47.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:10:22, diff=25.944647s, valid=True
2026-06-03T09:10:47.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:10:47.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:10:47.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:10:47.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:10:47.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:10:47.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:10:47.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:10:12, diff=35.948175s, valid=True
2026-06-03T09:10:47.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:10:47.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:10:47.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:10:47.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=44844.948953s, valid=False
2026-06-03T09:10:47.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:10:47.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:10:47.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:10:47.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:10:47.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:10:48.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:10:48.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:10:48.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:10:48.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:10:48.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:10:48.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:10:48.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:10:48.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:10:48.341 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:10:48.573 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:10:48.921 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:10:49.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:10:49.024 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:10:49.024 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:10:50.626 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:10:50.626 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:11:20.656 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:11:20.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:11:20.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:11:20.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:11:20.814 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:11:21.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:11:21.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:11:21.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:11:21.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:11:21.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:11:21.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:11:21.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:11:21.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:11:23.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:11:23.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:11:23.768 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:11:23.768 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:11:23.778 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:11:23.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:11:23.792 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:11:23.792 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:11:23.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:11:23.793 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:11:23.793 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:11:23.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:11:23.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:11:23.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:11:24.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:11:24.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:11:24.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:11:24.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:11:24.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:11:24.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:11:24.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:11:24.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:11:24.156 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:11:24.231 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:10:54
2026-06-03T09:11:24.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85634, datetime.datetime(2026, 6, 3, 9, 10, 54), datetime.datetime(2026, 6, 3, 9, 10, 53), 'salt', 6.81, 98.96, None, 38.92, 88.82, 0.14, 824.03, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:11:24.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:11:24.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:11:24.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:10:53, diff=31.238313s, valid=True
2026-06-03T09:11:24.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:11:24.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:11:24.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:11:12, diff=12.241848s, valid=True
2026-06-03T09:11:24.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:11:24.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:11:24.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:10:47, diff=37.249754s, valid=True
2026-06-03T09:11:24.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:11:24.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:11:24.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:11:24.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:11:24.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:11:24.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:11:24.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:11:12, diff=12.253377s, valid=True
2026-06-03T09:11:24.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:11:24.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:11:24.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:11:24.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=44881.25417s, valid=False
2026-06-03T09:11:24.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:11:24.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:11:24.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:11:24.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:11:24.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:11:24.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:11:24.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:11:24.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:11:24.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:11:24.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:11:24.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:11:24.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:11:24.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:11:24.576 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:11:24.789 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:11:25.133 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:11:25.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:11:25.235 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:11:25.235 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:11:25.308 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:11:25.308 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:11:55.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:11:55.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:11:55.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:11:55.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:11:55.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:11:55.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:11:55.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:11:55.719 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:11:55.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:11:55.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:11:55.728 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:11:55.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:11:55.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:11:58.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:11:58.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:11:58.521 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:11:58.522 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:11:58.532 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:11:58.544 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:11:58.545 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:11:58.546 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:11:58.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:11:58.546 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:11:58.546 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:11:58.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:11:58.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:11:58.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:11:58.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:11:58.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:11:58.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:11:58.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:11:58.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:11:58.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:11:58.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:11:58.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:11:58.890 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:11:58.961 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:11:54
2026-06-03T09:11:58.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85636, datetime.datetime(2026, 6, 3, 9, 11, 54), datetime.datetime(2026, 6, 3, 9, 11, 54), 'salt', 6.85, 98.96, None, 48.87, 82.06, 0.15, 823.97, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T09:11:58.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:11:58.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:11:58.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:11:54, diff=4.968377s, valid=True
2026-06-03T09:11:58.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:11:58.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:11:58.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:12:12, diff=-13.028031s, valid=True
2026-06-03T09:11:58.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:11:58.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:11:58.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:11:48, diff=10.980286s, valid=True
2026-06-03T09:11:58.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:11:58.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:11:58.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:11:58.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:11:58.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:11:58.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:11:58.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:12:12, diff=-13.015924s, valid=True
2026-06-03T09:11:58.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:11:58.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:11:58.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:11:58.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=44915.984903s, valid=False
2026-06-03T09:11:58.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:11:58.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:11:58.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:11:58.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:11:58.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:11:59.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:11:59.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:11:59.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:11:59.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:11:59.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:11:59.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:11:59.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:11:59.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:11:59.370 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:11:59.584 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:11:59.937 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:12:00.042 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:12:00.043 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:12:00.043 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:12:00.194 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:12:00.194 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:12:30.221 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:12:30.221 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:12:30.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:12:30.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:12:30.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:12:30.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:12:30.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:12:30.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:12:30.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:12:30.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:12:30.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:12:30.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:12:30.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:12:33.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:12:33.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:12:33.571 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:12:33.572 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:12:33.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:12:33.595 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:12:33.595 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:12:33.596 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:12:33.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:12:33.596 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:12:33.597 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:12:33.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:12:33.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:12:33.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:12:33.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:12:33.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:12:33.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:12:33.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:12:33.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:12:33.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:12:33.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:12:33.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:12:33.939 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:12:34.026 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:12:25
2026-06-03T09:12:34.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85637, datetime.datetime(2026, 6, 3, 9, 12, 25), datetime.datetime(2026, 6, 3, 9, 12, 24), 'salt', 6.81, 98.92, None, 48.16, 100.91, 0.15, 824.03, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T09:12:34.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:12:34.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:12:34.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:12:24, diff=10.034108s, valid=True
2026-06-03T09:12:34.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:12:34.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:12:34.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:12:12, diff=22.037704s, valid=True
2026-06-03T09:12:34.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:12:34.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:12:34.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:12:18, diff=16.045901s, valid=True
2026-06-03T09:12:34.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:12:34.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:12:34.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:12:34.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:12:34.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:12:34.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:12:34.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:12:12, diff=22.049643s, valid=True
2026-06-03T09:12:34.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:12:34.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:12:34.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:12:34.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=44951.050446s, valid=False
2026-06-03T09:12:34.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:12:34.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:12:34.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:12:34.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:12:34.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:12:34.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:12:34.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:12:34.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:12:34.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:12:34.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:12:34.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:12:34.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:12:34.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:12:34.374 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:12:34.589 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:12:34.935 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:12:35.037 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:12:35.037 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:12:35.037 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:12:35.109 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:12:35.109 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:13:05.118 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:13:05.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:13:05.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:13:05.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:13:05.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:13:05.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:13:05.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:13:05.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:13:05.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:13:05.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:13:05.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:13:05.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:13:05.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:13:08.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:13:08.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:13:08.143 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:13:08.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:13:08.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:13:08.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:13:08.167 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:13:08.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:13:08.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:13:08.168 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:13:08.168 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:13:08.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:13:08.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:13:08.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:13:08.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:13:08.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:13:08.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:13:08.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:13:08.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:13:08.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:13:08.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:13:08.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:13:08.504 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:13:08.572 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:12:55
2026-06-03T09:13:08.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85638, datetime.datetime(2026, 6, 3, 9, 12, 55), datetime.datetime(2026, 6, 3, 9, 12, 54), 'salt', 6.88, 98.96, None, 45.59, 103.07, 0.15, 823.97, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T09:13:08.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:13:08.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:13:08.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:12:54, diff=14.580063s, valid=True
2026-06-03T09:13:08.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:13:08.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:13:08.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:13:12, diff=-3.416453s, valid=True
2026-06-03T09:13:08.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:13:08.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:13:08.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:12:49, diff=19.591868s, valid=True
2026-06-03T09:13:08.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:13:08.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:13:08.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:13:08.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:13:08.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:13:08.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:13:08.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:13:12, diff=-3.404223s, valid=True
2026-06-03T09:13:08.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:13:08.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:13:08.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:13:08.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=44985.596589s, valid=False
2026-06-03T09:13:08.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:13:08.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:13:08.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:13:08.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:13:08.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:13:08.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:13:08.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:13:08.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:13:08.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:13:08.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:13:08.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:13:08.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:13:08.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:13:08.917 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:13:09.134 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:13:09.496 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:13:09.599 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:13:09.599 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:13:09.599 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:13:09.651 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:13:09.651 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:13:39.681 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:13:39.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:13:39.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:13:39.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:13:39.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:13:40.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:13:40.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:13:40.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:13:40.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:13:40.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:13:40.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:13:40.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:13:40.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:13:42.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:13:42.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:13:42.886 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:13:42.886 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:13:42.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:13:42.909 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:13:42.909 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:13:42.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:13:42.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:13:42.910 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:13:42.911 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:13:42.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:13:43.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:13:43.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:13:43.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:13:43.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:13:43.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:13:43.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:13:43.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:13:43.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:13:43.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:13:43.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:13:43.239 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:13:43.309 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:13:25
2026-06-03T09:13:43.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85639, datetime.datetime(2026, 6, 3, 9, 13, 25), datetime.datetime(2026, 6, 3, 9, 13, 24), 'salt', 6.88, 98.99, None, 48.58, 93.77, 0.14, 824.03, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T09:13:43.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:13:43.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:13:43.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:13:24, diff=19.321497s, valid=True
2026-06-03T09:13:43.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:13:43.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:13:43.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:13:12, diff=31.325006s, valid=True
2026-06-03T09:13:43.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:13:43.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:13:43.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:13:21, diff=22.333157s, valid=True
2026-06-03T09:13:43.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:13:43.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:13:43.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:13:43.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:13:43.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:13:43.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:13:43.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:13:12, diff=31.336911s, valid=True
2026-06-03T09:13:43.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:13:43.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:13:43.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:13:43.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45020.337732s, valid=False
2026-06-03T09:13:43.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:13:43.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:13:43.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:13:43.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:13:43.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:13:43.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:13:43.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:13:43.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:13:43.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:13:43.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:13:43.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:13:43.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:13:43.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:13:43.660 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:13:43.874 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:13:44.277 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:13:44.380 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:13:44.380 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:13:44.380 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:13:44.552 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:13:44.552 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:14:14.554 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:14:14.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:14:14.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:14:14.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:14:14.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:14:14.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:14:14.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:14:14.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:14:14.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:14:14.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:14:14.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:14:14.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:14:14.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:14:17.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:14:17.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:14:17.561 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:14:17.561 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:14:17.572 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:14:17.584 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:14:17.585 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:14:17.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:14:17.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:14:17.586 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:14:17.586 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:14:17.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:14:17.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:14:17.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:14:17.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:14:17.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:14:17.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:14:17.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:14:17.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:14:17.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:14:17.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:14:17.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:14:17.918 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:14:17.988 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:13:55
2026-06-03T09:14:17.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85640, datetime.datetime(2026, 6, 3, 9, 13, 55), datetime.datetime(2026, 6, 3, 9, 13, 55), 'salt', 6.85, 98.96, None, 47.63, 98.8, 0.15, 824.03, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T09:14:17.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:14:17.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:14:17.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:13:55, diff=22.994586s, valid=True
2026-06-03T09:14:17.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:14:17.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:14:17.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:14:12, diff=5.997445s, valid=True
2026-06-03T09:14:17.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:14:17.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:14:18.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:13:52, diff=26.004102s, valid=True
2026-06-03T09:14:18.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:14:18.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:14:18.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:14:18.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:14:18.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:14:18.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:14:18.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:14:12, diff=6.007105s, valid=True
2026-06-03T09:14:18.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:14:18.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:14:18.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:14:18.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45055.007758s, valid=False
2026-06-03T09:14:18.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:14:18.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:14:18.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:14:18.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:14:18.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:14:18.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:14:18.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:14:18.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:14:18.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:14:18.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:14:18.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:14:18.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:14:18.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:14:18.331 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:14:18.544 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:14:18.893 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:14:18.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:14:18.994 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:14:18.994 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:14:19.162 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:14:19.163 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:14:49.184 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:14:49.185 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:14:49.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:14:49.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:14:49.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:14:49.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:14:49.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:14:49.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:14:49.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:14:49.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:14:49.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:14:49.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:14:49.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:14:52.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:14:52.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:14:52.105 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:14:52.105 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:14:52.115 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:14:52.129 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:14:52.129 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:14:52.130 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:14:52.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:14:52.130 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:14:52.131 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:14:52.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:14:52.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:14:52.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:14:52.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:14:52.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:14:52.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:14:52.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:14:52.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:14:52.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:14:52.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:14:52.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:14:52.459 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:14:52.529 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:14:26
2026-06-03T09:14:52.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85641, datetime.datetime(2026, 6, 3, 9, 14, 26), datetime.datetime(2026, 6, 3, 9, 14, 25), 'salt', 6.75, 98.96, None, 48.83, 99.22, 0.15, 824.15, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T09:14:52.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:14:52.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:14:52.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:14:25, diff=27.536856s, valid=True
2026-06-03T09:14:52.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:14:52.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:14:52.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:14:12, diff=40.540274s, valid=True
2026-06-03T09:14:52.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:14:52.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:14:52.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:14:24, diff=28.548129s, valid=True
2026-06-03T09:14:52.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:14:52.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:14:52.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:14:52.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:14:52.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:14:52.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:14:52.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:14:12, diff=40.551762s, valid=True
2026-06-03T09:14:52.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:14:52.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:14:52.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:14:52.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45089.552527s, valid=False
2026-06-03T09:14:52.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:14:52.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:14:52.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:14:52.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:14:52.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:14:52.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:14:52.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:14:52.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:14:52.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:14:52.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:14:52.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:14:52.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:14:52.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:14:52.869 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:14:53.156 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:14:53.500 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:14:53.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:14:53.602 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:14:53.602 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:14:53.752 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:14:53.753 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:15:23.762 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:15:23.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:15:23.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:15:23.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:15:23.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:15:24.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:15:24.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:15:24.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:15:24.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:15:24.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:15:24.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:15:24.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:15:24.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:15:27.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:15:27.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:15:27.570 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:15:27.570 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:15:27.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:15:27.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:15:27.594 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:15:27.595 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:15:27.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:15:27.595 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:15:27.596 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:15:27.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:15:27.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:15:27.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:15:27.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:15:27.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:15:27.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:15:27.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:15:27.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:15:27.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:15:27.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:15:27.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:15:27.935 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:15:28.005 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:15:26
2026-06-03T09:15:28.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85643, datetime.datetime(2026, 6, 3, 9, 15, 26), datetime.datetime(2026, 6, 3, 9, 15, 25), 'salt', 6.85, 99.02, None, 36.41, 96.03, 0.14, 824.28, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:15:28.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:15:28.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:15:28.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:15:25, diff=3.013156s, valid=True
2026-06-03T09:15:28.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:15:28.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:15:28.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:15:12, diff=16.016748s, valid=True
2026-06-03T09:15:28.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:15:28.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:15:28.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:15:20, diff=8.02529s, valid=True
2026-06-03T09:15:28.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:15:28.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:15:28.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:15:28.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:15:28.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:15:28.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:15:28.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:15:12, diff=16.029099s, valid=True
2026-06-03T09:15:28.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:15:28.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:15:28.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:15:28.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45125.029954s, valid=False
2026-06-03T09:15:28.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:15:28.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:15:28.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:15:28.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:15:28.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:15:28.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:15:28.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:15:28.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:15:28.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:15:28.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:15:28.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:15:28.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:15:28.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:15:28.364 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:15:28.589 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:15:28.944 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:15:29.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:15:29.048 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:15:29.048 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:15:29.287 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:15:29.287 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:15:59.317 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:15:59.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:15:59.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:15:59.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:15:59.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:15:59.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:15:59.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:15:59.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:15:59.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:15:59.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:15:59.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:15:59.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:15:59.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:16:02.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:16:02.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:16:02.424 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:16:02.425 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:16:02.434 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:16:02.448 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:16:02.448 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:16:02.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:16:02.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:16:02.450 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:16:02.450 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:16:02.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:16:02.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:16:02.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:16:02.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:16:02.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:16:02.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:16:02.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:16:02.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:16:02.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:16:02.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:16:02.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:16:02.792 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:16:02.862 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:15:57
2026-06-03T09:16:02.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85644, datetime.datetime(2026, 6, 3, 9, 15, 57), datetime.datetime(2026, 6, 3, 9, 15, 56), 'salt', 6.81, 98.99, None, 37.82, 96.9, 0.14, 824.27, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:16:02.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:16:02.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:16:02.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:15:56, diff=6.870329s, valid=True
2026-06-03T09:16:02.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:16:02.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:16:02.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:16:12, diff=-9.126162s, valid=True
2026-06-03T09:16:02.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:16:02.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:16:02.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:15:50, diff=12.881954s, valid=True
2026-06-03T09:16:02.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:16:02.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:16:02.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:16:02.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:16:02.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:16:02.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:16:02.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:16:12, diff=-9.114293s, valid=True
2026-06-03T09:16:02.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:16:02.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:16:02.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:16:02.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45159.886514s, valid=False
2026-06-03T09:16:02.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:16:02.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:16:02.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:16:02.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:16:02.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:16:02.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:16:02.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:16:02.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:16:02.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:16:03.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:16:03.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:16:03.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:16:03.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:16:03.279 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:16:03.491 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:16:03.835 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:16:03.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:16:03.937 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:16:03.938 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:16:04.179 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:16:04.179 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:16:34.182 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:16:34.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:16:34.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:16:34.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:16:34.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:16:34.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:16:34.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:16:34.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:16:34.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:16:34.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:16:34.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:16:34.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:16:34.792 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:16:37.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:16:37.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:16:37.536 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:16:37.537 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:16:37.545 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:16:37.558 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:16:37.559 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:16:37.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:16:37.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:16:37.559 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:16:37.560 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:16:37.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:16:37.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:16:37.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:16:37.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:16:37.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:16:37.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:16:37.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:16:37.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:16:37.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:16:37.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:16:37.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:16:37.884 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:16:37.954 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:16:27
2026-06-03T09:16:37.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85645, datetime.datetime(2026, 6, 3, 9, 16, 27), datetime.datetime(2026, 6, 3, 9, 16, 26), 'salt', 6.78, 98.99, None, 39.87, 102.67, 0.14, 824.27, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:16:37.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:16:37.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:16:37.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:16:26, diff=11.96211s, valid=True
2026-06-03T09:16:37.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:16:37.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:16:37.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:16:12, diff=25.965686s, valid=True
2026-06-03T09:16:37.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:16:37.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:16:37.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:16:20, diff=17.974048s, valid=True
2026-06-03T09:16:37.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:16:37.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:16:37.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:16:37.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:16:37.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:16:37.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:16:37.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:16:12, diff=25.977834s, valid=True
2026-06-03T09:16:37.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:16:37.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:16:37.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:16:37.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45194.978655s, valid=False
2026-06-03T09:16:37.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:16:37.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:16:37.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:16:37.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:16:37.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:16:38.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:16:38.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:16:38.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:16:38.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:16:38.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:16:38.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:16:38.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:16:38.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:16:38.301 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:16:38.513 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:16:38.859 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:16:38.961 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:16:38.961 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:16:38.961 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:16:39.186 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:16:39.186 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:17:09.202 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:17:09.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:17:09.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:17:09.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:17:09.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:17:09.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:17:09.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:17:09.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:17:09.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:17:09.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:17:09.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:17:09.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:17:09.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:17:12.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:17:12.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:17:12.375 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:17:12.375 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:17:12.386 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:17:12.398 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:17:12.399 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:17:12.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:17:12.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:17:12.400 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:17:12.400 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:17:12.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:17:12.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:17:12.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:17:12.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:17:12.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:17:12.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:17:12.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:17:12.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:17:12.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:17:12.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:17:12.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:17:12.735 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:17:12.806 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:16:57
2026-06-03T09:17:12.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85646, datetime.datetime(2026, 6, 3, 9, 16, 57), datetime.datetime(2026, 6, 3, 9, 16, 57), 'salt', 6.81, 98.99, None, 50.1, 105.54, 0.14, 824.27, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T09:17:12.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:17:12.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:17:12.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:16:57, diff=15.814122s, valid=True
2026-06-03T09:17:12.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:17:12.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:17:12.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:17:12, diff=0.817646s, valid=True
2026-06-03T09:17:12.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:17:12.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:17:12.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:16:50, diff=22.825952s, valid=True
2026-06-03T09:17:12.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:17:12.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:17:12.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:17:12.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:17:12.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:17:12.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:17:12.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:17:12, diff=0.829668s, valid=True
2026-06-03T09:17:12.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:17:12.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:17:12.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:17:12.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45229.830479s, valid=False
2026-06-03T09:17:12.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:17:12.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:17:12.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:17:12.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:17:12.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:17:12.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:17:12.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:17:12.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:17:12.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:17:13.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:17:13.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:17:13.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:17:13.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:17:13.215 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:17:13.430 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:17:13.777 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:17:13.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:17:13.878 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:17:13.878 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:17:14.035 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:17:14.035 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:17:44.064 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:17:44.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:17:44.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:17:44.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:17:44.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:17:44.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:17:44.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:17:44.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:17:44.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:17:44.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:17:44.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:17:44.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:17:44.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:17:48.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:17:48.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:17:48.277 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:17:48.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:17:48.288 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:17:48.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:17:48.302 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:17:48.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:17:48.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:17:48.303 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:17:48.303 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:17:48.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:17:48.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:17:48.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:17:48.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:17:48.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:17:48.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:17:48.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:17:48.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:17:48.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:17:48.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:17:48.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:17:48.619 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:17:48.690 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:17:28
2026-06-03T09:17:48.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85647, datetime.datetime(2026, 6, 3, 9, 17, 28), datetime.datetime(2026, 6, 3, 9, 17, 27), 'salt', 6.81, 98.96, None, 41.85, 99.39, 0.14, 823.97, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:17:48.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:17:48.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:17:48.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:17:27, diff=21.697426s, valid=True
2026-06-03T09:17:48.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:17:48.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:17:48.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:17:12, diff=36.700797s, valid=True
2026-06-03T09:17:48.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:17:48.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:17:48.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:17:22, diff=26.708502s, valid=True
2026-06-03T09:17:48.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:17:48.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:17:48.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:17:48.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:17:48.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:17:48.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:17:48.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:17:12, diff=36.712084s, valid=True
2026-06-03T09:17:48.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:17:48.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:17:48.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:17:48.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45265.712871s, valid=False
2026-06-03T09:17:48.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:17:48.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:17:48.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:17:48.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:17:48.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:17:48.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:17:48.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:17:48.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:17:48.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:17:48.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:17:48.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:17:48.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:17:48.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:17:49.031 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:17:49.244 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:17:49.588 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:17:49.689 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:17:49.689 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:17:49.689 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:17:49.935 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:17:49.935 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:18:19.964 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:18:19.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:18:19.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:18:20.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:18:20.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:18:20.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:18:20.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:18:20.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:18:20.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:18:20.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:18:20.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:18:20.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:18:20.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:18:23.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:18:23.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:18:23.079 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:18:23.079 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:18:23.089 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:18:23.102 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:18:23.103 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:18:23.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:18:23.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:18:23.104 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:18:23.104 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:18:23.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:18:23.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:18:23.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:18:23.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:18:23.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:18:23.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:18:23.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:18:23.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:18:23.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:18:23.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:18:23.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:18:23.455 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:18:23.526 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:17:58
2026-06-03T09:18:23.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85648, datetime.datetime(2026, 6, 3, 9, 17, 58), datetime.datetime(2026, 6, 3, 9, 17, 57), 'salt', 6.81, 98.89, None, 40.75, 98.35, 0.15, 824.03, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:18:23.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:18:23.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:18:23.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:17:57, diff=26.534214s, valid=True
2026-06-03T09:18:23.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:18:23.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:18:23.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:18:12, diff=11.537754s, valid=True
2026-06-03T09:18:23.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:18:23.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:18:23.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:17:53, diff=30.54584s, valid=True
2026-06-03T09:18:23.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:18:23.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:18:23.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:18:23.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:18:23.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:18:23.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:18:23.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:18:12, diff=11.549545s, valid=True
2026-06-03T09:18:23.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:18:23.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:18:23.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:18:23.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45300.550355s, valid=False
2026-06-03T09:18:23.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:18:23.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:18:23.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:18:23.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:18:23.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:18:23.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:18:23.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:18:23.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:18:23.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:18:23.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:18:23.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:18:23.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:18:23.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:18:23.869 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:18:24.083 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:18:24.427 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:18:24.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:18:24.530 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:18:24.530 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:18:24.781 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:18:24.781 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:18:54.782 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:18:54.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:18:54.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:18:55.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:18:55.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:18:55.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:18:55.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:18:55.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:18:55.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:18:55.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:18:55.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:18:55.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:18:55.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:18:57.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:18:57.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:18:57.907 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:18:57.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:18:57.918 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:18:57.930 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:18:57.931 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:18:57.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:18:57.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:18:57.932 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:18:57.932 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:18:57.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:18:58.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:18:58.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:18:58.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:18:58.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:18:58.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:18:58.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:18:58.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:18:58.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:18:58.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:18:58.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:18:58.287 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:18:58.379 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:18:28
2026-06-03T09:18:58.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85649, datetime.datetime(2026, 6, 3, 9, 18, 28), datetime.datetime(2026, 6, 3, 9, 18, 27), 'salt', 6.88, 98.96, None, 42.23, 85.21, 0.15, 824.09, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:18:58.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:18:58.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:18:58.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:18:27, diff=31.386827s, valid=True
2026-06-03T09:18:58.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:18:58.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:18:58.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:18:12, diff=46.390322s, valid=True
2026-06-03T09:18:58.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:18:58.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:18:58.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:18:24, diff=34.398579s, valid=True
2026-06-03T09:18:58.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:18:58.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:18:58.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:18:58.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:18:58.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:18:58.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:18:58.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:18:12, diff=46.40242s, valid=True
2026-06-03T09:18:58.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:18:58.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:18:58.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:18:58.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45335.403239s, valid=False
2026-06-03T09:18:58.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:18:58.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:18:58.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:18:58.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:18:58.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:18:58.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:18:58.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:18:58.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:18:58.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:18:58.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:18:58.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:18:58.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:18:58.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:18:58.721 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:18:58.933 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:18:59.332 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:18:59.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:18:59.433 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:18:59.433 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:18:59.706 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:18:59.706 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:19:29.736 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:19:29.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:19:29.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:19:29.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:19:30.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:19:30.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:19:30.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:19:30.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:19:30.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:19:30.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:19:30.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:19:30.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:19:30.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:19:33.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:19:33.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:19:33.025 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:19:33.025 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:19:33.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:19:33.048 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:19:33.049 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:19:33.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:19:33.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:19:33.050 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:19:33.050 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:19:33.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:19:33.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:19:33.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:19:33.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:19:33.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:19:33.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:19:33.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:19:33.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:19:33.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:19:33.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:19:33.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:19:33.401 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:19:33.473 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:19:28
2026-06-03T09:19:33.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85651, datetime.datetime(2026, 6, 3, 9, 19, 28), datetime.datetime(2026, 6, 3, 9, 19, 28), 'salt', 6.85, 98.96, None, 44.17, 91.4, 0.15, 824.15, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:19:33.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:19:33.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:19:33.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:19:28, diff=5.480832s, valid=True
2026-06-03T09:19:33.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:19:33.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:19:33.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:19:12, diff=21.484373s, valid=True
2026-06-03T09:19:33.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:19:33.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:19:33.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:19:27, diff=6.492516s, valid=True
2026-06-03T09:19:33.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:19:33.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:19:33.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:19:33.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:19:33.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:19:33.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:19:33.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:19:12, diff=21.49625s, valid=True
2026-06-03T09:19:33.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:19:33.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:19:33.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:19:33.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45370.497092s, valid=False
2026-06-03T09:19:33.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:19:33.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:19:33.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:19:33.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:19:33.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:19:33.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:19:33.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:19:33.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:19:33.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:19:33.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:19:33.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:19:33.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:19:33.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:19:33.816 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:19:34.032 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:19:34.376 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:19:34.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:19:34.478 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:19:34.478 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:19:34.704 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:19:34.705 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:20:04.735 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:20:04.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:20:04.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:20:04.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:20:04.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:20:05.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:20:05.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:20:05.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:20:05.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:20:05.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:20:05.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:20:05.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:20:05.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:20:07.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:20:07.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:20:07.682 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:20:07.682 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:20:07.692 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:20:07.705 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:20:07.705 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:20:07.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:20:07.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:20:07.706 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:20:07.707 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:20:07.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:20:07.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:20:07.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:20:07.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:20:07.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:20:07.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:20:07.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:20:08.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:20:08.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:20:08.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:20:08.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:20:08.048 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:20:08.121 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:19:59
2026-06-03T09:20:08.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85652, datetime.datetime(2026, 6, 3, 9, 19, 59), datetime.datetime(2026, 6, 3, 9, 19, 58), 'salt', 6.81, 98.89, None, 41.67, 104.5, 0.15, 824.03, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:20:08.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:20:08.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:20:08.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:19:58, diff=10.129314s, valid=True
2026-06-03T09:20:08.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:20:08.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:20:08.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:20:12, diff=-3.867143s, valid=True
2026-06-03T09:20:08.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:20:08.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:20:08.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:19:52, diff=16.141103s, valid=True
2026-06-03T09:20:08.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:20:08.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:20:08.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:20:08.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:20:08.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:20:08.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:20:08.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:20:12, diff=-3.855108s, valid=True
2026-06-03T09:20:08.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:20:08.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:20:08.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:20:08.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45405.145706s, valid=False
2026-06-03T09:20:08.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:20:08.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:20:08.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:20:08.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:20:08.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:20:08.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:20:08.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:20:08.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:20:08.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:20:08.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:20:08.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:20:08.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:20:08.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:20:08.464 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:20:08.751 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:20:09.092 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:20:09.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:20:09.196 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:20:09.196 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:20:09.268 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:20:09.268 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:20:39.279 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:20:39.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:20:39.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:20:39.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:20:39.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:20:39.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:20:39.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:20:39.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:20:39.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:20:39.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:20:39.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:20:39.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:20:39.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:20:42.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:20:42.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:20:42.362 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:20:42.362 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:20:42.371 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:20:42.383 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:20:42.383 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:20:42.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:20:42.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:20:42.384 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:20:42.384 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:20:42.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:20:42.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:20:42.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:20:42.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:20:42.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:20:42.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:20:42.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:20:42.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:20:42.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:20:42.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:20:42.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:20:42.665 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:20:42.739 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:20:29
2026-06-03T09:20:42.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85653, datetime.datetime(2026, 6, 3, 9, 20, 29), datetime.datetime(2026, 6, 3, 9, 20, 28), 'salt', 6.81, 99.02, None, 37.68, 94.78, 0.13, 824.15, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:20:42.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:20:42.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:20:42.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:20:28, diff=14.746554s, valid=True
2026-06-03T09:20:42.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:20:42.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:20:42.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:20:12, diff=30.749856s, valid=True
2026-06-03T09:20:42.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:20:42.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:20:42.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:20:22, diff=20.757682s, valid=True
2026-06-03T09:20:42.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:20:42.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:20:42.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:20:42.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:20:42.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:20:42.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:20:42.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:20:12, diff=30.761223s, valid=True
2026-06-03T09:20:42.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:20:42.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:20:42.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:20:42.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45439.761995s, valid=False
2026-06-03T09:20:42.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:20:42.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:20:42.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:20:42.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:20:42.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:20:42.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:20:42.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:20:42.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:20:42.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:20:42.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:20:42.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:20:42.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:20:43.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:20:43.083 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:20:43.297 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:20:43.647 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:20:43.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:20:43.748 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:20:43.748 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:20:43.907 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:20:43.907 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:21:13.937 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:21:13.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:21:13.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:21:14.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:21:14.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:21:14.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:21:14.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:21:14.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:21:14.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:21:14.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:21:14.507 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:21:14.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:21:14.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:21:17.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:21:17.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:21:17.179 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:21:17.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:21:17.189 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:21:17.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:21:17.202 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:21:17.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:21:17.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:21:17.203 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:21:17.203 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:21:17.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:21:17.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:21:17.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:21:17.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:21:17.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:21:17.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:21:17.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:21:17.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:21:17.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:21:17.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:21:17.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:21:17.545 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:21:17.618 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:20:59
2026-06-03T09:21:17.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85654, datetime.datetime(2026, 6, 3, 9, 20, 59), datetime.datetime(2026, 6, 3, 9, 20, 59), 'salt', 6.88, 98.99, None, 36.31, 89.83, 0.14, 824.28, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:21:17.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:21:17.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:21:17.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:20:59, diff=18.626037s, valid=True
2026-06-03T09:21:17.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:21:17.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:21:17.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:21:12, diff=5.629549s, valid=True
2026-06-03T09:21:17.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:21:17.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:21:17.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:20:52, diff=25.637774s, valid=True
2026-06-03T09:21:17.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:21:17.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:21:17.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:21:17.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:21:17.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:21:17.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:21:17.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:21:12, diff=5.64152s, valid=True
2026-06-03T09:21:17.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:21:17.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:21:17.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:21:17.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45474.642342s, valid=False
2026-06-03T09:21:17.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:21:17.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:21:17.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:21:17.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:21:17.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:21:17.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:21:17.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:21:17.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:21:17.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:21:17.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:21:17.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:21:17.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:21:17.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:21:18.034 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:21:18.250 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:21:18.595 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:21:18.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:21:18.699 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:21:18.699 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:21:18.939 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:21:18.939 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:21:48.968 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:21:48.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:21:48.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:21:49.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:21:49.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:21:49.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:21:49.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:21:49.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:21:49.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:21:49.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:21:49.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:21:49.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:21:49.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:21:51.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:21:51.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:21:51.933 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:21:51.934 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:21:51.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:21:51.955 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:21:51.956 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:21:51.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:21:51.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:21:51.957 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:21:51.957 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:21:51.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:21:52.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:21:52.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:21:52.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:21:52.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:21:52.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:21:52.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:21:52.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:21:52.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:21:52.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:21:52.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:21:52.306 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:21:52.376 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:21:29
2026-06-03T09:21:52.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85655, datetime.datetime(2026, 6, 3, 9, 21, 29), datetime.datetime(2026, 6, 3, 9, 21, 29), 'salt', 6.88, 98.96, None, 38.42, 99.39, 0.15, 824.09, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:21:52.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:21:52.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:21:52.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:21:29, diff=23.38334s, valid=True
2026-06-03T09:21:52.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:21:52.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:21:52.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:21:12, diff=40.386388s, valid=True
2026-06-03T09:21:52.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:21:52.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:21:52.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:21:22, diff=30.39387s, valid=True
2026-06-03T09:21:52.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:21:52.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:21:52.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:21:52.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:21:52.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:21:52.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:21:52.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:21:12, diff=40.397719s, valid=True
2026-06-03T09:21:52.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:21:52.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:21:52.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:21:52.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45509.398516s, valid=False
2026-06-03T09:21:52.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:21:52.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:21:52.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:21:52.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:21:52.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:21:52.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:21:52.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:21:52.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:21:52.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:21:52.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:21:52.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:21:52.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:21:52.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:21:52.721 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:21:52.947 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:21:53.313 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:21:53.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:21:53.418 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:21:53.418 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:21:53.642 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:21:53.642 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:22:23.645 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:22:23.645 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:22:23.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:22:23.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:22:23.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:22:24.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:22:24.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:22:24.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:22:24.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:22:24.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:22:24.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:22:24.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:22:24.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:22:26.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:22:26.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:22:26.743 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:22:26.744 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:22:26.754 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:22:26.766 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:22:26.767 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:22:26.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:22:26.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:22:26.768 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:22:26.768 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:22:26.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:22:26.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:22:26.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:22:26.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:22:26.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:22:27.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:22:27.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:22:27.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:22:27.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:22:27.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:22:27.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:22:27.075 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:22:27.147 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:22:00
2026-06-03T09:22:27.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85656, datetime.datetime(2026, 6, 3, 9, 22), datetime.datetime(2026, 6, 3, 9, 21, 59), 'salt', 6.91, 98.99, None, 46.4, 103.35, 0.14, 824.15, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T09:22:27.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:22:27.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:22:27.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:21:59, diff=28.154612s, valid=True
2026-06-03T09:22:27.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:22:27.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:22:27.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:22:12, diff=15.157898s, valid=True
2026-06-03T09:22:27.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:22:27.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:22:27.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:21:54, diff=33.165651s, valid=True
2026-06-03T09:22:27.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:22:27.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:22:27.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:22:27.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:22:27.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:22:27.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:22:27.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:22:12, diff=15.169171s, valid=True
2026-06-03T09:22:27.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:22:27.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:22:27.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:22:27.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45544.169933s, valid=False
2026-06-03T09:22:27.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:22:27.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:22:27.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:22:27.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:22:27.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:22:27.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:22:27.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:22:27.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:22:27.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:22:27.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:22:27.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:22:27.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:22:27.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:22:27.555 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:22:27.768 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:22:28.116 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:22:28.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:22:28.218 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:22:28.219 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:22:28.482 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:22:28.482 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:22:58.512 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:22:58.513 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:22:58.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:22:58.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:22:58.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:22:58.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:22:58.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:22:58.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:22:58.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:22:58.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:22:58.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:22:58.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:22:58.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:23:01.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:23:01.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:23:01.476 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:23:01.477 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:23:01.486 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:23:01.499 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:23:01.500 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:23:01.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:23:01.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:23:01.501 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:23:01.501 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:23:01.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:23:01.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:23:01.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:23:01.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:23:01.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:23:01.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:23:01.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:23:01.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:23:01.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:23:01.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:23:01.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:23:01.845 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:23:01.915 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:23:01
2026-06-03T09:23:01.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85658, datetime.datetime(2026, 6, 3, 9, 23, 1), datetime.datetime(2026, 6, 3, 9, 23), 'salt', 6.88, 98.99, None, 44.63, 101.19, 0.14, 823.97, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:23:01.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:23:01.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:23:01.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:23:00, diff=1.923188s, valid=True
2026-06-03T09:23:01.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:23:01.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:23:01.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:23:12, diff=-10.073329s, valid=True
2026-06-03T09:23:01.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:23:01.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:23:01.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:22:57, diff=4.934794s, valid=True
2026-06-03T09:23:01.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:23:01.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:23:01.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:23:01.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:23:01.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:23:01.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:23:01.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:23:12, diff=-10.061473s, valid=True
2026-06-03T09:23:01.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:23:01.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:23:01.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:23:01.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45578.939351s, valid=False
2026-06-03T09:23:01.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:23:01.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:23:01.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:23:01.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:23:01.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:23:02.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:23:02.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:23:02.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:23:02.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:23:02.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:23:02.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:23:02.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:23:02.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:23:02.262 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:23:02.494 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:23:02.840 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:23:02.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:23:02.943 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:23:02.943 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:23:03.115 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:23:03.115 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:23:33.143 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:23:33.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:23:33.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:23:33.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:23:33.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:23:33.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:23:33.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:23:33.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:23:33.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:23:33.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:23:33.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:23:33.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:23:33.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:23:36.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:23:36.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:23:36.659 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:23:36.659 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:23:36.669 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:23:36.681 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:23:36.682 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:23:36.682 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:23:36.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:23:36.683 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:23:36.683 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:23:36.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:23:36.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:23:36.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:23:36.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:23:36.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:23:36.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:23:36.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:23:37.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T09:23:37.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:23:37.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:23:37.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:23:37.010 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:23:37.080 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:23:31
2026-06-03T09:23:37.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85659, datetime.datetime(2026, 6, 3, 9, 23, 31), datetime.datetime(2026, 6, 3, 9, 23, 31), 'salt', 6.85, 99.02, None, 37.05, 104.08, 0.14, 823.97, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:23:37.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:23:37.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:23:37.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:23:31, diff=6.086306s, valid=True
2026-06-03T09:23:37.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:23:37.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:23:37.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:23:12, diff=25.089183s, valid=True
2026-06-03T09:23:37.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:23:37.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:23:37.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:23:28, diff=9.095818s, valid=True
2026-06-03T09:23:37.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:23:37.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:23:37.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:23:37.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:23:37.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:23:37.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T09:23:37.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:23:12, diff=25.098876s, valid=True
2026-06-03T09:23:37.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:23:37.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:23:37.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:23:37.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45614.099518s, valid=False
2026-06-03T09:23:37.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:23:37.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:23:37.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:23:37.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:23:37.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:23:37.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:23:37.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:23:37.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:23:37.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:23:37.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:23:37.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:23:37.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:23:37.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:23:37.415 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:23:37.649 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:23:38.005 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:23:38.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:23:38.108 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:23:38.108 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:23:38.566 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:23:38.566 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:24:08.580 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:24:08.580 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:24:08.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:24:08.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:24:08.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:24:08.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:24:08.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:24:08.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:24:08.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:24:08.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:24:08.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:24:09.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:24:09.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:24:11.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:24:11.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:24:11.566 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:24:11.567 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:24:11.577 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:24:11.589 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:24:11.590 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:24:11.591 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:24:11.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:24:11.591 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:24:11.591 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:24:11.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:24:11.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:24:11.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:24:11.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:24:11.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:24:11.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:24:11.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:24:11.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:24:11.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:24:11.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:24:11.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:24:11.926 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:24:11.994 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:24:02
2026-06-03T09:24:11.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85660, datetime.datetime(2026, 6, 3, 9, 24, 2), datetime.datetime(2026, 6, 3, 9, 24), 'salt', 6.81, 98.96, None, 42.69, 95.16, 0.14, 824.21, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:24:11.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:24:11.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:24:12.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:24:00, diff=12.001967s, valid=True
2026-06-03T09:24:12.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:24:12.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:24:12.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:23:12, diff=60.005343s, valid=True
2026-06-03T09:24:12.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:24:12.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:24:12.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:23:59, diff=13.013339s, valid=True
2026-06-03T09:24:12.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:24:12.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:24:12.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:24:12.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:24:12.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:24:12.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:24:12.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:23:12, diff=60.01699s, valid=True
2026-06-03T09:24:12.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:24:12.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:24:12.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:24:12.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45649.017793s, valid=False
2026-06-03T09:24:12.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:24:12.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:24:12.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:24:12.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:24:12.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:24:12.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:24:12.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:24:12.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:24:12.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:24:12.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:24:12.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:24:12.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:24:12.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:24:12.337 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:24:12.551 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:24:12.955 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:24:13.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:24:13.056 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:24:13.057 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:24:13.224 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:24:13.224 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:24:43.254 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:24:43.254 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:24:43.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:24:43.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:24:43.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:24:43.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:24:43.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:24:43.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:24:43.666 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:24:43.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:24:43.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:24:43.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:24:43.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:24:46.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:24:46.330 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:24:46.331 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:24:46.332 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:24:46.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:24:46.357 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:24:46.357 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:24:46.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:24:46.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:24:46.358 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:24:46.359 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:24:46.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:24:46.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:24:46.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:24:46.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:24:46.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:24:46.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:24:46.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:24:46.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T09:24:46.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:24:46.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:24:46.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:24:46.691 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:24:46.760 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:24:32
2026-06-03T09:24:46.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85661, datetime.datetime(2026, 6, 3, 9, 24, 32), datetime.datetime(2026, 6, 3, 9, 24, 31), 'salt', 6.85, 99.06, None, 45.23, 98.63, 0.14, 824.09, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T09:24:46.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:24:46.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:24:46.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:24:31, diff=15.768202s, valid=True
2026-06-03T09:24:46.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:24:46.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:24:46.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:23:12, diff=94.77172s, valid=True
2026-06-03T09:24:46.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:24:46.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:24:46.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:24:31, diff=15.779897s, valid=True
2026-06-03T09:24:46.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:24:46.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:24:46.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:24:46.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:24:46.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:24:46.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T09:24:46.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:23:12, diff=94.783641s, valid=True
2026-06-03T09:24:46.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:24:46.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:24:46.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:24:46.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45683.784447s, valid=False
2026-06-03T09:24:46.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:24:46.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:24:46.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:24:46.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:24:46.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:24:46.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:24:46.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:24:46.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:24:46.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:24:46.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:24:46.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:24:47.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:24:47.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:24:47.105 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:24:47.321 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:24:47.668 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:24:47.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:24:47.772 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:24:47.772 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:24:48.016 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:24:48.017 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:25:18.047 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:25:18.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:25:18.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:25:18.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:25:18.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:25:18.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:25:18.428 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:25:18.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:25:18.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:25:18.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:25:18.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:25:18.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:25:18.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:25:21.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:25:21.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:25:21.139 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:25:21.139 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:25:21.149 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:25:21.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:25:21.163 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:25:21.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:25:21.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:25:21.164 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:25:21.164 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:25:21.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:25:21.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:25:21.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:25:21.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:25:21.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:25:21.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T09:25:21.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:25:21.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T09:25:21.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:25:21.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:25:21.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:25:21.500 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:25:21.567 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:25:02
2026-06-03T09:25:21.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85662, datetime.datetime(2026, 6, 3, 9, 25, 2), datetime.datetime(2026, 6, 3, 9, 25, 1), 'salt', 6.88, 98.96, None, 40.79, 107.91, 0.15, 824.21, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:25:21.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:25:21.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:25:21.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:25:01, diff=20.575168s, valid=True
2026-06-03T09:25:21.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:25:21.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T09:25:21.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:23:12, diff=129.578698s, valid=True
2026-06-03T09:25:21.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:25:21.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:25:21.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:24:54, diff=27.586998s, valid=True
2026-06-03T09:25:21.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:25:21.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:25:21.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:25:21.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:25:21.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:25:21.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T09:25:21.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:23:12, diff=129.590785s, valid=True
2026-06-03T09:25:21.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:25:21.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:25:21.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:25:21.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45718.5916s, valid=False
2026-06-03T09:25:21.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:25:21.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:25:21.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:25:21.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:25:21.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:25:21.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:25:21.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:25:21.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:25:21.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:25:21.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:25:21.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:25:21.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:25:21.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:25:21.911 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:25:22.201 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:25:22.544 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:25:22.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:25:22.647 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:25:22.648 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:25:22.840 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:25:22.840 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:25:52.854 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:25:52.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:25:52.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:25:52.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:25:53.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:25:53.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:25:53.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:25:53.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:25:53.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:25:53.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:25:53.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:25:53.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:25:53.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:25:56.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:25:56.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:25:56.015 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:25:56.016 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:25:56.027 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:25:56.040 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:25:56.040 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:25:56.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:25:56.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:25:56.042 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:25:56.042 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:25:56.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:25:56.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:25:56.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:25:56.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:25:56.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:25:56.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:25:56.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:25:56.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:25:56.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:25:56.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:25:56.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:25:56.371 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:25:56.441 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:25:32
2026-06-03T09:25:56.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85663, datetime.datetime(2026, 6, 3, 9, 25, 32), datetime.datetime(2026, 6, 3, 9, 25, 31), 'salt', 6.85, 98.99, None, 32.57, 94.74, 0.15, 824.27, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:25:56.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:25:56.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:25:56.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:25:31, diff=25.44854s, valid=True
2026-06-03T09:25:56.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:25:56.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:25:56.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:23:12, diff=164.45196s, valid=True
2026-06-03T09:25:56.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:25:56.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:25:56.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:25:25, diff=31.459891s, valid=True
2026-06-03T09:25:56.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:25:56.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:25:56.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:25:56.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:25:56.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:25:56.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:25:56.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:23:12, diff=164.463503s, valid=True
2026-06-03T09:25:56.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:25:56.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:25:56.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:25:56.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45753.4643s, valid=False
2026-06-03T09:25:56.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:25:56.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:25:56.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:25:56.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:25:56.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:25:56.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:25:56.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:25:56.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:25:56.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:25:56.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:25:56.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:25:56.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:25:56.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:25:56.783 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:25:56.998 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:25:57.341 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:25:57.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:25:57.443 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:25:57.443 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:25:57.515 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:25:57.516 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:26:27.546 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:26:27.546 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:26:27.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:26:27.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:26:27.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:26:28.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:26:28.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:26:28.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:26:28.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:26:28.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:26:28.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:26:28.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:26:28.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:26:30.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:26:30.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:26:30.712 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:26:30.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:26:30.722 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:26:30.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:26:30.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:26:30.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:26:30.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:26:30.737 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:26:30.737 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:26:30.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:26:30.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:26:30.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:26:30.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:26:30.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:26:31.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:26:31.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:26:31.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:26:31.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:26:31.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:26:31.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:26:31.091 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:26:31.179 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:26:03
2026-06-03T09:26:31.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85664, datetime.datetime(2026, 6, 3, 9, 26, 3), datetime.datetime(2026, 6, 3, 9, 26, 2), 'salt', 6.81, 98.96, None, 35.04, 93.12, 0.14, 824.27, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:26:31.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:26:31.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:26:31.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:26:02, diff=29.187667s, valid=True
2026-06-03T09:26:31.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:26:31.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:26:31.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:23:12, diff=199.191363s, valid=True
2026-06-03T09:26:31.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:26:31.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:26:31.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:25:55, diff=36.199979s, valid=True
2026-06-03T09:26:31.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:26:31.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:26:31.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:26:31.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:26:31.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:26:31.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:26:31.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:23:12, diff=199.203916s, valid=True
2026-06-03T09:26:31.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:26:31.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:26:31.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:26:31.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45788.204789s, valid=False
2026-06-03T09:26:31.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:26:31.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:26:31.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:26:31.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:26:31.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:26:31.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:26:31.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:26:31.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:26:31.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:26:31.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:26:31.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:26:31.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:26:31.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:26:31.599 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:26:31.812 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:26:32.156 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:26:32.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:26:32.258 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:26:32.258 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:26:32.331 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:26:32.332 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:27:02.332 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:27:02.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:27:02.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:27:02.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:27:02.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:27:02.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:27:02.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:27:02.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:27:02.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:27:02.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:27:02.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:27:02.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:27:02.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:27:05.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:27:05.363 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:27:05.364 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:27:05.364 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:27:05.374 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:27:05.387 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:27:05.388 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:27:05.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:27:05.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:27:05.389 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:27:05.389 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:27:05.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:27:05.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:27:05.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:27:05.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:27:05.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:27:05.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:27:05.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:27:05.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:27:05.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:27:05.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:27:05.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:27:05.720 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:27:05.789 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:27:03
2026-06-03T09:27:05.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85666, datetime.datetime(2026, 6, 3, 9, 27, 3), datetime.datetime(2026, 6, 3, 9, 27, 2), 'salt', 6.85, 99.02, None, 28.86, 105.47, 0.14, 824.46, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:27:05.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:27:05.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:27:05.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:27:02, diff=3.795563s, valid=True
2026-06-03T09:27:05.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:27:05.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:27:05.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:23:12, diff=233.798432s, valid=True
2026-06-03T09:27:05.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:27:05.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:27:05.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:26:58, diff=7.805252s, valid=True
2026-06-03T09:27:05.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:27:05.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:27:05.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:27:05.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:27:05.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:27:05.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:27:05.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:23:12, diff=233.808319s, valid=True
2026-06-03T09:27:05.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:27:05.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:27:05.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:27:05.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45822.808984s, valid=False
2026-06-03T09:27:05.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:27:05.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:27:05.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:27:05.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:27:05.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:27:05.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:27:05.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:27:05.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:27:05.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:27:05.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:27:06.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:27:06.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:27:06.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:27:06.124 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:27:06.353 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:27:06.698 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:27:06.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:27:06.800 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:27:06.800 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:27:06.968 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:27:06.968 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:27:36.971 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:27:36.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:27:36.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:27:37.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:27:37.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:27:37.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:27:37.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:27:37.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:27:37.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:27:37.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:27:37.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:27:37.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:27:37.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:27:39.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:27:39.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:27:39.978 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:27:39.978 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:27:39.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:27:40.001 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:27:40.002 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:27:40.002 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:27:40.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:27:40.002 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:27:40.002 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:27:40.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:27:40.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:27:40.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:27:40.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:27:40.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:27:40.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:27:40.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:27:40.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:27:40.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:27:40.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:27:40.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:27:40.300 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:27:40.369 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:27:33
2026-06-03T09:27:40.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85667, datetime.datetime(2026, 6, 3, 9, 27, 33), datetime.datetime(2026, 6, 3, 9, 27, 32), 'salt', 6.85, 99.12, None, 29.53, 108.21, 0.13, 824.28, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:27:40.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:27:40.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:27:40.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:27:32, diff=8.376508s, valid=True
2026-06-03T09:27:40.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:27:40.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:27:40.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:28:12, diff=-31.620196s, valid=True
2026-06-03T09:27:40.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:27:40.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:27:40.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:27:29, diff=11.387671s, valid=True
2026-06-03T09:27:40.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:27:40.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:27:40.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:27:40.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:27:40.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:27:40.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:27:40.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:28:12, diff=-31.608815s, valid=True
2026-06-03T09:27:40.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:27:40.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:27:40.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:27:40.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45857.391955s, valid=False
2026-06-03T09:27:40.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:27:40.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:27:40.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:27:40.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:27:40.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:27:40.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:27:40.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:27:40.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:27:40.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:27:40.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:27:40.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:27:40.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:27:40.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:27:40.776 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:27:40.989 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:27:41.336 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:27:41.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:27:41.438 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:27:41.438 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:27:41.510 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:27:41.511 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:28:11.540 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:28:11.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:28:11.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:28:11.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:28:11.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:28:11.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:28:11.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:28:11.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:28:11.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:28:11.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:28:11.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:28:11.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:28:11.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:28:14.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:28:14.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:28:14.546 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:28:14.547 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:28:14.557 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:28:14.570 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:28:14.570 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:28:14.571 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:28:14.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:28:14.572 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:28:14.572 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:28:14.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:28:14.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:28:14.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:28:14.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:28:14.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:28:14.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:28:14.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:28:14.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:28:14.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:28:14.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:28:14.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:28:14.892 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:28:14.972 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:28:04
2026-06-03T09:28:14.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85668, datetime.datetime(2026, 6, 3, 9, 28, 4), datetime.datetime(2026, 6, 3, 9, 28, 2), 'salt', 6.81, 99.02, None, 27.91, 104.69, 0.13, 824.15, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:28:14.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:28:14.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:28:14.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:28:02, diff=12.982457s, valid=True
2026-06-03T09:28:14.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:28:14.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:28:14.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:28:12, diff=2.98683s, valid=True
2026-06-03T09:28:14.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:28:14.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:28:14.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:28:01, diff=13.997826s, valid=True
2026-06-03T09:28:14.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:28:14.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:28:14.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:28:14.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:28:14.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:28:14.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:28:15.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:28:12, diff=3.002732s, valid=True
2026-06-03T09:28:15.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:28:15.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:28:15.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:28:15.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45892.003705s, valid=False
2026-06-03T09:28:15.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:28:15.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:28:15.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:28:15.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:28:15.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:28:15.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:28:15.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:28:15.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:28:15.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:28:15.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:28:15.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:28:15.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:28:15.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:28:15.331 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:28:15.546 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:28:15.894 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:28:15.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:28:15.997 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:28:15.998 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:28:16.156 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:28:16.156 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:28:46.186 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:28:46.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:28:46.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:28:46.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:28:46.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:28:47.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:28:47.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:28:47.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:28:47.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:28:47.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:28:47.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:28:47.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:28:47.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:28:49.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:28:49.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:28:49.725 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:28:49.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:28:49.734 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:28:49.746 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:28:49.747 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:28:49.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:28:49.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:28:49.748 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:28:49.748 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:28:49.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:28:49.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:28:49.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:28:49.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:28:49.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:28:50.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:28:50.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:28:50.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:28:50.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:28:50.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:28:50.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:28:50.058 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:28:50.129 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:28:34
2026-06-03T09:28:50.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85669, datetime.datetime(2026, 6, 3, 9, 28, 34), datetime.datetime(2026, 6, 3, 9, 28, 33), 'salt', 6.81, 99.02, None, 30.17, 102.79, 0.13, 824.21, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:28:50.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:28:50.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:28:50.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:28:33, diff=17.136983s, valid=True
2026-06-03T09:28:50.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:28:50.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:28:50.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:29:12, diff=-21.85962s, valid=True
2026-06-03T09:28:50.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:28:50.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:28:50.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:28:32, diff=18.148233s, valid=True
2026-06-03T09:28:50.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:28:50.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:28:50.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:28:50.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:28:50.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:28:50.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:28:50.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:29:12, diff=-21.847932s, valid=True
2026-06-03T09:28:50.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:28:50.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:28:50.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:28:50.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45927.153035s, valid=False
2026-06-03T09:28:50.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:28:50.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:28:50.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:28:50.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:28:50.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:28:50.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:28:50.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:28:50.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:28:50.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:28:50.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:28:50.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:28:50.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:28:50.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:28:50.474 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:28:50.687 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:28:51.032 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:28:51.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:28:51.134 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:28:51.134 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:28:51.205 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:28:51.205 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:29:21.210 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:29:21.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:29:21.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:29:21.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:29:21.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:29:21.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:29:21.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:29:21.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:29:21.606 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:29:21.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:29:21.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:29:21.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:29:21.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:29:24.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:29:24.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:29:24.798 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:29:24.798 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:29:24.808 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:29:24.821 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:29:24.821 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:29:24.822 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:29:24.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:29:24.823 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:29:24.823 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:29:24.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:29:24.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:29:24.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:29:25.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:29:25.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:29:25.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:29:25.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:29:25.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:29:25.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:29:25.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:29:25.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:29:25.156 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:29:25.228 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:29:04
2026-06-03T09:29:25.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85670, datetime.datetime(2026, 6, 3, 9, 29, 4), datetime.datetime(2026, 6, 3, 9, 29, 3), 'salt', 6.88, 99.02, None, 34.37, 104.17, 0.14, 824.28, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:29:25.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:29:25.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:29:25.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:29:03, diff=22.235818s, valid=True
2026-06-03T09:29:25.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:29:25.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:29:25.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:29:12, diff=13.239205s, valid=True
2026-06-03T09:29:25.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:29:25.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:29:25.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:29:03, diff=22.247265s, valid=True
2026-06-03T09:29:25.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:29:25.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:29:25.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:29:25.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:29:25.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:29:25.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:29:25.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:29:12, diff=13.250887s, valid=True
2026-06-03T09:29:25.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:29:25.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:29:25.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:29:25.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45962.251678s, valid=False
2026-06-03T09:29:25.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:29:25.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:29:25.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:29:25.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:29:25.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:29:25.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:29:25.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:29:25.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:29:25.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:29:25.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:29:25.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:29:25.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:29:25.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:29:25.571 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:29:25.785 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:29:26.187 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:29:26.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:29:26.288 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:29:26.288 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:29:26.506 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:29:26.506 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:29:56.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:29:56.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:29:56.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:29:56.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:29:56.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:29:56.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:29:56.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:29:56.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:29:56.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:29:56.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:29:56.940 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:29:56.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:29:56.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:29:59.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:29:59.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:29:59.631 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:29:59.632 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:29:59.642 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:29:59.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:29:59.655 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:29:59.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:29:59.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:29:59.656 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:29:59.657 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:29:59.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:29:59.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:29:59.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:29:59.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:29:59.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:29:59.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:29:59.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:29:59.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:29:59.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:29:59.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:29:59.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:29:59.982 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:30:00.058 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:29:34
2026-06-03T09:30:00.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85671, datetime.datetime(2026, 6, 3, 9, 29, 34), datetime.datetime(2026, 6, 3, 9, 29, 34), 'salt', 6.85, 98.99, None, 33.48, 113.66, 0.15, 824.22, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:30:00.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:30:00.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:30:00.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:29:34, diff=26.065297s, valid=True
2026-06-03T09:30:00.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:30:00.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:30:00.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:30:12, diff=-11.931457s, valid=True
2026-06-03T09:30:00.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:30:00.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:30:00.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:29:26, diff=34.076531s, valid=True
2026-06-03T09:30:00.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:30:00.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:30:00.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:30:00.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:30:00.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:30:00.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:30:00.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:30:12, diff=-11.919738s, valid=True
2026-06-03T09:30:00.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:30:00.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:30:00.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:30:00.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=45997.081256s, valid=False
2026-06-03T09:30:00.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:30:00.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:30:00.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:30:00.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:30:00.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:30:00.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:30:00.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:30:00.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:30:00.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:30:00.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:30:00.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:30:00.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:30:00.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:30:00.406 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:30:00.619 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:30:00.963 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:30:01.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:30:01.065 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:30:01.065 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:30:01.814 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:30:01.814 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:30:31.838 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:30:31.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:30:31.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:30:31.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:30:32.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:30:32.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:30:32.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:30:32.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:30:32.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:30:32.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:30:32.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:30:32.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:30:32.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:30:34.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:30:34.911 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:30:34.912 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:30:34.912 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:30:34.923 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:30:34.936 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:30:34.936 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:30:34.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:30:34.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:30:34.937 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:30:34.938 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:30:34.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:30:35.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:30:35.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:30:35.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:30:35.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:30:35.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:30:35.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:30:35.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:30:35.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:30:35.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:30:35.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:30:35.274 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:30:35.347 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:30:35
2026-06-03T09:30:35.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85673, datetime.datetime(2026, 6, 3, 9, 30, 35), datetime.datetime(2026, 6, 3, 9, 30, 34), 'salt', 6.81, 99.02, None, 37.08, 107.51, 0.13, 824.15, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:30:35.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:30:35.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:30:35.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:30:34, diff=1.355109s, valid=True
2026-06-03T09:30:35.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:30:35.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:30:35.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:31:12, diff=-36.641425s, valid=True
2026-06-03T09:30:35.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:30:35.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:30:35.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:30:27, diff=8.36679s, valid=True
2026-06-03T09:30:35.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:30:35.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:30:35.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:30:35.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:30:35.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:30:35.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:30:35.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:31:12, diff=-36.629461s, valid=True
2026-06-03T09:30:35.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:30:35.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:30:35.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:30:35.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46032.371359s, valid=False
2026-06-03T09:30:35.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:30:35.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:30:35.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:30:35.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:30:35.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:30:35.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:30:35.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:30:35.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:30:35.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:30:35.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:30:35.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:30:35.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:30:35.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:30:35.690 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:30:35.978 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:30:36.322 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:30:36.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:30:36.424 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:30:36.424 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:30:36.605 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:30:36.605 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:31:06.636 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:31:06.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:31:06.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:31:06.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:31:06.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:31:07.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:31:07.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:31:07.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:31:07.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:31:07.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:31:07.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:31:07.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:31:07.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:31:09.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:31:09.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:31:09.745 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:31:09.746 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:31:09.756 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:31:09.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:31:09.769 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:31:09.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:31:09.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:31:09.771 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:31:09.771 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:31:09.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:31:09.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:31:09.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:31:09.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:31:09.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:31:10.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:31:10.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:31:10.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:31:10.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:31:10.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:31:10.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:31:10.078 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:31:10.151 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:31:05
2026-06-03T09:31:10.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85674, datetime.datetime(2026, 6, 3, 9, 31, 5), datetime.datetime(2026, 6, 3, 9, 31, 4), 'salt', 6.78, 98.93, None, 31.23, 109.53, 0.15, 824.28, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:31:10.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:31:10.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:31:10.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:31:04, diff=6.158099s, valid=True
2026-06-03T09:31:10.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:31:10.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:31:10.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:31:12, diff=-1.838999s, valid=True
2026-06-03T09:31:10.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:31:10.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:31:10.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:30:59, diff=11.168312s, valid=True
2026-06-03T09:31:10.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:31:10.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:31:10.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:31:10.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:31:10.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:31:10.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:31:10.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:31:12, diff=-1.828204s, valid=True
2026-06-03T09:31:10.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:31:10.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:31:10.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:31:10.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46067.172469s, valid=False
2026-06-03T09:31:10.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:31:10.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:31:10.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:31:10.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:31:10.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:31:10.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:31:10.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:31:10.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:31:10.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:31:10.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:31:10.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:31:10.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:31:10.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:31:10.488 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:31:10.706 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:31:11.049 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:31:11.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:31:11.151 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:31:11.151 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:31:11.402 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:31:11.403 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:31:41.433 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:31:41.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:31:41.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:31:41.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:31:41.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:31:42.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:31:42.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:31:42.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:31:42.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:31:42.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:31:42.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:31:42.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:31:42.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:31:44.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:31:44.857 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:31:44.858 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:31:44.858 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:31:44.868 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:31:44.880 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:31:44.881 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:31:44.882 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:31:44.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:31:44.882 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:31:44.882 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:31:44.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:31:45.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:31:45.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:31:45.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:31:45.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:31:45.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:31:45.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:31:45.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:31:45.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:31:45.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:31:45.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:31:45.202 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:31:45.270 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:31:36
2026-06-03T09:31:45.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85675, datetime.datetime(2026, 6, 3, 9, 31, 36), datetime.datetime(2026, 6, 3, 9, 31, 35), 'salt', 6.85, 99.02, None, 34.15, 93.8, 0.14, 824.15, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:31:45.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:31:45.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:31:45.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:31:35, diff=10.277899s, valid=True
2026-06-03T09:31:45.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:31:45.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:31:45.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:32:12, diff=-26.718747s, valid=True
2026-06-03T09:31:45.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:31:45.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:31:45.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:31:30, diff=15.289312s, valid=True
2026-06-03T09:31:45.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:31:45.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:31:45.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:31:45.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:31:45.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:31:45.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:31:45.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:32:12, diff=-26.707061s, valid=True
2026-06-03T09:31:45.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:31:45.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:31:45.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:31:45.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46102.293731s, valid=False
2026-06-03T09:31:45.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:31:45.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:31:45.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:31:45.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:31:45.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:31:45.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:31:45.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:31:45.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:31:45.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:31:45.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:31:45.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:31:45.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:31:45.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:31:45.684 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:31:45.897 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:31:46.242 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:31:46.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:31:46.344 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:31:46.344 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:31:46.416 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:31:46.416 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:32:16.446 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:32:16.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:32:16.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:32:16.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:32:16.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:32:16.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:32:16.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:32:16.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:32:16.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:32:16.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:32:16.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:32:16.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:32:16.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:32:19.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:32:19.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:32:19.501 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:32:19.502 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:32:19.510 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:32:19.522 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:32:19.522 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:32:19.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:32:19.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:32:19.522 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:32:19.522 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:32:19.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:32:19.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:32:19.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:32:19.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:32:19.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:32:19.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:32:19.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:32:19.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:32:19.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:32:19.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:32:19.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:32:19.801 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:32:19.869 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:32:06
2026-06-03T09:32:19.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85676, datetime.datetime(2026, 6, 3, 9, 32, 6), datetime.datetime(2026, 6, 3, 9, 32, 5), 'salt', 6.88, 98.99, None, 39.27, 100.75, 0.14, 824.33, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:32:19.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:32:19.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:32:19.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:32:05, diff=14.875455s, valid=True
2026-06-03T09:32:19.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:32:19.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:32:19.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:32:12, diff=7.878373s, valid=True
2026-06-03T09:32:19.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:32:19.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:32:19.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:32:02, diff=17.885231s, valid=True
2026-06-03T09:32:19.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:32:19.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:32:19.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:32:19.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:32:19.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:32:19.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:32:19.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:32:12, diff=7.88838s, valid=True
2026-06-03T09:32:19.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:32:19.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:32:19.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:32:19.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46136.889056s, valid=False
2026-06-03T09:32:19.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:32:19.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:32:19.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:32:19.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:32:19.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:32:19.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:32:19.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:32:19.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:32:19.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:32:20.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:32:20.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:32:20.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:32:20.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:32:20.214 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:32:20.426 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:32:20.769 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:32:20.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:32:20.870 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:32:20.870 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:32:21.048 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:32:21.048 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:32:51.049 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:32:51.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:32:51.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:32:51.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:32:51.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:32:51.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:32:51.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:32:51.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:32:51.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:32:51.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:32:51.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:32:51.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:32:51.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:32:54.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:32:54.510 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:32:54.511 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:32:54.511 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:32:54.521 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:32:54.538 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:32:54.539 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:32:54.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:32:54.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:32:54.540 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:32:54.540 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:32:54.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:32:54.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:32:54.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:32:54.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:32:54.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:32:54.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:32:54.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:32:54.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:32:54.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:32:54.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:32:54.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:32:54.870 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:32:54.937 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:32:36
2026-06-03T09:32:54.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85677, datetime.datetime(2026, 6, 3, 9, 32, 36), datetime.datetime(2026, 6, 3, 9, 32, 35), 'salt', 6.88, 99.12, None, 45.73, 109.93, 0.12, 824.09, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T09:32:54.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:32:54.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:32:54.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:32:35, diff=19.94533s, valid=True
2026-06-03T09:32:54.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:32:54.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:32:54.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:33:12, diff=-17.051143s, valid=True
2026-06-03T09:32:54.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:32:54.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:32:54.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:32:33, diff=21.957055s, valid=True
2026-06-03T09:32:54.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:32:54.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:32:54.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:32:54.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:32:54.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:32:54.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:32:54.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:33:12, diff=-17.039275s, valid=True
2026-06-03T09:32:54.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:32:54.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:32:54.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:32:54.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46171.961516s, valid=False
2026-06-03T09:32:54.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:32:54.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:32:54.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:32:54.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:32:54.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:32:55.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:32:55.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:32:55.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:32:55.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:32:55.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:32:55.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:32:55.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:32:55.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:32:55.346 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:32:55.560 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:32:55.905 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:32:56.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:32:56.007 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:32:56.007 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:32:56.147 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:32:56.147 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:33:26.177 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:33:26.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:33:26.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:33:26.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:33:26.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:33:26.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:33:26.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:33:26.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:33:26.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:33:26.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:33:26.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:33:26.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:33:26.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:33:29.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:33:29.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:33:29.319 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:33:29.319 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:33:29.330 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:33:29.343 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:33:29.343 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:33:29.343 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:33:29.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:33:29.344 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:33:29.344 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:33:29.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:33:29.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:33:29.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:33:29.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:33:29.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:33:29.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:33:29.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:33:29.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:33:29.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:33:29.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:33:29.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:33:29.674 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:33:29.745 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:33:06
2026-06-03T09:33:29.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85678, datetime.datetime(2026, 6, 3, 9, 33, 6), datetime.datetime(2026, 6, 3, 9, 33, 6), 'salt', 6.88, 99.06, None, 46.36, 99.88, 0.13, 824.27, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T09:33:29.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:33:29.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:33:29.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:33:06, diff=23.752883s, valid=True
2026-06-03T09:33:29.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:33:29.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:33:29.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:33:12, diff=17.756448s, valid=True
2026-06-03T09:33:29.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:33:29.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:33:29.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:33:04, diff=25.7651s, valid=True
2026-06-03T09:33:29.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:33:29.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:33:29.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:33:29.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:33:29.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:33:29.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:33:29.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:33:12, diff=17.768885s, valid=True
2026-06-03T09:33:29.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:33:29.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:33:29.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:33:29.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46206.769662s, valid=False
2026-06-03T09:33:29.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:33:29.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:33:29.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:33:29.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:33:29.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:33:29.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:33:29.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:33:29.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:33:29.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:33:29.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:33:29.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:33:30.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:33:30.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:33:30.137 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:33:30.352 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:33:30.697 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:33:30.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:33:30.798 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:33:30.798 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:33:30.981 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:33:30.981 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:34:01.010 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:34:01.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:34:01.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:34:01.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:34:01.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:34:01.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:34:01.458 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:34:01.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:34:01.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:34:01.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:34:01.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:34:01.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:34:01.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:34:04.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:34:04.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:34:04.409 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:34:04.409 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:34:04.419 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:34:04.431 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:34:04.432 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:34:04.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:34:04.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:34:04.433 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:34:04.433 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:34:04.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:34:04.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:34:04.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:34:04.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:34:04.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:34:04.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:34:04.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:34:04.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:34:04.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:34:04.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:34:04.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:34:04.776 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:34:04.847 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:33:37
2026-06-03T09:34:04.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85679, datetime.datetime(2026, 6, 3, 9, 33, 37), datetime.datetime(2026, 6, 3, 9, 33, 36), 'salt', 6.91, 99.06, None, 41.99, 89.95, 0.13, 824.15, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:34:04.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:34:04.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:34:04.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:33:36, diff=28.854818s, valid=True
2026-06-03T09:34:04.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:34:04.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:34:04.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:34:12, diff=-7.14169s, valid=True
2026-06-03T09:34:04.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:34:04.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:34:04.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:33:36, diff=28.86659s, valid=True
2026-06-03T09:34:04.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:34:04.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:34:04.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:34:04.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:34:04.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:34:04.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:34:04.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:34:12, diff=-7.129728s, valid=True
2026-06-03T09:34:04.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:34:04.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:34:04.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:34:04.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46241.871072s, valid=False
2026-06-03T09:34:04.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:34:04.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:34:04.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:34:04.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:34:04.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:34:04.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:34:04.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:34:04.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:34:04.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:34:05.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:34:05.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:34:05.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:34:05.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:34:05.190 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:34:05.403 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:34:05.747 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:34:05.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:34:05.848 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:34:05.849 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:34:06.026 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:34:06.027 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:34:36.036 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:34:36.036 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:34:36.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:34:36.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:34:36.199 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:34:36.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:34:36.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:34:36.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:34:36.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:34:36.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:34:36.461 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:34:36.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:34:36.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:34:39.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:34:39.160 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:34:39.161 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:34:39.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:34:39.172 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:34:39.185 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:34:39.185 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:34:39.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:34:39.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:34:39.186 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:34:39.187 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:34:39.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:34:39.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:34:39.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:34:39.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:34:39.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:34:39.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:34:39.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:34:39.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:34:39.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:34:39.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:34:39.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:34:39.527 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:34:39.600 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:34:37
2026-06-03T09:34:39.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85681, datetime.datetime(2026, 6, 3, 9, 34, 37), datetime.datetime(2026, 6, 3, 9, 34, 36), 'salt', 6.78, 98.92, None, 34.26, 98.38, 0.15, 824.21, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:34:39.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:34:39.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:34:39.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:34:36, diff=3.607516s, valid=True
2026-06-03T09:34:39.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:34:39.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:34:39.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:35:12, diff=-32.388985s, valid=True
2026-06-03T09:34:39.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:34:39.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:34:39.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:34:29, diff=10.619224s, valid=True
2026-06-03T09:34:39.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:34:39.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:34:39.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:34:39.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:34:39.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:34:39.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:34:39.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:35:12, diff=-32.377046s, valid=True
2026-06-03T09:34:39.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:34:39.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:34:39.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:34:39.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46276.623758s, valid=False
2026-06-03T09:34:39.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:34:39.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:34:39.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:34:39.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:34:39.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:34:39.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:34:39.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:34:39.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:34:39.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:34:39.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:34:39.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:34:39.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:34:39.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:34:39.955 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:34:40.183 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:34:40.587 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:34:40.689 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:34:40.689 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:34:40.689 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:34:40.863 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:34:40.863 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:35:10.892 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:35:10.892 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:35:10.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:35:11.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:35:11.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:35:11.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:35:11.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:35:11.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:35:11.477 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:35:11.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:35:11.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:35:11.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:35:11.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:35:14.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:35:14.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:35:14.087 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:35:14.087 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:35:14.099 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:35:14.111 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:35:14.112 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:35:14.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:35:14.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:35:14.113 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:35:14.113 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:35:14.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:35:14.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:35:14.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:35:14.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:35:14.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:35:14.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:35:14.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:35:14.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:35:14.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:35:14.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:35:14.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:35:14.439 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:35:14.507 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:35:07
2026-06-03T09:35:14.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85682, datetime.datetime(2026, 6, 3, 9, 35, 7), datetime.datetime(2026, 6, 3, 9, 35, 7), 'salt', 6.88, 99.02, None, 39.76, 102.86, 0.14, 824.21, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:35:14.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:35:14.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:35:14.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:35:07, diff=7.515131s, valid=True
2026-06-03T09:35:14.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:35:14.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:35:14.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:35:12, diff=2.518614s, valid=True
2026-06-03T09:35:14.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:35:14.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:35:14.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:35:00, diff=14.526696s, valid=True
2026-06-03T09:35:14.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:35:14.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:35:14.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:35:14.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:35:14.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:35:14.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:35:14.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:35:12, diff=2.530424s, valid=True
2026-06-03T09:35:14.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:35:14.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:35:14.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:35:14.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46311.531249s, valid=False
2026-06-03T09:35:14.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:35:14.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:35:14.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:35:14.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:35:14.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:35:14.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:35:14.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:35:14.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:35:14.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:35:14.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:35:14.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:35:14.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:35:14.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:35:14.851 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:35:15.064 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:35:15.408 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:35:15.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:35:15.509 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:35:15.510 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:35:18.001 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:35:18.001 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:35:48.029 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:35:48.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:35:48.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:35:48.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:35:48.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:35:48.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:35:48.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:35:48.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:35:48.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:35:48.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:35:48.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:35:48.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:35:48.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:35:51.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:35:51.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:35:51.479 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:35:51.479 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:35:51.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:35:51.500 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:35:51.500 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:35:51.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:35:51.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:35:51.501 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:35:51.501 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:35:51.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:35:51.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:35:51.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:35:51.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:35:51.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:35:51.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:35:51.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:35:51.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:35:51.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:35:51.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:35:51.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:35:51.773 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:35:51.841 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:35:38
2026-06-03T09:35:51.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85683, datetime.datetime(2026, 6, 3, 9, 35, 38), datetime.datetime(2026, 6, 3, 9, 35, 36), 'salt', 6.85, 99.09, None, 38.07, 102.04, 0.13, 824.4, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:35:51.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:35:51.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:35:51.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:35:36, diff=15.848321s, valid=True
2026-06-03T09:35:51.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:35:51.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:35:51.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:36:12, diff=-20.148545s, valid=True
2026-06-03T09:35:51.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:35:51.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:35:51.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:35:32, diff=19.858734s, valid=True
2026-06-03T09:35:51.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:35:51.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:35:51.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:35:51.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:35:51.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:35:51.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:35:51.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:36:12, diff=-20.137951s, valid=True
2026-06-03T09:35:51.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:35:51.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:35:51.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:35:51.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46348.862772s, valid=False
2026-06-03T09:35:51.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:35:51.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:35:51.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:35:51.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:35:51.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:35:51.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:35:51.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:35:51.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:35:51.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:35:52.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:35:52.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:35:52.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:35:52.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:35:52.618 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:35:52.906 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:35:53.253 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:35:53.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:35:53.356 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:35:53.356 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:35:53.822 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:35:53.822 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:36:23.852 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:36:23.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:36:23.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:36:24.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:36:24.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:36:24.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:36:24.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:36:24.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:36:24.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:36:24.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:36:24.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:36:24.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:36:24.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:36:27.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:36:27.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:36:27.117 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:36:27.117 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:36:27.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:36:27.141 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:36:27.141 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:36:27.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:36:27.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:36:27.141 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:36:27.142 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:36:27.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:36:27.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:36:27.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:36:27.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:36:27.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:36:27.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:36:27.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:36:27.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:36:27.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:36:27.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:36:27.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:36:27.481 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:36:27.562 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:36:08
2026-06-03T09:36:27.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85684, datetime.datetime(2026, 6, 3, 9, 36, 8), datetime.datetime(2026, 6, 3, 9, 36, 7), 'salt', 6.85, 99.02, None, 29.57, 99.55, 0.14, 824.45, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:36:27.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:36:27.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:36:27.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:36:07, diff=20.569236s, valid=True
2026-06-03T09:36:27.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:36:27.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:36:27.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:36:12, diff=15.572713s, valid=True
2026-06-03T09:36:27.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:36:27.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:36:27.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:36:03, diff=24.580938s, valid=True
2026-06-03T09:36:27.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:36:27.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:36:27.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:36:27.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:36:27.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:36:27.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:36:27.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:36:12, diff=15.584633s, valid=True
2026-06-03T09:36:27.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:36:27.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:36:27.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:36:27.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46384.585436s, valid=False
2026-06-03T09:36:27.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:36:27.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:36:27.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:36:27.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:36:27.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:36:27.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:36:27.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:36:27.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:36:27.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:36:27.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:36:27.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:36:27.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:36:27.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:36:27.908 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:36:28.139 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:36:28.483 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:36:28.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:36:28.586 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:36:28.586 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:36:28.658 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:36:28.658 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:36:58.688 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:36:58.689 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:36:58.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:36:58.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:36:58.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:36:59.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:36:59.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:36:59.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:36:59.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:36:59.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:36:59.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:36:59.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:36:59.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:37:01.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:37:01.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:37:01.871 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:37:01.871 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:37:01.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:37:01.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:37:01.894 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:37:01.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:37:01.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:37:01.895 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:37:01.896 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:37:01.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:37:02.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:37:02.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:37:02.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:37:02.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:37:02.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:37:02.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:37:02.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:37:02.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:37:02.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:37:02.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:37:02.239 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:37:02.310 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:36:38
2026-06-03T09:37:02.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85685, datetime.datetime(2026, 6, 3, 9, 36, 38), datetime.datetime(2026, 6, 3, 9, 36, 37), 'salt', 6.91, 99.12, None, 28.3, 98.02, 0.12, 824.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:37:02.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:37:02.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:37:02.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:36:37, diff=25.317103s, valid=True
2026-06-03T09:37:02.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:37:02.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:37:02.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:37:12, diff=-9.679504s, valid=True
2026-06-03T09:37:02.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:37:02.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:37:02.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:36:35, diff=27.328447s, valid=True
2026-06-03T09:37:02.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:37:02.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:37:02.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:37:02.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:37:02.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:37:02.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:37:02.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:37:12, diff=-9.667899s, valid=True
2026-06-03T09:37:02.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:37:02.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:37:02.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:37:02.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46419.332895s, valid=False
2026-06-03T09:37:02.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:37:02.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:37:02.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:37:02.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:37:02.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:37:02.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:37:02.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:37:02.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:37:02.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:37:02.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:37:02.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:37:02.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:37:02.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:37:02.723 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:37:02.926 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:37:03.263 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:37:03.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:37:03.363 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:37:03.363 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:37:03.515 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:37:03.515 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:37:33.538 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:37:33.538 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:37:33.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:37:33.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:37:33.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:37:34.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:37:34.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:37:34.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:37:34.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:37:34.132 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:37:34.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:37:34.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:37:34.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:37:36.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:37:36.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:37:36.797 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:37:36.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:37:36.807 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:37:36.820 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:37:36.821 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:37:36.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:37:36.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:37:36.822 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:37:36.822 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:37:36.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:37:36.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:37:36.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:37:37.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:37:37.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:37:37.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:37:37.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:37:37.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:37:37.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:37:37.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:37:37.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:37:37.108 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:37:37.177 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:37:08
2026-06-03T09:37:37.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85686, datetime.datetime(2026, 6, 3, 9, 37, 8), datetime.datetime(2026, 6, 3, 9, 37, 8), 'salt', 6.85, 99.06, None, 29.25, 110.09, 0.14, 824.27, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:37:37.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:37:37.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:37:37.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:37:08, diff=29.183724s, valid=True
2026-06-03T09:37:37.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:37:37.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:37:37.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:37:12, diff=25.186539s, valid=True
2026-06-03T09:37:37.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:37:37.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:37:37.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:37:06, diff=31.193281s, valid=True
2026-06-03T09:37:37.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:37:37.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:37:37.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:37:37.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:37:37.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:37:37.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:37:37.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:37:12, diff=25.19631s, valid=True
2026-06-03T09:37:37.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:37:37.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:37:37.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:37:37.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46454.19696s, valid=False
2026-06-03T09:37:37.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:37:37.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:37:37.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:37:37.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:37:37.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:37:37.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:37:37.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:37:37.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:37:37.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:37:37.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:37:37.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:37:37.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:37:37.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:37:37.526 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:37:37.734 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:37:38.074 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:37:38.173 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:37:38.174 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:37:38.174 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:37:38.247 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:37:38.247 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:38:08.262 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:38:08.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:38:08.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:38:08.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:38:08.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:38:08.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:38:08.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:38:08.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:38:08.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:38:08.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:38:08.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:38:08.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:38:08.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:38:11.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:38:11.538 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:38:11.539 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:38:11.539 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:38:11.549 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:38:11.562 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:38:11.563 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:38:11.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:38:11.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:38:11.564 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:38:11.564 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:38:11.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:38:11.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:38:11.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:38:11.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:38:11.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:38:11.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:38:11.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:38:11.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:38:11.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:38:11.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:38:11.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:38:11.906 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:38:11.983 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:38:09
2026-06-03T09:38:11.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85688, datetime.datetime(2026, 6, 3, 9, 38, 9), datetime.datetime(2026, 6, 3, 9, 38, 8), 'salt', 6.78, 98.99, None, 34.05, 104.08, 0.14, 824.33, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:38:11.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:38:11.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:38:11.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:38:08, diff=3.991148s, valid=True
2026-06-03T09:38:11.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:38:11.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:38:11.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:38:12, diff=-0.005145s, valid=True
2026-06-03T09:38:11.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:38:11.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:38:12.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:38:09, diff=3.003376s, valid=True
2026-06-03T09:38:12.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:38:12.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:38:12.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:38:12.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:38:12.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:38:12.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:38:12.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:38:12, diff=0.007134s, valid=True
2026-06-03T09:38:12.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:38:12.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:38:12.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:38:12.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46489.007944s, valid=False
2026-06-03T09:38:12.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:38:12.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:38:12.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:38:12.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:38:12.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:38:12.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:38:12.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:38:12.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:38:12.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:38:12.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:38:12.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:38:12.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:38:12.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:38:12.397 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:38:12.601 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:38:12.939 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:38:13.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:38:13.039 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:38:13.039 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:38:13.231 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:38:13.231 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:38:43.250 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:38:43.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:38:43.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:38:43.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:38:43.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:38:44.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:38:44.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:38:44.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:38:44.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:38:44.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:38:44.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:38:44.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:38:44.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:38:46.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:38:46.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:38:46.845 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:38:46.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:38:46.854 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:38:46.867 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:38:46.867 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:38:46.868 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:38:46.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:38:46.868 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:38:46.869 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:38:46.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:38:47.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:38:47.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:38:47.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:38:47.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:38:47.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:38:47.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:38:47.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:38:47.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:38:47.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:38:47.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:38:47.212 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:38:47.294 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:38:39
2026-06-03T09:38:47.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85689, datetime.datetime(2026, 6, 3, 9, 38, 39), datetime.datetime(2026, 6, 3, 9, 38, 38), 'salt', 6.95, 99.16, None, 37.29, 102.81, 0.12, 824.27, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:38:47.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:38:47.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:38:47.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:38:38, diff=9.30156s, valid=True
2026-06-03T09:38:47.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:38:47.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:38:47.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:39:12, diff=-24.694955s, valid=True
2026-06-03T09:38:47.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:38:47.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:38:47.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:38:31, diff=16.313354s, valid=True
2026-06-03T09:38:47.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:38:47.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:38:47.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:38:47.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:38:47.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:38:47.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:38:47.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:39:12, diff=-24.682897s, valid=True
2026-06-03T09:38:47.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:38:47.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:38:47.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:38:47.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46524.317928s, valid=False
2026-06-03T09:38:47.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:38:47.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:38:47.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:38:47.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:38:47.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:38:47.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:38:47.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:38:47.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:38:47.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:38:47.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:38:47.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:38:47.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:38:47.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:38:47.636 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:38:47.840 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:38:48.182 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:38:48.282 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:38:48.282 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:38:48.282 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:38:48.521 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:38:48.521 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:39:18.551 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:39:18.551 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:39:18.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:39:18.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:39:18.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:39:18.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:39:18.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:39:18.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:39:18.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:39:18.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:39:18.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:39:18.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:39:18.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:39:21.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:39:21.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:39:21.551 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:39:21.551 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:39:21.562 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:39:21.575 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:39:21.576 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:39:21.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:39:21.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:39:21.577 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:39:21.577 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:39:21.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:39:21.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:39:21.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:39:21.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:39:21.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:39:21.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:39:21.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:39:21.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:39:21.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:39:21.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:39:21.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:39:21.953 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:39:22.022 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:39:09
2026-06-03T09:39:22.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85690, datetime.datetime(2026, 6, 3, 9, 39, 9), datetime.datetime(2026, 6, 3, 9, 39, 9), 'salt', 6.88, 99.12, None, 40.51, 93.49, 0.12, 824.27, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:39:22.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:39:22.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:39:22.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:39:09, diff=13.028833s, valid=True
2026-06-03T09:39:22.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:39:22.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:39:22.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:39:12, diff=10.031811s, valid=True
2026-06-03T09:39:22.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:39:22.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:39:22.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:39:02, diff=20.038738s, valid=True
2026-06-03T09:39:22.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:39:22.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:39:22.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:39:22.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:39:22.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:39:22.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:39:22.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:39:12, diff=10.041888s, valid=True
2026-06-03T09:39:22.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:39:22.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:39:22.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:39:22.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46559.042574s, valid=False
2026-06-03T09:39:22.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:39:22.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:39:22.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:39:22.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:39:22.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:39:22.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:39:22.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:39:22.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:39:22.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:39:22.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:39:22.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:39:22.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:39:22.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:39:22.355 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:39:22.560 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:39:22.895 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:39:22.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:39:22.996 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:39:22.997 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:39:23.159 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:39:23.160 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:39:53.190 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:39:53.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:39:53.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:39:53.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:39:53.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:39:53.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:39:53.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:39:53.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:39:53.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:39:53.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:39:53.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:39:53.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:39:53.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:39:56.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:39:56.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:39:56.640 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:39:56.641 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:39:56.650 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:39:56.663 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:39:56.664 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:39:56.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:39:56.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:39:56.665 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:39:56.665 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:39:56.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:39:56.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:39:56.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:39:56.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:39:56.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:39:56.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:39:56.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:39:56.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:39:56.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:39:56.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:39:57.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:39:57.000 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:39:57.071 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:39:40
2026-06-03T09:39:57.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85691, datetime.datetime(2026, 6, 3, 9, 39, 40), datetime.datetime(2026, 6, 3, 9, 39, 38), 'salt', 6.91, 99.16, None, 37.86, 103.0, 0.12, 824.46, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:39:57.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:39:57.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:39:57.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:39:38, diff=19.077997s, valid=True
2026-06-03T09:39:57.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:39:57.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:39:57.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:40:12, diff=-14.919146s, valid=True
2026-06-03T09:39:57.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:39:57.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:39:57.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:39:32, diff=25.087483s, valid=True
2026-06-03T09:39:57.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:39:57.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:39:57.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:39:57.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:39:57.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:39:57.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:39:57.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:40:12, diff=-14.909467s, valid=True
2026-06-03T09:39:57.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:39:57.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:39:57.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:39:57.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46594.091222s, valid=False
2026-06-03T09:39:57.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:39:57.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:39:57.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:39:57.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:39:57.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:39:57.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:39:57.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:39:57.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:39:57.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:39:57.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:39:57.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:39:57.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:39:57.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:39:57.411 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:39:57.636 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:39:57.974 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:39:58.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:39:58.131 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:39:58.131 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:39:58.372 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:39:58.372 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:40:28.380 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:40:28.380 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:40:28.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:40:28.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:40:28.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:40:28.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:40:28.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:40:28.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:40:28.744 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:40:28.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:40:28.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:40:28.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:40:28.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:40:31.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:40:31.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:40:31.627 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:40:31.628 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:40:31.637 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:40:31.650 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:40:31.651 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:40:31.652 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:40:31.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:40:31.652 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:40:31.652 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:40:31.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:40:31.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:40:31.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:40:31.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:40:31.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:40:31.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:40:31.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:40:31.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:40:31.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:40:31.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:40:31.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:40:31.986 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:40:32.056 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:40:10
2026-06-03T09:40:32.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85692, datetime.datetime(2026, 6, 3, 9, 40, 10), datetime.datetime(2026, 6, 3, 9, 40, 9), 'salt', 6.91, 99.12, None, 45.87, 81.87, 0.12, 824.27, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T09:40:32.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:40:32.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:40:32.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:40:09, diff=23.063394s, valid=True
2026-06-03T09:40:32.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:40:32.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:40:32.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:40:12, diff=20.066819s, valid=True
2026-06-03T09:40:32.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:40:32.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:40:32.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:40:04, diff=28.074723s, valid=True
2026-06-03T09:40:32.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:40:32.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:40:32.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:40:32.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:40:32.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:40:32.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:40:32.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:40:12, diff=20.07834s, valid=True
2026-06-03T09:40:32.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:40:32.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:40:32.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:40:32.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46629.079129s, valid=False
2026-06-03T09:40:32.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:40:32.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:40:32.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:40:32.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:40:32.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:40:32.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:40:32.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:40:32.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:40:32.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:40:32.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:40:32.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:40:32.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:40:32.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:40:32.397 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:40:32.601 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:40:32.936 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:40:33.036 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:40:33.036 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:40:33.036 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:40:33.179 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:40:33.179 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:41:03.206 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:41:03.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:41:03.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:41:03.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:41:03.534 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:41:03.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:41:03.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:41:03.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:41:03.795 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:41:03.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:41:03.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:41:03.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:41:03.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:41:06.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:41:06.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:41:06.358 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:41:06.359 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:41:06.368 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:41:06.380 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:41:06.381 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:41:06.381 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:41:06.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:41:06.382 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:41:06.382 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:41:06.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:41:06.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:41:06.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:41:06.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:41:06.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:41:06.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:41:06.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:41:06.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:41:06.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:41:06.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:41:06.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:41:06.718 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:41:06.788 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:40:40
2026-06-03T09:41:06.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85693, datetime.datetime(2026, 6, 3, 9, 40, 40), datetime.datetime(2026, 6, 3, 9, 40, 39), 'salt', 6.85, 99.06, None, 44.53, 93.09, 0.14, 824.52, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:41:06.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:41:06.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:41:06.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:40:39, diff=27.795107s, valid=True
2026-06-03T09:41:06.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:41:06.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:41:06.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:41:12, diff=-5.201593s, valid=True
2026-06-03T09:41:06.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:41:06.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:41:06.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:40:35, diff=31.806166s, valid=True
2026-06-03T09:41:06.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:41:06.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:41:06.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:41:06.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:41:06.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:41:06.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:41:06.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:41:12, diff=-5.190252s, valid=True
2026-06-03T09:41:06.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:41:06.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:41:06.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:41:06.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46663.81054s, valid=False
2026-06-03T09:41:06.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:41:06.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:41:06.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:41:06.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:41:06.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:41:06.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:41:06.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:41:06.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:41:06.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:41:06.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:41:07.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:41:07.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:41:07.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:41:07.130 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:41:07.413 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:41:07.754 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:41:07.856 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:41:07.856 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:41:07.856 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:41:08.000 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:41:08.001 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:41:38.031 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:41:38.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:41:38.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:41:38.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:41:38.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:41:38.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:41:38.437 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:41:38.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:41:38.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:41:38.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:41:38.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:41:38.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:41:38.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:41:41.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:41:41.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:41:41.104 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:41:41.104 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:41:41.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:41:41.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:41:41.128 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:41:41.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:41:41.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:41:41.129 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:41:41.129 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:41:41.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:41:41.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:41:41.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:41:41.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:41:41.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:41:41.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:41:41.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:41:41.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:41:41.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:41:41.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:41:41.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:41:41.455 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:41:41.523 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:41:40
2026-06-03T09:41:41.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85695, datetime.datetime(2026, 6, 3, 9, 41, 40), datetime.datetime(2026, 6, 3, 9, 41, 39), 'salt', 6.91, 99.09, None, 37.15, 88.73, 0.13, 824.46, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:41:41.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:41:41.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:41:41.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:41:39, diff=2.530603s, valid=True
2026-06-03T09:41:41.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:41:41.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:41:41.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:42:12, diff=-30.46592s, valid=True
2026-06-03T09:41:41.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:41:41.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:41:41.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:41:38, diff=3.542201s, valid=True
2026-06-03T09:41:41.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:41:41.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:41:41.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:41:41.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:41:41.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:41:41.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:41:41.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:42:12, diff=-30.454101s, valid=True
2026-06-03T09:41:41.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:41:41.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:41:41.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:41:41.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46698.546709s, valid=False
2026-06-03T09:41:41.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:41:41.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:41:41.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:41:41.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:41:41.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:41:41.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:41:41.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:41:41.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:41:41.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:41:41.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:41:41.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:41:41.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:41:41.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:41:41.866 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:41:42.075 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:41:42.410 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:41:42.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:41:42.511 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:41:42.511 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:41:42.667 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:41:42.667 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:42:12.697 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:42:12.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:42:12.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:42:12.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:42:12.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:42:13.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:42:13.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:42:13.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:42:13.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:42:13.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:42:13.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:42:13.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:42:13.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:42:15.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:42:15.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:42:15.822 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:42:15.822 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:42:15.832 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:42:15.844 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:42:15.845 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:42:15.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:42:15.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:42:15.846 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:42:15.846 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:42:15.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:42:15.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:42:15.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:42:16.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:42:16.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:42:16.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:42:16.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:42:16.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:42:16.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:42:16.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:42:16.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:42:16.182 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:42:16.255 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:42:11
2026-06-03T09:42:16.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85696, datetime.datetime(2026, 6, 3, 9, 42, 11), datetime.datetime(2026, 6, 3, 9, 42, 10), 'salt', 6.98, 99.09, None, 38.49, 93.7, 0.13, 824.46, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:42:16.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:42:16.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:42:16.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:42:10, diff=6.262876s, valid=True
2026-06-03T09:42:16.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:42:16.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:42:16.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:42:12, diff=4.266346s, valid=True
2026-06-03T09:42:16.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:42:16.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:42:16.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:42:10, diff=6.274447s, valid=True
2026-06-03T09:42:16.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:42:16.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:42:16.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:42:16.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:42:16.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:42:16.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:42:16.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:42:12, diff=4.27815s, valid=True
2026-06-03T09:42:16.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:42:16.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:42:16.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:42:16.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46733.278953s, valid=False
2026-06-03T09:42:16.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:42:16.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:42:16.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:42:16.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:42:16.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:42:16.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:42:16.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:42:16.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:42:16.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:42:16.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:42:16.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:42:16.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:42:16.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:42:16.668 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:42:16.872 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:42:17.208 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:42:17.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:42:17.308 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:42:17.308 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:42:17.525 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:42:17.525 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:42:47.553 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:42:47.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:42:47.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:42:47.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:42:47.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:42:47.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:42:47.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:42:47.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:42:47.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:42:47.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:42:47.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:42:47.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:42:47.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:42:50.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:42:50.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:42:50.625 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:42:50.626 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:42:50.635 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:42:50.648 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:42:50.649 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:42:50.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:42:50.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:42:50.650 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:42:50.650 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:42:50.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:42:50.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:42:50.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:42:50.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:42:50.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:42:50.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:42:50.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:42:50.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:42:50.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:42:50.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:42:50.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:42:50.976 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:42:51.047 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:42:41
2026-06-03T09:42:51.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85697, datetime.datetime(2026, 6, 3, 9, 42, 41), datetime.datetime(2026, 6, 3, 9, 42, 40), 'salt', 6.91, 99.02, None, 41.46, 100.72, 0.13, 824.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:42:51.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:42:51.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:42:51.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:42:40, diff=11.059199s, valid=True
2026-06-03T09:42:51.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:42:51.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:42:51.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:43:12, diff=-20.935492s, valid=True
2026-06-03T09:42:51.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:42:51.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:42:51.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:42:33, diff=18.076286s, valid=True
2026-06-03T09:42:51.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:42:51.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:42:51.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:42:51.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:42:51.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:42:51.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:42:51.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:43:12, diff=-20.920663s, valid=True
2026-06-03T09:42:51.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:42:51.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:42:51.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:42:51.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46768.080009s, valid=False
2026-06-03T09:42:51.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:42:51.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:42:51.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:42:51.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:42:51.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:42:51.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:42:51.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:42:51.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:42:51.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:42:51.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:42:51.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:42:51.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:42:51.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:42:51.394 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:42:51.600 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:42:51.936 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:42:52.037 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:42:52.037 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:42:52.037 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:42:52.167 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:42:52.167 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:43:22.173 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:43:22.173 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:43:22.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:43:22.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:43:22.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:43:22.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:43:22.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:43:22.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:43:22.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:43:22.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:43:22.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:43:22.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:43:22.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:43:25.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:43:25.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:43:25.243 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:43:25.243 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:43:25.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:43:25.266 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:43:25.267 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:43:25.267 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:43:25.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:43:25.268 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:43:25.268 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:43:25.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:43:25.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:43:25.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:43:25.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:43:25.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:43:25.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:43:25.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:43:25.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:43:25.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:43:25.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:43:25.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:43:25.659 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:43:25.728 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:43:11
2026-06-03T09:43:25.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85698, datetime.datetime(2026, 6, 3, 9, 43, 11), datetime.datetime(2026, 6, 3, 9, 43, 10), 'salt', 6.95, 99.16, None, 34.9, 111.15, 0.12, 824.58, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:43:25.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:43:25.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:43:25.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:43:10, diff=15.734388s, valid=True
2026-06-03T09:43:25.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:43:25.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:43:25.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:43:12, diff=13.737147s, valid=True
2026-06-03T09:43:25.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:43:25.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:43:25.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:43:04, diff=21.743767s, valid=True
2026-06-03T09:43:25.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:43:25.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:43:25.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:43:25.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:43:25.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:43:25.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:43:25.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:43:12, diff=13.746715s, valid=True
2026-06-03T09:43:25.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:43:25.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:43:25.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:43:25.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46802.747356s, valid=False
2026-06-03T09:43:25.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:43:25.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:43:25.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:43:25.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:43:25.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:43:25.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:43:25.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:43:25.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:43:25.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:43:25.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:43:25.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:43:26.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:43:26.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:43:26.096 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:43:26.307 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:43:26.643 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:43:26.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:43:26.745 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:43:26.745 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:43:26.898 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:43:26.898 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:43:56.901 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:43:56.901 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:43:56.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:43:57.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:43:57.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:43:57.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:43:57.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:43:57.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:43:57.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:43:57.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:43:57.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:43:57.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:43:57.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:43:59.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:43:59.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:43:59.830 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:43:59.830 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:43:59.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:43:59.853 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:43:59.853 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:43:59.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:43:59.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:43:59.853 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:43:59.854 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:43:59.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:43:59.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:43:59.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:44:00.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:44:00.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:44:00.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:44:00.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:44:00.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:44:00.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:44:00.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:44:00.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:44:00.133 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:44:00.202 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:43:41
2026-06-03T09:44:00.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85699, datetime.datetime(2026, 6, 3, 9, 43, 41), datetime.datetime(2026, 6, 3, 9, 43, 40), 'salt', 6.91, 99.12, None, 36.87, 107.77, 0.12, 824.46, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T09:44:00.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:44:00.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:44:00.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:43:40, diff=20.209132s, valid=True
2026-06-03T09:44:00.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:44:00.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:44:00.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:44:12, diff=-11.787719s, valid=True
2026-06-03T09:44:00.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:44:00.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:44:00.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:43:34, diff=26.219631s, valid=True
2026-06-03T09:44:00.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:44:00.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:44:00.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:44:00.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:44:00.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:44:00.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:44:00.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:44:12, diff=-11.77703s, valid=True
2026-06-03T09:44:00.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:44:00.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:44:00.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:44:00.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46837.223688s, valid=False
2026-06-03T09:44:00.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:44:00.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:44:00.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:44:00.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:44:00.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:44:00.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:44:00.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:44:00.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:44:00.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:44:00.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:44:00.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:44:00.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:44:00.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:44:00.544 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:44:00.748 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:44:01.081 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:44:01.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:44:01.182 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:44:01.182 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:44:01.458 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:44:01.459 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:44:31.488 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:44:31.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:44:31.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:44:31.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:44:31.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:44:31.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:44:31.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:44:31.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:44:31.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:44:31.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:44:31.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:44:31.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:44:31.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:44:34.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:44:34.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:44:34.613 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:44:34.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:44:34.623 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:44:34.636 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:44:34.637 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:44:34.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:44:34.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:44:34.638 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:44:34.638 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:44:34.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:44:34.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:44:34.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:44:34.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:44:34.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:44:34.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:44:34.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:44:34.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:44:34.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:44:34.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:44:34.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:44:34.994 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:44:35.061 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:44:12
2026-06-03T09:44:35.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85700, datetime.datetime(2026, 6, 3, 9, 44, 12), datetime.datetime(2026, 6, 3, 9, 44, 11), 'salt', 6.81, 98.99, None, 28.9, 94.55, 0.14, 824.64, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T09:44:35.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:44:35.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:44:35.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:44:11, diff=24.069122s, valid=True
2026-06-03T09:44:35.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:44:35.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:44:35.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:44:12, diff=23.072599s, valid=True
2026-06-03T09:44:35.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:44:35.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:44:35.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:44:05, diff=30.080744s, valid=True
2026-06-03T09:44:35.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:44:35.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:44:35.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:44:35.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:44:35.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:44:35.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:44:35.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:44:12, diff=23.084511s, valid=True
2026-06-03T09:44:35.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:44:35.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:44:35.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:44:35.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46872.085339s, valid=False
2026-06-03T09:44:35.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:44:35.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:44:35.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:44:35.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:44:35.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:44:35.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:44:35.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:44:35.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:44:35.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:44:35.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:44:35.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:44:35.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:44:35.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:44:35.404 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:44:35.609 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:44:35.950 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:44:36.051 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:44:36.051 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:44:36.051 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:44:36.284 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:44:36.284 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:45:06.314 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:45:06.314 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:45:06.314 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:45:06.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:45:06.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:45:06.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:45:06.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:45:06.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:45:06.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:45:06.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:45:06.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:45:06.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:45:06.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:45:09.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:45:09.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:45:09.305 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:45:09.305 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:45:09.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:45:09.328 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:45:09.329 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:45:09.329 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:45:09.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:45:09.330 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:45:09.330 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:45:09.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:45:09.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:45:09.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:45:09.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:45:09.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:45:09.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:45:09.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:45:09.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:45:09.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:45:09.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:45:09.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:45:09.670 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:45:09.742 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:44:42
2026-06-03T09:45:09.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85701, datetime.datetime(2026, 6, 3, 9, 44, 42), datetime.datetime(2026, 6, 3, 9, 44, 41), 'salt', 6.95, 99.16, None, 30.49, 105.14, 0.12, 824.7, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T09:45:09.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:45:09.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:45:09.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:44:41, diff=28.750441s, valid=True
2026-06-03T09:45:09.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:45:09.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:45:09.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:45:12, diff=-2.245616s, valid=True
2026-06-03T09:45:09.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:45:09.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:45:09.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:44:36, diff=33.763077s, valid=True
2026-06-03T09:45:09.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:45:09.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:45:09.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:45:09.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:45:09.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:45:09.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:45:09.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:45:12, diff=-2.232724s, valid=True
2026-06-03T09:45:09.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:45:09.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:45:09.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:45:09.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46906.768073s, valid=False
2026-06-03T09:45:09.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:45:09.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:45:09.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:45:09.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:45:09.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:45:09.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:45:09.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:45:09.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:45:09.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:45:09.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:45:10.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:45:10.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:45:10.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:45:10.179 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:45:10.464 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:45:10.829 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:45:10.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:45:10.942 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:45:10.942 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:45:11.104 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:45:11.105 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:45:41.106 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:45:41.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:45:41.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:45:41.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:45:41.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:45:41.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:45:41.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:45:41.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:45:41.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:45:41.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:45:41.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:45:41.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:45:41.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:45:44.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:45:44.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:45:44.370 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:45:44.370 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:45:44.380 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:45:44.392 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:45:44.393 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:45:44.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:45:44.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:45:44.394 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:45:44.394 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:45:44.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:45:44.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:45:44.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:45:44.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:45:44.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:45:44.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:45:44.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:45:44.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:45:44.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:45:44.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:45:44.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:45:44.730 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:45:44.800 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:45:42
2026-06-03T09:45:44.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85703, datetime.datetime(2026, 6, 3, 9, 45, 42), datetime.datetime(2026, 6, 3, 9, 45, 42), 'salt', 6.88, 99.12, None, 35.71, 103.35, 0.12, 824.46, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T09:45:44.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:45:44.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:45:44.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:45:42, diff=2.806866s, valid=True
2026-06-03T09:45:44.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:45:44.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:45:44.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:46:12, diff=-27.190093s, valid=True
2026-06-03T09:45:44.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:45:44.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:45:44.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:45:39, diff=5.81676s, valid=True
2026-06-03T09:45:44.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:45:44.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:45:44.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:45:44.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:45:44.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:45:44.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:45:44.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:46:12, diff=-27.179784s, valid=True
2026-06-03T09:45:44.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:45:44.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:45:44.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:45:44.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46941.821026s, valid=False
2026-06-03T09:45:44.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:45:44.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:45:44.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:45:44.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:45:44.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:45:44.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:45:44.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:45:44.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:45:44.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:45:44.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:45:45.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:45:45.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:45:45.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:45:45.142 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:45:45.347 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:45:45.682 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:45:45.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:45:45.781 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:45:45.782 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:45:45.978 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:45:45.979 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:46:16.009 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:46:16.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:46:16.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:46:16.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:46:16.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:46:16.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:46:16.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:46:16.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:46:16.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:46:16.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:46:16.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:46:16.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:46:16.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:46:19.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:46:19.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:46:19.091 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:46:19.091 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:46:19.101 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:46:19.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:46:19.115 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:46:19.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:46:19.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:46:19.116 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:46:19.116 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:46:19.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:46:19.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:46:19.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:46:19.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:46:19.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:46:19.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:46:19.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:46:19.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:46:19.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:46:19.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:46:19.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:46:19.452 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:46:19.525 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:46:13
2026-06-03T09:46:19.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85704, datetime.datetime(2026, 6, 3, 9, 46, 13), datetime.datetime(2026, 6, 3, 9, 46, 12), 'salt', 6.88, 99.09, None, 38.21, 94.5, 0.13, 824.46, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T09:46:19.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:46:19.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:46:19.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:46:12, diff=7.532946s, valid=True
2026-06-03T09:46:19.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:46:19.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:46:19.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:46:12, diff=7.536318s, valid=True
2026-06-03T09:46:19.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:46:19.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:46:19.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:46:11, diff=8.544195s, valid=True
2026-06-03T09:46:19.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:46:19.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:46:19.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:46:19.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:46:19.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:46:19.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:46:19.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:46:12, diff=7.547804s, valid=True
2026-06-03T09:46:19.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:46:19.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:46:19.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:46:19.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=46976.548572s, valid=False
2026-06-03T09:46:19.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:46:19.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:46:19.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:46:19.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:46:19.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:46:19.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:46:19.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:46:19.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:46:19.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:46:19.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:46:19.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:46:19.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:46:19.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:46:19.957 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:46:20.176 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:46:20.510 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:46:20.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:46:20.611 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:46:20.612 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:46:20.770 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:46:20.770 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:46:50.774 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:46:50.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:46:50.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:46:50.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:46:50.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:46:51.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:46:51.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:46:51.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:46:51.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:46:51.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:46:51.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:46:51.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:46:51.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:46:53.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:46:53.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:46:53.887 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:46:53.887 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:46:53.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:46:53.909 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:46:53.910 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:46:53.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:46:53.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:46:53.911 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:46:53.911 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:46:53.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:46:54.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:46:54.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:46:54.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:46:54.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:46:54.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:46:54.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:46:54.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:46:54.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:46:54.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:46:54.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:46:54.258 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:46:54.331 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:46:43
2026-06-03T09:46:54.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85705, datetime.datetime(2026, 6, 3, 9, 46, 43), datetime.datetime(2026, 6, 3, 9, 46, 42), 'salt', 7.11, 99.46, None, 40.47, 102.86, 0.07, 824.46, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T09:46:54.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:46:54.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:46:54.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:46:42, diff=12.338787s, valid=True
2026-06-03T09:46:54.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:46:54.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:46:54.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:47:12, diff=-17.657659s, valid=True
2026-06-03T09:46:54.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:46:54.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:46:54.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:46:42, diff=12.352049s, valid=True
2026-06-03T09:46:54.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:46:54.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:46:54.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:46:54.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:46:54.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:46:54.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:46:54.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:47:12, diff=-17.643555s, valid=True
2026-06-03T09:46:54.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:46:54.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:46:54.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:46:54.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47011.357294s, valid=False
2026-06-03T09:46:54.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:46:54.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:46:54.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:46:54.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:46:54.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:46:54.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:46:54.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:46:54.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:46:54.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:46:54.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:46:54.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:46:54.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:46:54.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:46:54.678 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:46:54.882 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:46:55.219 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:46:55.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:46:55.321 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:46:55.321 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:46:55.695 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:46:55.695 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:47:25.718 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:47:25.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:47:25.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:47:26.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:47:26.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:47:26.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:47:26.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:47:26.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:47:26.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:47:26.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:47:26.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:47:26.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:47:26.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:47:28.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:47:28.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:47:28.951 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:47:28.951 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:47:28.961 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:47:28.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:47:28.976 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:47:28.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:47:28.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:47:28.977 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:47:28.977 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:47:28.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:47:29.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:47:29.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:47:29.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:47:29.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:47:29.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:47:29.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:47:29.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:47:29.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:47:29.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:47:29.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:47:29.333 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:47:29.416 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:47:13
2026-06-03T09:47:29.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85706, datetime.datetime(2026, 6, 3, 9, 47, 13), datetime.datetime(2026, 6, 3, 9, 47, 13), 'salt', 6.88, 99.12, None, 33.55, 98.33, 0.12, 824.58, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T09:47:29.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:47:29.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:47:29.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:47:13, diff=16.423528s, valid=True
2026-06-03T09:47:29.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:47:29.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:47:29.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:47:12, diff=17.427035s, valid=True
2026-06-03T09:47:29.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:47:29.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:47:29.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:47:06, diff=23.435164s, valid=True
2026-06-03T09:47:29.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:47:29.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:47:29.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:47:29.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:47:29.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:47:29.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:47:29.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:47:12, diff=17.438867s, valid=True
2026-06-03T09:47:29.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:47:29.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:47:29.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:47:29.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47046.439675s, valid=False
2026-06-03T09:47:29.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:47:29.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:47:29.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:47:29.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:47:29.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:47:29.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:47:29.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:47:29.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:47:29.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:47:29.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:47:29.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:47:29.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:47:29.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:47:29.832 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:47:30.054 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:47:30.418 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:47:30.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:47:30.526 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:47:30.526 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:47:30.759 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:47:30.760 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:48:00.760 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:48:00.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:48:00.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:48:01.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:48:01.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:48:01.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:48:01.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:48:01.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:48:01.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:48:01.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:48:01.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:48:01.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:48:01.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:48:03.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:48:03.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:48:03.930 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:48:03.930 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:48:03.940 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:48:03.946 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:48:03.946 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:48:03.947 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:48:03.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:48:03.947 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:48:03.948 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:48:03.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:48:04.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:48:04.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:48:04.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:48:04.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:48:04.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:48:04.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:48:04.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:48:04.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:48:04.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:48:04.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:48:04.282 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:48:04.354 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:47:44
2026-06-03T09:48:04.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85707, datetime.datetime(2026, 6, 3, 9, 47, 44), datetime.datetime(2026, 6, 3, 9, 47, 43), 'salt', 6.91, 99.12, None, 34.79, 102.22, 0.12, 824.52, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T09:48:04.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:48:04.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:48:04.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:47:43, diff=21.3623s, valid=True
2026-06-03T09:48:04.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:48:04.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:48:04.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:48:12, diff=-7.634167s, valid=True
2026-06-03T09:48:04.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:48:04.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:48:04.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:47:36, diff=28.374128s, valid=True
2026-06-03T09:48:04.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:48:04.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:48:04.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:48:04.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:48:04.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:48:04.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:48:04.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:48:12, diff=-7.622069s, valid=True
2026-06-03T09:48:04.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:48:04.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:48:04.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:48:04.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47081.37878s, valid=False
2026-06-03T09:48:04.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:48:04.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:48:04.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:48:04.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:48:04.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:48:04.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:48:04.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:48:04.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:48:04.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:48:04.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:48:04.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:48:04.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:48:04.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:48:04.711 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:48:04.918 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:48:05.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:48:05.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:48:05.357 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:48:05.358 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:48:05.606 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:48:05.606 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:48:35.636 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:48:35.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:48:35.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:48:36.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:48:36.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:48:36.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:48:36.606 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:48:36.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:48:36.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:48:36.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:48:36.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:48:36.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:48:36.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:48:39.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:48:39.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:48:39.302 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:48:39.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:48:39.312 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:48:39.325 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:48:39.325 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:48:39.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:48:39.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:48:39.326 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:48:39.327 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:48:39.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:48:39.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:48:39.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:48:39.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:48:39.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:48:39.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:48:39.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:48:39.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:48:39.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:48:39.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:48:39.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:48:39.672 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:48:39.753 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:48:14
2026-06-03T09:48:39.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85708, datetime.datetime(2026, 6, 3, 9, 48, 14), datetime.datetime(2026, 6, 3, 9, 48, 13), 'salt', 6.85, 99.06, None, 36.62, 104.29, 0.14, 824.58, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:48:39.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:48:39.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:48:39.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:48:13, diff=26.761551s, valid=True
2026-06-03T09:48:39.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:48:39.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:48:39.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:48:12, diff=27.765056s, valid=True
2026-06-03T09:48:39.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:48:39.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:48:39.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:48:06, diff=33.773449s, valid=True
2026-06-03T09:48:39.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:48:39.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:48:39.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:48:39.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:48:39.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:48:39.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:48:39.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:48:12, diff=27.777169s, valid=True
2026-06-03T09:48:39.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:48:39.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:48:39.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:48:39.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47116.777982s, valid=False
2026-06-03T09:48:39.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:48:39.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:48:39.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:48:39.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:48:39.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:48:39.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:48:39.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:48:39.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:48:39.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:48:39.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:48:39.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:48:40.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:48:40.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:48:40.119 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:48:40.328 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:48:40.667 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:48:40.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:48:40.768 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:48:40.768 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:48:40.987 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:48:40.987 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:49:11.017 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:49:11.018 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:49:11.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:49:11.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:49:11.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:49:11.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:49:11.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:49:11.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:49:11.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:49:11.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:49:11.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:49:11.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:49:11.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:49:14.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:49:14.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:49:14.101 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:49:14.101 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:49:14.111 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:49:14.124 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:49:14.124 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:49:14.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:49:14.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:49:14.126 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:49:14.126 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:49:14.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:49:14.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:49:14.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:49:14.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:49:14.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:49:14.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:49:14.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:49:14.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:49:14.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:49:14.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:49:14.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:49:14.471 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:49:14.541 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:48:44
2026-06-03T09:49:14.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85709, datetime.datetime(2026, 6, 3, 9, 48, 44), datetime.datetime(2026, 6, 3, 9, 48, 44), 'salt', 6.91, 99.16, None, 36.2, 108.42, 0.11, 824.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:49:14.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:49:14.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:49:14.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:48:44, diff=30.549097s, valid=True
2026-06-03T09:49:14.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:49:14.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:49:14.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:49:12, diff=2.552632s, valid=True
2026-06-03T09:49:14.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:49:14.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:49:14.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:48:37, diff=37.560566s, valid=True
2026-06-03T09:49:14.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:49:14.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:49:14.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:49:14.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:49:14.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:49:14.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:49:14.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:49:12, diff=2.564198s, valid=True
2026-06-03T09:49:14.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:49:14.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:49:14.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:49:14.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47151.56498s, valid=False
2026-06-03T09:49:14.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:49:14.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:49:14.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:49:14.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:49:14.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:49:14.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:49:14.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:49:14.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:49:14.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:49:14.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:49:14.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:49:14.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:49:14.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:49:14.886 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:49:15.090 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:49:15.486 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:49:15.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:49:15.585 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:49:15.586 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:49:15.779 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:49:15.780 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:49:45.810 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:49:45.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:49:45.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:49:45.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:49:45.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:49:46.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:49:46.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:49:46.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:49:46.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:49:46.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:49:46.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:49:46.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:49:46.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:49:48.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:49:48.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:49:48.871 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:49:48.871 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:49:48.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:49:48.893 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:49:48.894 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:49:48.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:49:48.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:49:48.895 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:49:48.896 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:49:48.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:49:49.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:49:49.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:49:49.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:49:49.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:49:49.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:49:49.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:49:49.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:49:49.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:49:49.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:49:49.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:49:49.255 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:49:49.324 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:49:45
2026-06-03T09:49:49.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85711, datetime.datetime(2026, 6, 3, 9, 49, 45), datetime.datetime(2026, 6, 3, 9, 49, 44), 'salt', 6.91, 99.19, None, 31.4, 91.8, 0.11, 824.76, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T09:49:49.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:49:49.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:49:49.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:49:44, diff=5.331849s, valid=True
2026-06-03T09:49:49.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:49:49.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:49:49.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:50:12, diff=-22.664553s, valid=True
2026-06-03T09:49:49.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:49:49.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:49:49.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:49:40, diff=9.343692s, valid=True
2026-06-03T09:49:49.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:49:49.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:49:49.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:49:49.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:49:49.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:49:49.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:49:49.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:50:12, diff=-22.652511s, valid=True
2026-06-03T09:49:49.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:49:49.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:49:49.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:49:49.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47186.348326s, valid=False
2026-06-03T09:49:49.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:49:49.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:49:49.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:49:49.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:49:49.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:49:49.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:49:49.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:49:49.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:49:49.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:49:49.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:49:49.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:49:49.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:49:49.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:49:49.682 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:49:49.892 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:49:50.238 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:49:50.339 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:49:50.339 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:49:50.339 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:49:50.644 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:49:50.644 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:50:20.668 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:50:20.668 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:50:20.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:50:20.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:50:20.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:50:21.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:50:21.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:50:21.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:50:21.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:50:21.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:50:21.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:50:21.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:50:21.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:50:23.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:50:23.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:50:23.980 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:50:23.980 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:50:23.990 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:50:24.003 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:50:24.004 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:50:24.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:50:24.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:50:24.005 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:50:24.005 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:50:24.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:50:24.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:50:24.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:50:24.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:50:24.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:50:24.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:50:24.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:50:24.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:50:24.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:50:24.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:50:24.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:50:24.353 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:50:24.424 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:50:15
2026-06-03T09:50:24.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85712, datetime.datetime(2026, 6, 3, 9, 50, 15), datetime.datetime(2026, 6, 3, 9, 50, 14), 'salt', 6.85, 99.09, None, 32.04, 113.8, 0.13, 824.58, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T09:50:24.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:50:24.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:50:24.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:50:14, diff=10.431484s, valid=True
2026-06-03T09:50:24.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:50:24.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:50:24.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:50:12, diff=12.435036s, valid=True
2026-06-03T09:50:24.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:50:24.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:50:24.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:50:12, diff=12.443294s, valid=True
2026-06-03T09:50:24.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:50:24.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:50:24.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:50:24.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:50:24.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:50:24.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:50:24.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:50:12, diff=12.447036s, valid=True
2026-06-03T09:50:24.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:50:24.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:50:24.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:50:24.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47221.447858s, valid=False
2026-06-03T09:50:24.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:50:24.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:50:24.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:50:24.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:50:24.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:50:24.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:50:24.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:50:24.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:50:24.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:50:24.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:50:24.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:50:24.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:50:24.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:50:24.768 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:50:25.054 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:50:25.399 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:50:25.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:50:25.501 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:50:25.501 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:50:25.589 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:50:25.590 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:50:55.617 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:50:55.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:50:55.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:50:55.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:50:55.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:50:56.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:50:56.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:50:56.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:50:56.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:50:56.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:50:56.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:50:56.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:50:56.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:50:59.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:50:59.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:50:59.495 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:50:59.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:50:59.506 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:50:59.520 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:50:59.521 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:50:59.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:50:59.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:50:59.522 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:50:59.522 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:50:59.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:50:59.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:50:59.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:50:59.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:50:59.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:50:59.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:50:59.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:50:59.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:50:59.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:50:59.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:50:59.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:50:59.814 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:50:59.887 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:50:45
2026-06-03T09:50:59.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85713, datetime.datetime(2026, 6, 3, 9, 50, 45), datetime.datetime(2026, 6, 3, 9, 50, 45), 'salt', 6.95, 99.16, None, 28.02, 109.03, 0.12, 824.64, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T09:50:59.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:50:59.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:50:59.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:50:45, diff=14.893554s, valid=True
2026-06-03T09:50:59.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:50:59.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:50:59.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:51:12, diff=-12.102851s, valid=True
2026-06-03T09:50:59.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:50:59.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:50:59.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:50:43, diff=16.904208s, valid=True
2026-06-03T09:50:59.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:50:59.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:50:59.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:50:59.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:50:59.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:50:59.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:50:59.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:51:12, diff=-12.092525s, valid=True
2026-06-03T09:50:59.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:50:59.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:50:59.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:50:59.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47256.90815s, valid=False
2026-06-03T09:50:59.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:50:59.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:50:59.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:50:59.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:50:59.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:50:59.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:50:59.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:50:59.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:50:59.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:51:00.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:51:00.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:51:00.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:51:00.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:51:00.248 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:51:00.468 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:51:00.817 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:51:00.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:51:00.918 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:51:00.918 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:51:01.002 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:51:01.003 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:51:31.033 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:51:31.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:51:31.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:51:31.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:51:31.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:51:31.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:51:31.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:51:31.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:51:31.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:51:31.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:51:31.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:51:31.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:51:31.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:51:34.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:51:34.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:51:34.020 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:51:34.020 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:51:34.028 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:51:34.039 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:51:34.040 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:51:34.040 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:51:34.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:51:34.040 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:51:34.040 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:51:34.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:51:34.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:51:34.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:51:34.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:51:34.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:51:34.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:51:34.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:51:34.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:51:34.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:51:34.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:51:34.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:51:34.344 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:51:34.417 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:51:16
2026-06-03T09:51:34.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85714, datetime.datetime(2026, 6, 3, 9, 51, 16), datetime.datetime(2026, 6, 3, 9, 51, 15), 'salt', 6.81, 99.16, None, 24.31, 95.16, 0.11, 824.58, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T09:51:34.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:51:34.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:51:34.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:51:15, diff=19.42417s, valid=True
2026-06-03T09:51:34.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:51:34.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:51:34.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:51:12, diff=22.427312s, valid=True
2026-06-03T09:51:34.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:51:34.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:51:34.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:51:14, diff=20.434648s, valid=True
2026-06-03T09:51:34.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:51:34.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:51:34.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:51:34.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:51:34.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:51:34.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:51:34.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:51:12, diff=22.438002s, valid=True
2026-06-03T09:51:34.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:51:34.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:51:34.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:51:34.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47291.43873s, valid=False
2026-06-03T09:51:34.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:51:34.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:51:34.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:51:34.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:51:34.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:51:34.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:51:34.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:51:34.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:51:34.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:51:34.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:51:34.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:51:34.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:51:34.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:51:34.826 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:51:35.038 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:51:35.383 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:51:35.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:51:35.485 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:51:35.485 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:51:35.673 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:51:35.673 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:52:05.701 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:52:05.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:52:05.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:52:06.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:52:06.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:52:06.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:52:06.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:52:06.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:52:06.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:52:06.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:52:06.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:52:06.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:52:06.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:52:08.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:52:08.862 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:52:08.863 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:52:08.863 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:52:08.872 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:52:08.885 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:52:08.886 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:52:08.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:52:08.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:52:08.887 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:52:08.887 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:52:08.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:52:09.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:52:09.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:52:09.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:52:09.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:52:09.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:52:09.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:52:09.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:52:09.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:52:09.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:52:09.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:52:09.230 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:52:09.301 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:51:46
2026-06-03T09:52:09.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85715, datetime.datetime(2026, 6, 3, 9, 51, 46), datetime.datetime(2026, 6, 3, 9, 51, 45), 'salt', 6.98, 99.19, None, 33.77, 105.37, 0.11, 824.46, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T09:52:09.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:52:09.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:52:09.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:51:45, diff=24.308647s, valid=True
2026-06-03T09:52:09.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:52:09.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:52:09.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:52:12, diff=-2.687871s, valid=True
2026-06-03T09:52:09.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:52:09.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:52:09.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:51:38, diff=31.3203s, valid=True
2026-06-03T09:52:09.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:52:09.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:52:09.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:52:09.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:52:09.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:52:09.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:52:09.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:52:12, diff=-2.675976s, valid=True
2026-06-03T09:52:09.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:52:09.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:52:09.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:52:09.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47326.324849s, valid=False
2026-06-03T09:52:09.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:52:09.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:52:09.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:52:09.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:52:09.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:52:09.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:52:09.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:52:09.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:52:09.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:52:09.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:52:09.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:52:09.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:52:09.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:52:09.646 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:52:09.862 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:52:10.236 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:52:10.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:52:10.339 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:52:10.339 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:52:10.426 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:52:10.426 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:52:40.456 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:52:40.457 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:52:40.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:52:40.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:52:40.606 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:52:40.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:52:40.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:52:40.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:52:40.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:52:40.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:52:40.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:52:40.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:52:40.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:52:43.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:52:43.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:52:43.595 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:52:43.595 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:52:43.604 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:52:43.617 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:52:43.617 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:52:43.618 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:52:43.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:52:43.618 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:52:43.618 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:52:43.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:52:43.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:52:43.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:52:43.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:52:43.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:52:43.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:52:43.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:52:43.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:52:43.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:52:43.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:52:43.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:52:43.958 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:52:44.029 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:52:16
2026-06-03T09:52:44.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85716, datetime.datetime(2026, 6, 3, 9, 52, 16), datetime.datetime(2026, 6, 3, 9, 52, 16), 'salt', 6.91, 99.16, None, 37.47, 104.48, 0.11, 824.52, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T09:52:44.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:52:44.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:52:44.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:52:16, diff=28.036569s, valid=True
2026-06-03T09:52:44.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:52:44.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:52:44.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:52:12, diff=32.040094s, valid=True
2026-06-03T09:52:44.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:52:44.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:52:44.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:52:09, diff=35.048405s, valid=True
2026-06-03T09:52:44.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:52:44.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:52:44.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:52:44.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:52:44.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:52:44.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:52:44.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:52:12, diff=32.052147s, valid=True
2026-06-03T09:52:44.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:52:44.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:52:44.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:52:44.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47361.052968s, valid=False
2026-06-03T09:52:44.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:52:44.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:52:44.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:52:44.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:52:44.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:52:44.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:52:44.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:52:44.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:52:44.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:52:44.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:52:44.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:52:44.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:52:44.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:52:44.440 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:52:44.652 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:52:44.996 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:52:45.098 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:52:45.098 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:52:45.098 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:52:45.252 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:52:45.252 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:53:15.271 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:53:15.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:53:15.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:53:15.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:53:15.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:53:15.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:53:15.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:53:15.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:53:15.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:53:15.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:53:15.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:53:15.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:53:15.717 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:53:18.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:53:18.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:53:18.347 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:53:18.347 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:53:18.357 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:53:18.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:53:18.370 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:53:18.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:53:18.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:53:18.371 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:53:18.371 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:53:18.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:53:18.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:53:18.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:53:18.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:53:18.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:53:18.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:53:18.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:53:18.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:53:18.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:53:18.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:53:18.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:53:18.713 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:53:18.782 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:53:17
2026-06-03T09:53:18.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85718, datetime.datetime(2026, 6, 3, 9, 53, 17), datetime.datetime(2026, 6, 3, 9, 53, 16), 'salt', 6.98, 99.16, None, 45.06, 116.78, 0.12, 824.34, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T09:53:18.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:53:18.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:53:18.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:53:16, diff=2.790157s, valid=True
2026-06-03T09:53:18.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:53:18.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:53:18.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:53:12, diff=6.793665s, valid=True
2026-06-03T09:53:18.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:53:18.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:53:18.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:53:10, diff=8.801879s, valid=True
2026-06-03T09:53:18.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:53:18.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:53:18.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:53:18.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:53:18.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:53:18.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:53:18.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:53:12, diff=6.805555s, valid=True
2026-06-03T09:53:18.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:53:18.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:53:18.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:53:18.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47395.806375s, valid=False
2026-06-03T09:53:18.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:53:18.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:53:18.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:53:18.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:53:18.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:53:18.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:53:18.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:53:18.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:53:18.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:53:18.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:53:19.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:53:19.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:53:19.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:53:19.138 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:53:19.353 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:53:19.698 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:53:19.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:53:19.800 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:53:19.800 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:53:19.954 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:53:19.955 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:53:49.984 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:53:49.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:53:49.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:53:50.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:53:50.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:53:50.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:53:50.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:53:50.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:53:50.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:53:50.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:53:50.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:53:50.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:53:50.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:53:53.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:53:53.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:53:53.307 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:53:53.307 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:53:53.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:53:53.328 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:53:53.328 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:53:53.329 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:53:53.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:53:53.329 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:53:53.330 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:53:53.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:53:53.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:53:53.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:53:53.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:53:53.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:53:53.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:53:53.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:53:53.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:53:53.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:53:53.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:53:53.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:53:53.731 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:53:53.799 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:53:47
2026-06-03T09:53:53.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85719, datetime.datetime(2026, 6, 3, 9, 53, 47), datetime.datetime(2026, 6, 3, 9, 53, 46), 'salt', 6.95, 99.19, None, 44.74, 96.24, 0.12, 824.46, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:53:53.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:53:53.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:53:53.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:53:46, diff=7.8054s, valid=True
2026-06-03T09:53:53.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:53:53.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:53:53.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:54:12, diff=-18.191764s, valid=True
2026-06-03T09:53:53.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:53:53.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:53:53.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:53:41, diff=12.814933s, valid=True
2026-06-03T09:53:53.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:53:53.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:53:53.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:53:53.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:53:53.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:53:53.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:53:53.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:54:12, diff=-18.182067s, valid=True
2026-06-03T09:53:53.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:53:53.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:53:53.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:53:53.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47430.818582s, valid=False
2026-06-03T09:53:53.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:53:53.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:53:53.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:53:53.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:53:53.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:53:53.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:53:53.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:53:53.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:53:53.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:53:53.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:53:54.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:53:54.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:53:54.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:53:54.131 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:53:54.362 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:53:54.708 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:53:54.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:53:54.809 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:53:54.809 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:53:55.017 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:53:55.017 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:54:25.047 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:54:25.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:54:25.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:54:25.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:54:25.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:54:25.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:54:25.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:54:25.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:54:25.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:54:25.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:54:25.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:54:25.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:54:25.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:54:28.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:54:28.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:54:28.122 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:54:28.122 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:54:28.132 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:54:28.145 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:54:28.146 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:54:28.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:54:28.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:54:28.147 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:54:28.147 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:54:28.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:54:28.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:54:28.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:54:28.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:54:28.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:54:28.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:54:28.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:54:28.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:54:28.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:54:28.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:54:28.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:54:28.473 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:54:28.544 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:54:17
2026-06-03T09:54:28.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85720, datetime.datetime(2026, 6, 3, 9, 54, 17), datetime.datetime(2026, 6, 3, 9, 54, 17), 'salt', 6.95, 99.16, None, 44.42, 92.86, 0.12, 824.4, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:54:28.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:54:28.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:54:28.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:54:17, diff=11.551875s, valid=True
2026-06-03T09:54:28.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:54:28.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:54:28.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:54:12, diff=16.555344s, valid=True
2026-06-03T09:54:28.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:54:28.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:54:28.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:54:12, diff=16.563591s, valid=True
2026-06-03T09:54:28.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:54:28.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:54:28.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:54:28.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:54:28.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:54:28.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:54:28.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:54:12, diff=16.567334s, valid=True
2026-06-03T09:54:28.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:54:28.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:54:28.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:54:28.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47465.568155s, valid=False
2026-06-03T09:54:28.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:54:28.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:54:28.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:54:28.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:54:28.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:54:28.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:54:28.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:54:28.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:54:28.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:54:28.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:54:28.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:54:28.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:54:28.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:54:28.887 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:54:29.098 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:54:29.439 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:54:29.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:54:29.602 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:54:29.603 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:54:29.747 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:54:29.747 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:54:59.778 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:54:59.778 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:54:59.778 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:54:59.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:54:59.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:55:00.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:55:00.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:55:00.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:55:00.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:55:00.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:55:00.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:55:00.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:55:00.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:55:02.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:55:02.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:55:02.855 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:55:02.856 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:55:02.866 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:55:02.878 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:55:02.879 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:55:02.880 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:55:02.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:55:02.880 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:55:02.880 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:55:02.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:55:03.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:55:03.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:55:03.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:55:03.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:55:03.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:55:03.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:55:03.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:55:03.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:55:03.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:55:03.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:55:03.209 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:55:03.279 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:54:48
2026-06-03T09:55:03.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85721, datetime.datetime(2026, 6, 3, 9, 54, 48), datetime.datetime(2026, 6, 3, 9, 54, 47), 'salt', 6.88, 99.39, None, 42.55, 104.2, 0.08, 824.46, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:55:03.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:55:03.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:55:03.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:54:47, diff=16.286714s, valid=True
2026-06-03T09:55:03.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:55:03.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:55:03.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:55:12, diff=-8.709763s, valid=True
2026-06-03T09:55:03.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:55:03.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:55:03.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:54:44, diff=19.298495s, valid=True
2026-06-03T09:55:03.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:55:03.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:55:03.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:55:03.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:55:03.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:55:03.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:55:03.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:55:12, diff=-8.697752s, valid=True
2026-06-03T09:55:03.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:55:03.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:55:03.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:55:03.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47500.303067s, valid=False
2026-06-03T09:55:03.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:55:03.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:55:03.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:55:03.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:55:03.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:55:03.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:55:03.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:55:03.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:55:03.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:55:03.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:55:03.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:55:03.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:55:03.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:55:03.622 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:55:03.851 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:55:04.196 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:55:04.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:55:04.297 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:55:04.297 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:55:04.493 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:55:04.493 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:55:34.503 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:55:34.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:55:34.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:55:34.653 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:55:34.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:55:34.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:55:34.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:55:34.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:55:34.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:55:34.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:55:34.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:55:34.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:55:34.939 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:55:37.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:55:37.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:55:37.678 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:55:37.678 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:55:37.693 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:55:37.705 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:55:37.705 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:55:37.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:55:37.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:55:37.706 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:55:37.707 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:55:37.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:55:37.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:55:37.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:55:37.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:55:37.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:55:37.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:55:37.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:55:38.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:55:38.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:55:38.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:55:38.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:55:38.036 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:55:38.106 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:55:18
2026-06-03T09:55:38.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85722, datetime.datetime(2026, 6, 3, 9, 55, 18), datetime.datetime(2026, 6, 3, 9, 55, 17), 'salt', 6.95, 99.16, None, 40.26, 100.68, 0.12, 824.82, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:55:38.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:55:38.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:55:38.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:55:17, diff=21.113323s, valid=True
2026-06-03T09:55:38.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:55:38.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:55:38.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:55:12, diff=26.116694s, valid=True
2026-06-03T09:55:38.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:55:38.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:55:38.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:55:15, diff=23.124652s, valid=True
2026-06-03T09:55:38.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:55:38.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:55:38.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:55:38.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:55:38.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:55:38.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:55:38.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:55:12, diff=26.128257s, valid=True
2026-06-03T09:55:38.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:55:38.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:55:38.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:55:38.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47535.129057s, valid=False
2026-06-03T09:55:38.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:55:38.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:55:38.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:55:38.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:55:38.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:55:38.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:55:38.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:55:38.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:55:38.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:55:38.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:55:38.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:55:38.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:55:38.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:55:38.446 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:55:38.737 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:55:39.080 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:55:39.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:55:39.181 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:55:39.181 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:55:39.339 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:55:39.339 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:56:09.369 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:56:09.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:56:09.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:56:09.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:56:09.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:56:09.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:56:09.768 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:56:09.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:56:09.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:56:09.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:56:09.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:56:09.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:56:09.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:56:12.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:56:12.473 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:56:12.474 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:56:12.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:56:12.485 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:56:12.498 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:56:12.499 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:56:12.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:56:12.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:56:12.500 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:56:12.501 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:56:12.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:56:12.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:56:12.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:56:12.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:56:12.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:56:12.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:56:12.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:56:12.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:56:12.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:56:12.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:56:12.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:56:12.841 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:56:12.924 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:55:48
2026-06-03T09:56:12.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85723, datetime.datetime(2026, 6, 3, 9, 55, 48), datetime.datetime(2026, 6, 3, 9, 55, 48), 'salt', 6.88, 99.06, None, 40.47, 91.61, 0.13, 824.82, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:56:12.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:56:12.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:56:12.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:55:48, diff=24.930413s, valid=True
2026-06-03T09:56:12.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:56:12.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:56:12.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:56:12, diff=0.933263s, valid=True
2026-06-03T09:56:12.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:56:12.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:56:12.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:55:47, diff=25.940006s, valid=True
2026-06-03T09:56:12.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:56:12.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:56:12.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:56:12.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:56:12.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:56:12.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:56:12.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:56:12, diff=0.943154s, valid=True
2026-06-03T09:56:12.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:56:12.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:56:12.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:56:12.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47569.943839s, valid=False
2026-06-03T09:56:12.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:56:12.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:56:12.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:56:12.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:56:12.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:56:13.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:56:13.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:56:13.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:56:13.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:56:13.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:56:13.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:56:13.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:56:13.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:56:13.258 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:56:13.470 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:56:13.817 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:56:13.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:56:13.920 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:56:13.920 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:56:14.175 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:56:14.175 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:56:44.195 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:56:44.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:56:44.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:56:44.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:56:44.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:56:44.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:56:44.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:56:44.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:56:44.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:56:44.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:56:44.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:56:44.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:56:44.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:56:47.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:56:47.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:56:47.110 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:56:47.110 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:56:47.119 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:56:47.132 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:56:47.132 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:56:47.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:56:47.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:56:47.133 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:56:47.134 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:56:47.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:56:47.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T09:56:47.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:56:47.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T09:56:47.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:56:47.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:56:47.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:56:47.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:56:47.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:56:47.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:56:47.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:56:47.473 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:56:47.553 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:56:18
2026-06-03T09:56:47.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85724, datetime.datetime(2026, 6, 3, 9, 56, 18), datetime.datetime(2026, 6, 3, 9, 56, 18), 'salt', 6.88, 99.09, None, 37.68, 101.57, 0.13, 824.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:56:47.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:56:47.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T09:56:47.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:56:18, diff=29.560437s, valid=True
2026-06-03T09:56:47.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:56:47.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:56:47.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:56:12, diff=35.564002s, valid=True
2026-06-03T09:56:47.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:56:47.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T09:56:47.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:56:18, diff=29.572234s, valid=True
2026-06-03T09:56:47.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:56:47.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:56:47.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:56:47.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:56:47.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:56:47.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:56:47.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:56:12, diff=35.576006s, valid=True
2026-06-03T09:56:47.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:56:47.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:56:47.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:56:47.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47604.576825s, valid=False
2026-06-03T09:56:47.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:56:47.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:56:47.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:56:47.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:56:47.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:56:47.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:56:47.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:56:47.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:56:47.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:56:47.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:56:47.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:56:47.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:56:47.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:56:47.967 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:56:48.185 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:56:48.529 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:56:48.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:56:48.632 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:56:48.632 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:56:48.755 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:56:48.755 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:57:18.785 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:57:18.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:57:18.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:57:19.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:57:19.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:57:19.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:57:19.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:57:19.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:57:19.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:57:19.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:57:19.363 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:57:19.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:57:19.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:57:21.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:57:21.913 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:57:21.913 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:57:21.913 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:57:21.922 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:57:21.934 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:57:21.934 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:57:21.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:57:21.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:57:21.934 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:57:21.935 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:57:21.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:57:22.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:57:22.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:57:22.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:57:22.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:57:22.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:57:22.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:57:22.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:57:22.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:57:22.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:57:22.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:57:22.270 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:57:22.346 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:57:20
2026-06-03T09:57:22.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85726, datetime.datetime(2026, 6, 3, 9, 57, 20), datetime.datetime(2026, 6, 3, 9, 57, 19), 'salt', 6.85, 99.09, None, 36.13, 90.04, 0.13, 824.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:57:22.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:57:22.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:57:22.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:57:19, diff=3.353707s, valid=True
2026-06-03T09:57:22.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:57:22.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:57:22.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:57:12, diff=10.357173s, valid=True
2026-06-03T09:57:22.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:57:22.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:57:22.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:57:11, diff=11.365391s, valid=True
2026-06-03T09:57:22.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:57:22.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:57:22.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:57:22.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:57:22.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:57:22.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:57:22.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:57:12, diff=10.369155s, valid=True
2026-06-03T09:57:22.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:57:22.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:57:22.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:57:22.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47639.369972s, valid=False
2026-06-03T09:57:22.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:57:22.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:57:22.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:57:22.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:57:22.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:57:22.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:57:22.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:57:22.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:57:22.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:57:22.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:57:22.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:57:22.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:57:22.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:57:22.691 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:57:22.904 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:57:23.247 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:57:23.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:57:23.349 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:57:23.349 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:57:23.609 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:57:23.610 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:57:53.614 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:57:53.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:57:53.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:57:53.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:57:53.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:57:54.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:57:54.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:57:54.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:57:54.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:57:54.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:57:54.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:57:54.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:57:54.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:57:56.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:57:56.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:57:56.745 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:57:56.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:57:56.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:57:56.772 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:57:56.773 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:57:56.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:57:56.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:57:56.774 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:57:56.774 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:57:56.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:57:56.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:57:56.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:57:57.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:57:57.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:57:57.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:57:57.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:57:57.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:57:57.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:57:57.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:57:57.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:57:57.183 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:57:57.251 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:57:50
2026-06-03T09:57:57.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85727, datetime.datetime(2026, 6, 3, 9, 57, 50), datetime.datetime(2026, 6, 3, 9, 57, 49), 'salt', 6.88, 99.16, None, 35.67, 87.86, 0.12, 824.52, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:57:57.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:57:57.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:57:57.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:57:49, diff=8.257872s, valid=True
2026-06-03T09:57:57.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:57:57.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:57:57.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:58:12, diff=-14.73932s, valid=True
2026-06-03T09:57:57.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:57:57.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:57:57.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:57:42, diff=15.26729s, valid=True
2026-06-03T09:57:57.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:57:57.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:57:57.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:57:57.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:57:57.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:57:57.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:57:57.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:58:12, diff=-14.729751s, valid=True
2026-06-03T09:57:57.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:57:57.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:57:57.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:57:57.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47674.270901s, valid=False
2026-06-03T09:57:57.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:57:57.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:57:57.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:57:57.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:57:57.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:57:57.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:57:57.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:57:57.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:57:57.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:57:57.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:57:57.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:57:57.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:57:57.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:57:57.582 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:57:57.817 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:57:58.164 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:57:58.266 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:57:58.266 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:57:58.266 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:57:58.455 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:57:58.455 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:58:28.465 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:58:28.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:58:28.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:58:28.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:58:28.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:58:29.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:58:29.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:58:29.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:58:29.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:58:29.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:58:29.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:58:29.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:58:29.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:58:31.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:58:31.616 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:58:31.617 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:58:31.617 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:58:31.626 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:58:31.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:58:31.640 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:58:31.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:58:31.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:58:31.641 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:58:31.641 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:58:31.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:58:31.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:58:31.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:58:31.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:58:31.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:58:31.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:58:31.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:58:31.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:58:31.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:58:31.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:58:31.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:58:31.969 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:58:32.039 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:58:20
2026-06-03T09:58:32.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85728, datetime.datetime(2026, 6, 3, 9, 58, 20), datetime.datetime(2026, 6, 3, 9, 58, 20), 'salt', 6.88, 99.16, None, 35.18, 88.7, 0.12, 824.58, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:58:32.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:58:32.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:58:32.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:58:20, diff=12.046644s, valid=True
2026-06-03T09:58:32.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:58:32.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:58:32.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:58:12, diff=20.050136s, valid=True
2026-06-03T09:58:32.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:58:32.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:58:32.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:58:13, diff=19.058427s, valid=True
2026-06-03T09:58:32.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:58:32.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:58:32.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:58:32.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:58:32.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:58:32.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:58:32.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:58:12, diff=20.062167s, valid=True
2026-06-03T09:58:32.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:58:32.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:58:32.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:58:32.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47709.062984s, valid=False
2026-06-03T09:58:32.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:58:32.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:58:32.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:58:32.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:58:32.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:58:32.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:58:32.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:58:32.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:58:32.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:58:32.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:58:32.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:58:32.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:58:32.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:58:32.381 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:58:32.594 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:58:32.936 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:58:33.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:58:33.094 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:58:33.094 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:58:33.251 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:58:33.251 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:59:03.274 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:59:03.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:59:03.274 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:59:03.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:59:03.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:59:03.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:59:03.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:59:03.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:59:03.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:59:03.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:59:03.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:59:03.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:59:03.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:59:06.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:59:06.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:59:06.314 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:59:06.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:59:06.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:59:06.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:59:06.338 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:59:06.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:59:06.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:59:06.339 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:59:06.339 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:59:06.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:59:06.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:59:06.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:59:06.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:59:06.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:59:06.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:59:06.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:59:06.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T09:59:06.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:59:06.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:59:06.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:59:06.667 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:59:06.736 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:58:51
2026-06-03T09:59:06.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85729, datetime.datetime(2026, 6, 3, 9, 58, 51), datetime.datetime(2026, 6, 3, 9, 58, 50), 'salt', 6.91, 99.12, None, 37.86, 97.98, 0.12, 824.76, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:59:06.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:59:06.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:59:06.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:58:50, diff=16.743649s, valid=True
2026-06-03T09:59:06.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:59:06.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:59:06.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:59:12, diff=-5.252872s, valid=True
2026-06-03T09:59:06.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:59:06.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:59:06.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:58:45, diff=21.75526s, valid=True
2026-06-03T09:59:06.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:59:06.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:59:06.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:59:06.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:59:06.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:59:06.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T09:59:06.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:59:12, diff=-5.240978s, valid=True
2026-06-03T09:59:06.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:59:06.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:59:06.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:59:06.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47743.759853s, valid=False
2026-06-03T09:59:06.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:59:06.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:59:06.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:59:06.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:59:06.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:59:06.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:59:06.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:59:06.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:59:06.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:59:06.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:59:06.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:59:06.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:59:07.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:59:07.080 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:59:07.293 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:59:07.642 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:59:07.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:59:07.745 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:59:07.745 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:59:07.964 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:59:07.964 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T09:59:37.985 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T09:59:37.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T09:59:37.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T09:59:38.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T09:59:38.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T09:59:38.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T09:59:38.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T09:59:38.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T09:59:38.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T09:59:38.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T09:59:38.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T09:59:38.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T09:59:38.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T09:59:41.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T09:59:41.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T09:59:41.078 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T09:59:41.079 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T09:59:41.089 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T09:59:41.101 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T09:59:41.102 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T09:59:41.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T09:59:41.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T09:59:41.103 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T09:59:41.103 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T09:59:41.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T09:59:41.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T09:59:41.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T09:59:41.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T09:59:41.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:59:41.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:59:41.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T09:59:41.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T09:59:41.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T09:59:41.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T09:59:41.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T09:59:41.435 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T09:59:41.509 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:59:21
2026-06-03T09:59:41.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85730, datetime.datetime(2026, 6, 3, 9, 59, 21), datetime.datetime(2026, 6, 3, 9, 59, 20), 'salt', 6.88, 99.19, None, 34.33, 91.78, 0.11, 824.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T09:59:41.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T09:59:41.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T09:59:41.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:59:20, diff=21.516886s, valid=True
2026-06-03T09:59:41.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T09:59:41.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:59:41.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:59:12, diff=29.520367s, valid=True
2026-06-03T09:59:41.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T09:59:41.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T09:59:41.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:59:17, diff=24.528639s, valid=True
2026-06-03T09:59:41.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T09:59:41.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:59:41.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T09:59:41.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T09:59:41.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T09:59:41.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T09:59:41.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:59:12, diff=29.532446s, valid=True
2026-06-03T09:59:41.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T09:59:41.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T09:59:41.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T09:59:41.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47778.533283s, valid=False
2026-06-03T09:59:41.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T09:59:41.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T09:59:41.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T09:59:41.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T09:59:41.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T09:59:41.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T09:59:41.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T09:59:41.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T09:59:41.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T09:59:41.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T09:59:41.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T09:59:41.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T09:59:41.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T09:59:41.853 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T09:59:42.142 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:59:42.485 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T09:59:42.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T09:59:42.586 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T09:59:42.586 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T09:59:43.399 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T09:59:43.399 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:00:13.426 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:00:13.426 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:00:13.427 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:00:13.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:00:13.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:00:13.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:00:13.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:00:13.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:00:13.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:00:13.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:00:13.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:00:13.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:00:13.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:00:17.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:00:17.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:00:17.158 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:00:17.158 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:00:17.168 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:00:17.180 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:00:17.181 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:00:17.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:00:17.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:00:17.182 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:00:17.182 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:00:17.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:00:17.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:00:17.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:00:17.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:00:17.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:00:17.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:00:17.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:00:17.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:00:17.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:00:17.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:00:17.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:00:17.500 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:00:17.569 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 09:59:51
2026-06-03T10:00:17.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85731, datetime.datetime(2026, 6, 3, 9, 59, 51), datetime.datetime(2026, 6, 3, 9, 59, 50), 'salt', 7.01, 99.19, None, 38.35, 85.79, 0.11, 824.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:00:17.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:00:17.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:00:17.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:59:50, diff=27.576021s, valid=True
2026-06-03T10:00:17.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:00:17.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:00:17.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:00:12, diff=5.579168s, valid=True
2026-06-03T10:00:17.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:00:17.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:00:17.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 09:59:48, diff=29.586325s, valid=True
2026-06-03T10:00:17.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:00:17.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:00:17.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:00:17.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:00:17.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:00:17.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:00:17.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:00:12, diff=5.589486s, valid=True
2026-06-03T10:00:17.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:00:17.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:00:17.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:00:17.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47814.590158s, valid=False
2026-06-03T10:00:17.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:00:17.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:00:17.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:00:17.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:00:17.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:00:17.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:00:17.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:00:17.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:00:17.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:00:17.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:00:17.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:00:17.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:00:17.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:00:17.904 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:00:18.116 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:00:18.457 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:00:18.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:00:18.560 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:00:18.560 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:00:18.751 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:00:18.751 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:00:48.781 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:00:48.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:00:48.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:00:49.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:00:49.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:00:49.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:00:49.461 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:00:49.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:00:49.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:00:49.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:00:49.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:00:49.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:00:49.485 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:00:52.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:00:52.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:00:52.626 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:00:52.626 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:00:52.636 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:00:52.648 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:00:52.649 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:00:52.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:00:52.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:00:52.650 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:00:52.650 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:00:52.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:00:52.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:00:52.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:00:52.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:00:52.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:00:52.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T10:00:52.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:00:52.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T10:00:52.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:00:52.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:00:52.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:00:52.989 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:00:53.062 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:00:52
2026-06-03T10:00:53.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85733, datetime.datetime(2026, 6, 3, 10, 0, 52), datetime.datetime(2026, 6, 3, 10, 0, 52), 'salt', 6.88, 99.09, None, 39.41, 84.73, 0.13, 824.52, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:00:53.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:00:53.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:00:53.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:00:52, diff=1.069853s, valid=True
2026-06-03T10:00:53.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:00:53.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T10:00:53.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:01:12, diff=-18.92691s, valid=True
2026-06-03T10:00:53.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:00:53.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:00:53.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:00:51, diff=2.08064s, valid=True
2026-06-03T10:00:53.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:00:53.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:00:53.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:00:53.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:00:53.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:00:53.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T10:00:53.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:01:12, diff=-18.915932s, valid=True
2026-06-03T10:00:53.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:00:53.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:00:53.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:00:53.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47850.084804s, valid=False
2026-06-03T10:00:53.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:00:53.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:00:53.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:00:53.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:00:53.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:00:53.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:00:53.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:00:53.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:00:53.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:00:53.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:00:53.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:00:53.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:00:53.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:00:53.473 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:00:53.687 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:00:54.031 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:00:54.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:00:54.133 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:00:54.133 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:00:54.391 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:00:54.391 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:01:24.400 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:01:24.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:01:24.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:01:24.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:01:24.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:01:24.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:01:24.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:01:24.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:01:24.806 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:01:24.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:01:24.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:01:24.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:01:24.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:01:27.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:01:27.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:01:27.342 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:01:27.342 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:01:27.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:01:27.365 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:01:27.366 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:01:27.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:01:27.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:01:27.367 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:01:27.367 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:01:27.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:01:27.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:01:27.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:01:27.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:01:27.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:01:27.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:01:27.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:01:27.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:01:27.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:01:27.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:01:27.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:01:27.699 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:01:27.769 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:01:24
2026-06-03T10:01:27.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85734, datetime.datetime(2026, 6, 3, 10, 1, 24), datetime.datetime(2026, 6, 3, 10, 1, 21), 'salt', 6.98, 99.12, None, 45.69, 97.36, 0.12, 824.46, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T10:01:27.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:01:27.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:01:27.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:01:21, diff=6.777115s, valid=True
2026-06-03T10:01:27.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:01:27.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:01:27.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:01:12, diff=15.780493s, valid=True
2026-06-03T10:01:27.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:01:27.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:01:27.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:01:13, diff=14.788467s, valid=True
2026-06-03T10:01:27.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:01:27.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:01:27.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:01:27.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:01:27.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:01:27.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:01:27.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:01:12, diff=15.792062s, valid=True
2026-06-03T10:01:27.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:01:27.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:01:27.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:01:27.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47884.792853s, valid=False
2026-06-03T10:01:27.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:01:27.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:01:27.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:01:27.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:01:27.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:01:27.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:01:27.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:01:27.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:01:27.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:01:27.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:01:27.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:01:28.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:01:28.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:01:28.117 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:01:28.329 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:01:28.672 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:01:28.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:01:28.774 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:01:28.774 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:01:28.951 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:01:28.951 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:01:58.981 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:01:58.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:01:58.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:01:59.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:01:59.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:01:59.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:01:59.619 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:01:59.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:01:59.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:01:59.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:01:59.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:01:59.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:01:59.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:02:02.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:02:02.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:02:02.231 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:02:02.232 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:02:02.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:02:02.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:02:02.255 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:02:02.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:02:02.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:02:02.256 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:02:02.256 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:02:02.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:02:02.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:02:02.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:02:02.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:02:02.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:02:02.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T10:02:02.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:02:02.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T10:02:02.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:02:02.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:02:02.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:02:02.649 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:02:02.717 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:01:54
2026-06-03T10:02:02.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85735, datetime.datetime(2026, 6, 3, 10, 1, 54), datetime.datetime(2026, 6, 3, 10, 1, 53), 'salt', 6.91, 99.09, None, 40.29, 83.77, 0.12, 824.52, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:02:02.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:02:02.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:02:02.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:01:53, diff=9.723438s, valid=True
2026-06-03T10:02:02.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:02:02.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T10:02:02.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:02:12, diff=-9.273747s, valid=True
2026-06-03T10:02:02.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:02:02.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:02:02.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:01:53, diff=9.732835s, valid=True
2026-06-03T10:02:02.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:02:02.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:02:02.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:02:02.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:02:02.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:02:02.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T10:02:02.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:02:12, diff=-9.264189s, valid=True
2026-06-03T10:02:02.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:02:02.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:02:02.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:02:02.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47919.736445s, valid=False
2026-06-03T10:02:02.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:02:02.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:02:02.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:02:02.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:02:02.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:02:02.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:02:02.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:02:02.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:02:02.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:02:02.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:02:02.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:02:02.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:02:03.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:02:03.047 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:02:03.260 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:02:03.603 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:02:03.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:02:03.704 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:02:03.704 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:02:03.859 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:02:03.859 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:02:33.863 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:02:33.863 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:02:33.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:02:34.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:02:34.019 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:02:34.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:02:34.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:02:34.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:02:34.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:02:34.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:02:34.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:02:34.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:02:34.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:02:36.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:02:36.960 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:02:36.960 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:02:36.960 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:02:36.969 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:02:36.981 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:02:36.981 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:02:36.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:02:36.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:02:36.981 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:02:36.981 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:02:36.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:02:37.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:02:37.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:02:37.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:02:37.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:02:37.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T10:02:37.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:02:37.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T10:02:37.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:02:37.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:02:37.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:02:37.251 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:02:37.321 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:02:24
2026-06-03T10:02:37.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85736, datetime.datetime(2026, 6, 3, 10, 2, 24), datetime.datetime(2026, 6, 3, 10, 2, 23), 'salt', 6.91, 99.12, None, 39.27, 94.85, 0.12, 824.46, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:02:37.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:02:37.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:02:37.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:02:23, diff=14.327436s, valid=True
2026-06-03T10:02:37.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:02:37.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T10:02:37.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:02:12, diff=25.330754s, valid=True
2026-06-03T10:02:37.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:02:37.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:02:37.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:02:23, diff=14.33838s, valid=True
2026-06-03T10:02:37.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:02:37.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:02:37.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:02:37.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:02:37.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:02:37.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T10:02:37.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:02:12, diff=25.341969s, valid=True
2026-06-03T10:02:37.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:02:37.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:02:37.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:02:37.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47954.342726s, valid=False
2026-06-03T10:02:37.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:02:37.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:02:37.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:02:37.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:02:37.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:02:37.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:02:37.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:02:37.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:02:37.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:02:37.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:02:37.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:02:37.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:02:37.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:02:37.691 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:02:37.913 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:02:38.259 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:02:38.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:02:38.422 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:02:38.422 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:02:38.490 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:02:38.490 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:03:08.520 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:03:08.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:03:08.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:03:08.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:03:08.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:03:08.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:03:08.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:03:08.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:03:08.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:03:08.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:03:08.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:03:08.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:03:08.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:03:11.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:03:11.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:03:11.603 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:03:11.603 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:03:11.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:03:11.626 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:03:11.627 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:03:11.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:03:11.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:03:11.628 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:03:11.628 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:03:11.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:03:11.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:03:11.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:03:11.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:03:11.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:03:11.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T10:03:11.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:03:11.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T10:03:11.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:03:11.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:03:11.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:03:11.955 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:03:12.025 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:02:54
2026-06-03T10:03:12.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85737, datetime.datetime(2026, 6, 3, 10, 2, 54), datetime.datetime(2026, 6, 3, 10, 2, 54), 'salt', 6.95, 99.12, None, 39.06, 99.15, 0.13, 824.52, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:03:12.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:03:12.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:03:12.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:02:54, diff=18.033258s, valid=True
2026-06-03T10:03:12.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:03:12.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T10:03:12.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:03:12, diff=0.036768s, valid=True
2026-06-03T10:03:12.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:03:12.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:03:12.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:02:54, diff=18.044878s, valid=True
2026-06-03T10:03:12.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:03:12.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:03:12.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:03:12.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:03:12.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:03:12.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T10:03:12.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:03:12, diff=0.04865s, valid=True
2026-06-03T10:03:12.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:03:12.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:03:12.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:03:12.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=47989.049452s, valid=False
2026-06-03T10:03:12.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:03:12.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:03:12.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:03:12.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:03:12.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:03:12.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:03:12.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:03:12.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:03:12.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:03:12.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:03:12.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:03:12.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:03:12.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:03:12.368 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:03:12.602 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:03:12.947 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:03:13.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:03:13.048 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:03:13.048 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:03:13.216 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:03:13.216 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:03:43.246 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:03:43.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:03:43.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:03:43.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:03:43.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:03:43.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:03:43.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:03:43.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:03:43.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:03:43.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:03:43.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:03:43.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:03:43.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:03:46.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:03:46.403 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:03:46.404 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:03:46.404 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:03:46.413 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:03:46.427 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:03:46.428 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:03:46.428 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:03:46.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:03:46.429 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:03:46.429 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:03:46.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:03:46.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:03:46.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:03:46.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:03:46.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:03:46.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T10:03:46.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:03:46.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T10:03:46.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:03:46.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:03:46.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:03:46.797 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:03:46.868 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:03:25
2026-06-03T10:03:46.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85738, datetime.datetime(2026, 6, 3, 10, 3, 25), datetime.datetime(2026, 6, 3, 10, 3, 24), 'salt', 6.95, 99.06, None, 47.56, 104.15, 0.14, 824.34, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T10:03:46.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:03:46.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:03:46.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:03:24, diff=22.876034s, valid=True
2026-06-03T10:03:46.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:03:46.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T10:03:46.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:03:12, diff=34.879373s, valid=True
2026-06-03T10:03:46.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:03:46.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:03:46.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:03:24, diff=22.887114s, valid=True
2026-06-03T10:03:46.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:03:46.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:03:46.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:03:46.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:03:46.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:03:46.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T10:03:46.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:03:12, diff=34.890714s, valid=True
2026-06-03T10:03:46.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:03:46.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:03:46.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:03:46.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48023.891482s, valid=False
2026-06-03T10:03:46.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:03:46.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:03:46.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:03:46.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:03:46.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:03:46.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:03:46.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:03:46.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:03:46.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:03:47.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:03:47.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:03:47.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:03:47.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:03:47.208 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:03:47.498 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:03:47.840 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:03:47.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:03:47.941 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:03:47.941 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:03:48.012 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:03:48.012 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:04:18.017 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:04:18.017 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:04:18.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:04:18.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:04:18.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:04:18.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:04:18.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:04:18.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:04:18.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:04:18.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:04:18.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:04:18.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:04:18.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:04:21.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:04:21.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:04:21.195 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:04:21.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:04:21.205 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:04:21.218 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:04:21.219 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:04:21.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:04:21.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:04:21.222 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:04:21.222 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:04:21.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:04:21.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:04:21.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:04:21.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:04:21.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:04:21.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:04:21.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:04:21.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:04:21.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:04:21.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:04:21.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:04:21.585 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:04:21.660 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:03:55
2026-06-03T10:04:21.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85739, datetime.datetime(2026, 6, 3, 10, 3, 55), datetime.datetime(2026, 6, 3, 10, 3, 54), 'salt', 6.94, 99.09, None, 35.39, 95.56, 0.12, 824.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:04:21.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:04:21.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:04:21.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:03:54, diff=27.668315s, valid=True
2026-06-03T10:04:21.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:04:21.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:04:21.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:04:12, diff=9.671864s, valid=True
2026-06-03T10:04:21.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:04:21.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:04:21.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:03:54, diff=27.680149s, valid=True
2026-06-03T10:04:21.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:04:21.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:04:21.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:04:21.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:04:21.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:04:21.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:04:21.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:04:12, diff=9.68402s, valid=True
2026-06-03T10:04:21.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:04:21.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:04:21.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:04:21.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48058.684857s, valid=False
2026-06-03T10:04:21.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:04:21.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:04:21.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:04:21.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:04:21.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:04:21.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:04:21.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:04:21.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:04:21.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:04:21.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:04:21.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:04:21.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:04:21.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:04:22.008 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:04:22.221 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:04:22.564 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:04:22.667 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:04:22.667 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:04:22.667 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:04:22.740 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:04:22.740 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:04:52.752 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:04:52.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:04:52.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:04:52.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:04:52.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:04:53.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:04:53.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:04:53.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:04:53.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:04:53.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:04:53.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:04:53.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:04:53.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:04:55.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:04:55.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:04:55.813 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:04:55.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:04:55.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:04:55.836 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:04:55.837 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:04:55.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:04:55.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:04:55.838 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:04:55.838 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:04:55.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:04:55.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:04:55.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:04:56.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:04:56.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:04:56.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:04:56.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:04:56.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:04:56.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:04:56.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:04:56.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:04:56.197 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:04:56.269 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:04:55
2026-06-03T10:04:56.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85741, datetime.datetime(2026, 6, 3, 10, 4, 55), datetime.datetime(2026, 6, 3, 10, 4, 55), 'salt', 7.08, 99.22, None, 44.42, 94.03, 0.11, 824.58, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:04:56.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:04:56.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:04:56.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:04:55, diff=1.275171s, valid=True
2026-06-03T10:04:56.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:04:56.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:04:56.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:05:12, diff=-15.721953s, valid=True
2026-06-03T10:04:56.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:04:56.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:04:56.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:04:55, diff=1.28475s, valid=True
2026-06-03T10:04:56.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:04:56.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:04:56.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:04:56.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:04:56.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:04:56.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:04:56.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:05:12, diff=-15.712187s, valid=True
2026-06-03T10:04:56.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:04:56.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:04:56.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:04:56.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48093.288481s, valid=False
2026-06-03T10:04:56.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:04:56.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:04:56.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:04:56.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:04:56.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:04:56.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:04:56.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:04:56.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:04:56.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:04:56.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:04:56.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:04:56.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:04:56.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:04:56.674 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:04:56.887 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:04:57.230 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:04:57.333 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:04:57.333 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:04:57.333 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:04:57.501 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:04:57.501 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:05:27.529 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:05:27.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:05:27.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:05:27.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:05:27.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:05:27.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:05:27.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:05:27.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:05:27.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:05:27.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:05:27.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:05:27.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:05:27.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:05:30.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:05:30.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:05:30.408 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:05:30.409 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:05:30.418 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:05:30.431 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:05:30.431 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:05:30.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:05:30.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:05:30.432 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:05:30.433 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:05:30.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:05:30.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:05:30.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:05:30.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:05:30.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:05:30.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:05:30.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:05:30.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:05:30.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:05:30.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:05:30.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:05:30.762 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:05:30.834 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:05:26
2026-06-03T10:05:30.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85742, datetime.datetime(2026, 6, 3, 10, 5, 26), datetime.datetime(2026, 6, 3, 10, 5, 25), 'salt', 7.11, 99.12, None, 48.58, 93.23, 0.12, 824.39, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T10:05:30.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:05:30.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:05:30.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:05:25, diff=5.841448s, valid=True
2026-06-03T10:05:30.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:05:30.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:05:30.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:05:12, diff=18.8452s, valid=True
2026-06-03T10:05:30.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:05:30.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:05:30.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:05:25, diff=5.853299s, valid=True
2026-06-03T10:05:30.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:05:30.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:05:30.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:05:30.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:05:30.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:05:30.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:05:30.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:05:12, diff=18.857001s, valid=True
2026-06-03T10:05:30.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:05:30.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:05:30.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:05:30.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48127.857807s, valid=False
2026-06-03T10:05:30.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:05:30.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:05:30.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:05:30.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:05:30.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:05:30.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:05:30.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:05:30.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:05:30.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:05:30.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:05:31.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:05:31.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:05:31.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:05:31.178 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:05:31.390 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:05:31.732 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:05:31.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:05:31.834 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:05:31.834 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:05:32.491 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:05:32.491 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:06:02.498 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:06:02.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:06:02.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:06:02.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:06:02.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:06:03.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:06:03.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:06:03.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:06:03.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:06:03.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:06:03.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:06:03.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:06:03.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:06:05.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:06:05.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:06:05.825 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:06:05.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:06:05.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:06:05.847 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:06:05.848 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:06:05.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:06:05.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:06:05.849 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:06:05.849 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:06:05.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:06:05.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:06:05.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:06:06.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:06:06.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:06:06.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:06:06.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:06:06.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:06:06.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:06:06.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:06:06.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:06:06.257 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:06:06.332 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:05:56
2026-06-03T10:06:06.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85743, datetime.datetime(2026, 6, 3, 10, 5, 56), datetime.datetime(2026, 6, 3, 10, 5, 55), 'salt', 7.14, 99.16, None, 38.0, 95.84, 0.11, 824.4, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:06:06.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:06:06.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:06:06.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:05:55, diff=11.338431s, valid=True
2026-06-03T10:06:06.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:06:06.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:06:06.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:06:12, diff=-5.658697s, valid=True
2026-06-03T10:06:06.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:06:06.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:06:06.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:05:55, diff=11.347924s, valid=True
2026-06-03T10:06:06.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:06:06.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:06:06.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:06:06.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:06:06.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:06:06.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:06:06.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:06:12, diff=-5.649087s, valid=True
2026-06-03T10:06:06.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:06:06.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:06:06.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:06:06.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48163.35155s, valid=False
2026-06-03T10:06:06.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:06:06.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:06:06.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:06:06.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:06:06.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:06:06.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:06:06.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:06:06.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:06:06.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:06:06.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:06:06.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:06:06.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:06:06.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:06:06.662 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:06:06.875 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:06:07.218 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:06:07.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:06:07.320 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:06:07.320 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:06:07.474 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:06:07.474 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:06:37.504 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:06:37.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:06:37.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:06:37.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:06:37.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:06:38.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:06:38.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:06:38.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:06:38.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:06:38.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:06:38.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:06:38.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:06:38.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:06:40.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:06:40.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:06:40.705 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:06:40.705 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:06:40.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:06:40.727 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:06:40.728 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:06:40.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:06:40.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:06:40.729 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:06:40.729 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:06:40.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:06:40.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:06:40.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:06:40.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:06:40.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:06:41.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:06:41.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:06:41.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:06:41.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:06:41.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:06:41.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:06:41.077 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:06:41.146 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:06:26
2026-06-03T10:06:41.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85744, datetime.datetime(2026, 6, 3, 10, 6, 26), datetime.datetime(2026, 6, 3, 10, 6, 25), 'salt', 7.11, 99.12, None, 39.2, 85.06, 0.12, 824.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:06:41.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:06:41.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:06:41.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:06:25, diff=16.153572s, valid=True
2026-06-03T10:06:41.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:06:41.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:06:41.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:06:12, diff=29.157087s, valid=True
2026-06-03T10:06:41.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:06:41.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:06:41.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:06:26, diff=15.165287s, valid=True
2026-06-03T10:06:41.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:06:41.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:06:41.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:06:41.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:06:41.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:06:41.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:06:41.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:06:12, diff=29.168906s, valid=True
2026-06-03T10:06:41.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:06:41.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:06:41.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:06:41.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48198.169708s, valid=False
2026-06-03T10:06:41.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:06:41.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:06:41.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:06:41.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:06:41.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:06:41.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:06:41.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:06:41.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:06:41.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:06:41.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:06:41.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:06:41.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:06:41.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:06:41.490 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:06:41.705 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:06:42.049 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:06:42.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:06:42.208 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:06:42.208 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:06:42.386 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:06:42.386 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:07:12.416 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:07:12.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:07:12.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:07:12.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:07:12.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:07:12.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:07:12.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:07:12.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:07:12.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:07:12.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:07:12.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:07:12.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:07:12.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:07:15.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:07:15.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:07:15.523 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:07:15.524 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:07:15.535 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:07:15.547 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:07:15.548 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:07:15.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:07:15.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:07:15.549 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:07:15.549 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:07:15.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:07:15.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:07:15.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:07:15.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:07:15.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:07:15.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:07:15.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:07:15.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:07:15.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:07:15.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:07:15.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:07:15.870 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:07:15.948 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:06:56
2026-06-03T10:07:15.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85745, datetime.datetime(2026, 6, 3, 10, 6, 56), datetime.datetime(2026, 6, 3, 10, 6, 56), 'salt', 7.11, 99.09, None, 32.28, 92.81, 0.13, 824.58, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:07:15.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:07:15.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:07:15.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:06:56, diff=19.954942s, valid=True
2026-06-03T10:07:15.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:07:15.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:07:15.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:07:12, diff=3.9578s, valid=True
2026-06-03T10:07:15.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:07:15.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:07:15.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:06:55, diff=20.964432s, valid=True
2026-06-03T10:07:15.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:07:15.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:07:15.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:07:15.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:07:15.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:07:15.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:07:15.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:07:12, diff=3.967485s, valid=True
2026-06-03T10:07:15.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:07:15.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:07:15.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:07:15.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48232.968157s, valid=False
2026-06-03T10:07:15.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:07:15.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:07:15.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:07:15.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:07:15.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:07:16.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:07:16.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:07:16.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:07:16.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:07:16.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:07:16.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:07:16.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:07:16.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:07:16.285 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:07:16.500 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:07:16.847 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:07:16.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:07:16.950 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:07:16.950 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:07:17.136 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:07:17.136 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:07:47.166 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:07:47.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:07:47.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:07:47.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:07:47.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:07:47.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:07:47.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:07:47.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:07:47.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:07:47.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:07:47.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:07:47.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:07:47.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:07:50.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:07:50.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:07:50.218 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:07:50.218 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:07:50.227 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:07:50.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:07:50.240 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:07:50.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:07:50.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:07:50.241 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:07:50.242 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:07:50.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:07:50.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:07:50.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:07:50.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:07:50.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:07:50.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T10:07:50.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:07:50.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T10:07:50.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:07:50.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:07:50.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:07:50.560 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:07:50.629 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:07:27
2026-06-03T10:07:50.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85746, datetime.datetime(2026, 6, 3, 10, 7, 27), datetime.datetime(2026, 6, 3, 10, 7, 26), 'salt', 7.11, 99.12, None, 37.37, 92.86, 0.12, 824.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:07:50.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:07:50.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:07:50.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:07:26, diff=24.637292s, valid=True
2026-06-03T10:07:50.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:07:50.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T10:07:50.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:07:12, diff=38.640794s, valid=True
2026-06-03T10:07:50.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:07:50.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:07:50.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:07:26, diff=24.648933s, valid=True
2026-06-03T10:07:50.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:07:50.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:07:50.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:07:50.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:07:50.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:07:50.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T10:07:50.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:07:12, diff=38.652743s, valid=True
2026-06-03T10:07:50.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:07:50.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:07:50.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:07:50.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48267.653546s, valid=False
2026-06-03T10:07:50.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:07:50.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:07:50.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:07:50.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:07:50.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:07:50.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:07:50.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:07:50.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:07:50.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:07:50.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:07:50.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:07:50.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:07:50.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:07:50.972 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:07:51.258 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:07:51.601 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:07:51.703 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:07:51.703 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:07:51.703 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:07:51.907 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:07:51.907 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:08:21.937 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:08:21.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:08:21.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:08:22.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:08:22.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:08:22.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:08:22.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:08:22.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:08:22.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:08:22.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:08:22.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:08:22.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:08:22.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:08:25.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:08:25.191 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:08:25.192 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:08:25.192 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:08:25.202 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:08:25.215 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:08:25.215 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:08:25.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:08:25.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:08:25.216 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:08:25.217 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:08:25.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:08:25.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:08:25.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:08:25.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:08:25.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:08:25.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:08:25.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:08:25.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:08:25.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:08:25.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:08:25.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:08:25.569 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:08:25.649 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:07:57
2026-06-03T10:08:25.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85747, datetime.datetime(2026, 6, 3, 10, 7, 57), datetime.datetime(2026, 6, 3, 10, 7, 56), 'salt', 7.08, 99.15, None, 41.25, 81.26, 0.12, 824.51, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:08:25.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:08:25.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:08:25.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:07:56, diff=29.657108s, valid=True
2026-06-03T10:08:25.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:08:25.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:08:25.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:08:12, diff=13.660584s, valid=True
2026-06-03T10:08:25.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:08:25.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:08:25.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:07:56, diff=29.668828s, valid=True
2026-06-03T10:08:25.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:08:25.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:08:25.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:08:25.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:08:25.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:08:25.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:08:25.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:08:12, diff=13.672552s, valid=True
2026-06-03T10:08:25.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:08:25.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:08:25.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:08:25.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48302.67337s, valid=False
2026-06-03T10:08:25.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:08:25.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:08:25.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:08:25.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:08:25.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:08:25.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:08:25.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:08:25.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:08:25.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:08:25.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:08:25.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:08:25.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:08:25.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:08:25.993 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:08:26.206 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:08:26.550 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:08:26.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:08:26.652 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:08:26.652 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:08:26.722 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:08:26.722 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:08:56.752 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:08:56.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:08:56.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:08:56.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:08:56.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:08:57.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:08:57.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:08:57.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:08:57.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:08:57.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:08:57.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:08:57.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:08:57.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:08:59.719 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:08:59.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:08:59.727 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:08:59.727 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:08:59.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:08:59.749 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:08:59.750 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:08:59.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:08:59.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:08:59.751 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:08:59.751 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:08:59.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:08:59.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:08:59.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:08:59.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:08:59.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:09:00.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:09:00.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:09:00.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:09:00.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:09:00.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:09:00.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:09:00.059 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:09:00.132 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:08:57
2026-06-03T10:09:00.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85749, datetime.datetime(2026, 6, 3, 10, 8, 57), datetime.datetime(2026, 6, 3, 10, 8, 57), 'salt', 7.11, 99.19, None, 44.1, 88.49, 0.11, 824.39, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:09:00.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:09:00.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:09:00.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:08:57, diff=3.139444s, valid=True
2026-06-03T10:09:00.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:09:00.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:09:00.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:09:12, diff=-11.857383s, valid=True
2026-06-03T10:09:00.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:09:00.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:09:00.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:08:57, diff=3.150605s, valid=True
2026-06-03T10:09:00.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:09:00.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:09:00.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:09:00.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:09:00.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:09:00.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:09:00.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:09:12, diff=-11.84583s, valid=True
2026-06-03T10:09:00.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:09:00.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:09:00.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:09:00.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48337.154907s, valid=False
2026-06-03T10:09:00.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:09:00.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:09:00.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:09:00.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:09:00.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:09:00.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:09:00.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:09:00.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:09:00.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:09:00.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:09:00.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:09:00.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:09:00.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:09:00.548 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:09:00.763 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:09:01.112 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:09:01.221 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:09:01.221 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:09:01.221 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:09:01.293 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:09:01.293 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:09:31.305 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:09:31.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:09:31.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:09:31.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:09:31.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:09:31.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:09:31.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:09:31.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:09:31.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:09:31.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:09:31.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:09:31.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:09:31.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:09:34.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:09:34.587 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:09:34.588 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:09:34.588 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:09:34.597 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:09:34.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:09:34.610 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:09:34.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:09:34.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:09:34.611 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:09:34.612 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:09:34.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:09:34.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:09:34.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:09:34.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:09:34.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:09:34.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:09:34.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:09:34.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:09:34.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:09:34.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:09:34.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:09:34.954 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:09:35.029 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:09:28
2026-06-03T10:09:35.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85750, datetime.datetime(2026, 6, 3, 10, 9, 28), datetime.datetime(2026, 6, 3, 10, 9, 28), 'salt', 7.01, 99.19, None, 37.93, 80.27, 0.11, 824.39, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:09:35.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:09:35.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:09:35.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:09:28, diff=7.036755s, valid=True
2026-06-03T10:09:35.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:09:35.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:09:35.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:09:12, diff=23.040276s, valid=True
2026-06-03T10:09:35.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:09:35.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:09:35.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:09:27, diff=8.048434s, valid=True
2026-06-03T10:09:35.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:09:35.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:09:35.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:09:35.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:09:35.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:09:35.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:09:35.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:09:12, diff=23.052174s, valid=True
2026-06-03T10:09:35.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:09:35.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:09:35.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:09:35.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48372.053s, valid=False
2026-06-03T10:09:35.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:09:35.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:09:35.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:09:35.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:09:35.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:09:35.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:09:35.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:09:35.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:09:35.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:09:35.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:09:35.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:09:35.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:09:35.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:09:35.377 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:09:35.589 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:09:35.932 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:09:36.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:09:36.034 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:09:36.034 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:09:36.106 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:09:36.106 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:10:06.136 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:10:06.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:10:06.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:10:06.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:10:06.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:10:06.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:10:06.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:10:06.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:10:06.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:10:06.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:10:06.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:10:06.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:10:06.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:10:09.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:10:09.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:10:09.045 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:10:09.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:10:09.055 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:10:09.068 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:10:09.068 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:10:09.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:10:09.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:10:09.070 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:10:09.070 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:10:09.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:10:09.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:10:09.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:10:09.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:10:09.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:10:09.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:10:09.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:10:09.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:10:09.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:10:09.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:10:09.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:10:09.438 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:10:09.519 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:09:59
2026-06-03T10:10:09.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85751, datetime.datetime(2026, 6, 3, 10, 9, 59), datetime.datetime(2026, 6, 3, 10, 9, 58), 'salt', 6.91, 99.12, None, 42.59, 95.98, 0.12, 824.46, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:10:09.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:10:09.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:10:09.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:09:58, diff=11.528311s, valid=True
2026-06-03T10:10:09.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:10:09.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:10:09.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:10:12, diff=-2.467541s, valid=True
2026-06-03T10:10:09.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:10:09.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:10:09.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:09:57, diff=12.542116s, valid=True
2026-06-03T10:10:09.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:10:09.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:10:09.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:10:09.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:10:09.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:10:09.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:10:09.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:10:12, diff=-2.453383s, valid=True
2026-06-03T10:10:09.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:10:09.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:10:09.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:10:09.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48406.547595s, valid=False
2026-06-03T10:10:09.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:10:09.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:10:09.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:10:09.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:10:09.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:10:09.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:10:09.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:10:09.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:10:09.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:10:09.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:10:09.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:10:09.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:10:09.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:10:10.011 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:10:10.281 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:10:10.628 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:10:10.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:10:10.736 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:10:10.736 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:10:10.892 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:10:10.892 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:10:40.899 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:10:40.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:10:40.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:10:41.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:10:41.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:10:41.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:10:41.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:10:41.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:10:41.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:10:41.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:10:41.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:10:41.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:10:41.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:10:44.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:10:44.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:10:44.541 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:10:44.541 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:10:44.551 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:10:44.563 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:10:44.564 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:10:44.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:10:44.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:10:44.565 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:10:44.565 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:10:44.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:10:44.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:10:44.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:10:44.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:10:44.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:10:44.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:10:44.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:10:44.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:10:44.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:10:44.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:10:44.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:10:44.897 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:10:44.969 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:10:29
2026-06-03T10:10:44.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85752, datetime.datetime(2026, 6, 3, 10, 10, 29), datetime.datetime(2026, 6, 3, 10, 10, 28), 'salt', 6.84, 99.09, None, 35.64, 91.38, 0.12, 824.63, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:10:44.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:10:44.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:10:44.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:10:28, diff=16.976567s, valid=True
2026-06-03T10:10:44.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:10:44.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:10:44.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:10:12, diff=32.980229s, valid=True
2026-06-03T10:10:44.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:10:44.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:10:44.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:10:27, diff=17.988574s, valid=True
2026-06-03T10:10:44.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:10:44.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:10:44.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:10:44.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:10:44.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:10:44.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:10:44.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:10:12, diff=32.992307s, valid=True
2026-06-03T10:10:44.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:10:44.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:10:44.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:10:44.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48441.993122s, valid=False
2026-06-03T10:10:44.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:10:44.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:10:44.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:10:44.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:10:44.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:10:45.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:10:45.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:10:45.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:10:45.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:10:45.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:10:45.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:10:45.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:10:45.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:10:45.322 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:10:45.547 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:10:45.891 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:10:45.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:10:45.994 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:10:45.994 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:10:46.182 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:10:46.182 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:11:16.205 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:11:16.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:11:16.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:11:16.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:11:16.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:11:16.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:11:16.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:11:16.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:11:16.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:11:16.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:11:16.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:11:16.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:11:16.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:11:19.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:11:19.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:11:19.343 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:11:19.343 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:11:19.354 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:11:19.366 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:11:19.367 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:11:19.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:11:19.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:11:19.368 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:11:19.368 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:11:19.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:11:19.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:11:19.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:11:19.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:11:19.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:11:19.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:11:19.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:11:19.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:11:19.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:11:19.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:11:19.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:11:19.696 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:11:19.766 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:10:59
2026-06-03T10:11:19.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85753, datetime.datetime(2026, 6, 3, 10, 10, 59), datetime.datetime(2026, 6, 3, 10, 10, 58), 'salt', 6.94, 99.19, None, 32.6, 101.36, 0.11, 824.63, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:11:19.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:11:19.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:11:19.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:10:58, diff=21.773907s, valid=True
2026-06-03T10:11:19.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:11:19.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:11:19.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:11:12, diff=7.777373s, valid=True
2026-06-03T10:11:19.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:11:19.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:11:19.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:10:59, diff=20.785399s, valid=True
2026-06-03T10:11:19.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:11:19.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:11:19.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:11:19.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:11:19.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:11:19.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:11:19.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:11:12, diff=7.78907s, valid=True
2026-06-03T10:11:19.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:11:19.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:11:19.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:11:19.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48476.789872s, valid=False
2026-06-03T10:11:19.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:11:19.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:11:19.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:11:19.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:11:19.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:11:19.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:11:19.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:11:19.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:11:19.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:11:19.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:11:19.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:11:20.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:11:20.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:11:20.130 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:11:20.343 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:11:20.687 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:11:20.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:11:20.789 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:11:20.789 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:11:20.986 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:11:21.048 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:11:51.068 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:11:51.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:11:51.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:11:51.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:11:51.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:11:51.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:11:51.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:11:51.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:11:51.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:11:51.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:11:51.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:11:51.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:11:51.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:11:54.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:11:54.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:11:54.132 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:11:54.132 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:11:54.142 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:11:54.155 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:11:54.155 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:11:54.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:11:54.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:11:54.156 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:11:54.156 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:11:54.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:11:54.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:11:54.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:11:54.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:11:54.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:11:54.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T10:11:54.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:11:54.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T10:11:54.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:11:54.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:11:54.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:11:54.450 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:11:54.519 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:11:29
2026-06-03T10:11:54.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85754, datetime.datetime(2026, 6, 3, 10, 11, 29), datetime.datetime(2026, 6, 3, 10, 11, 29), 'salt', 6.91, 99.19, None, 37.12, 87.18, 0.11, 824.39, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:11:54.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:11:54.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:11:54.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:11:29, diff=25.526955s, valid=True
2026-06-03T10:11:54.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:11:54.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T10:11:54.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:11:12, diff=42.530275s, valid=True
2026-06-03T10:11:54.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:11:54.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:11:54.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:11:28, diff=26.538132s, valid=True
2026-06-03T10:11:54.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:11:54.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:11:54.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:11:54.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:11:54.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:11:54.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T10:11:54.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:11:12, diff=42.541738s, valid=True
2026-06-03T10:11:54.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:11:54.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:11:54.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:11:54.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48511.542509s, valid=False
2026-06-03T10:11:54.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:11:54.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:11:54.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:11:54.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:11:54.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:11:54.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:11:54.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:11:54.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:11:54.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:11:54.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:11:54.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:11:54.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:11:54.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:11:54.860 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:11:55.071 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:11:55.473 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:11:55.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:11:55.574 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:11:55.574 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:11:55.800 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:11:55.800 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:12:25.830 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:12:25.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:12:25.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:12:26.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:12:26.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:12:26.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:12:26.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:12:26.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:12:26.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:12:26.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:12:26.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:12:26.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:12:26.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:12:29.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:12:29.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:12:29.143 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:12:29.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:12:29.153 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:12:29.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:12:29.167 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:12:29.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:12:29.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:12:29.168 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:12:29.168 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:12:29.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:12:29.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:12:29.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:12:29.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:12:29.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:12:29.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:12:29.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:12:29.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:12:29.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:12:29.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:12:29.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:12:29.504 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:12:29.575 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:12:00
2026-06-03T10:12:29.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85755, datetime.datetime(2026, 6, 3, 10, 12), datetime.datetime(2026, 6, 3, 10, 11, 59), 'salt', 6.84, 99.06, None, 39.73, 88.56, 0.13, 824.33, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:12:29.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:12:29.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:12:29.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:11:59, diff=30.582665s, valid=True
2026-06-03T10:12:29.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:12:29.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:12:29.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:12:12, diff=17.586156s, valid=True
2026-06-03T10:12:29.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:12:29.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:12:29.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:11:58, diff=31.594248s, valid=True
2026-06-03T10:12:29.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:12:29.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:12:29.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:12:29.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:12:29.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:12:29.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:12:29.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:12:12, diff=17.597988s, valid=True
2026-06-03T10:12:29.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:12:29.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:12:29.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:12:29.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48546.598809s, valid=False
2026-06-03T10:12:29.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:12:29.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:12:29.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:12:29.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:12:29.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:12:29.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:12:29.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:12:29.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:12:29.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:12:29.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:12:29.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:12:29.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:12:29.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:12:29.937 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:12:30.175 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:12:30.519 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:12:30.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:12:30.621 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:12:30.621 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:12:30.833 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:12:30.833 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:13:00.843 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:13:00.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:13:00.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:13:00.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:13:01.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:13:01.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:13:01.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:13:01.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:13:01.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:13:01.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:13:01.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:13:01.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:13:01.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:13:04.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:13:04.029 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:13:04.029 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:13:04.029 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:13:04.041 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:13:04.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:13:04.055 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:13:04.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:13:04.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:13:04.056 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:13:04.056 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:13:04.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:13:04.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:13:04.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:13:04.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:13:04.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:13:04.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:13:04.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:13:04.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:13:04.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:13:04.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:13:04.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:13:04.376 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:13:04.449 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:13:01
2026-06-03T10:13:04.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85757, datetime.datetime(2026, 6, 3, 10, 13, 1), datetime.datetime(2026, 6, 3, 10, 13), 'salt', 6.94, 99.19, None, 35.28, 94.52, 0.11, 824.45, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:13:04.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:13:04.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:13:04.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:13:00, diff=4.456412s, valid=True
2026-06-03T10:13:04.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:13:04.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:13:04.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:13:12, diff=-7.540062s, valid=True
2026-06-03T10:13:04.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:13:04.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:13:04.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:12:58, diff=6.468233s, valid=True
2026-06-03T10:13:04.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:13:04.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:13:04.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:13:04.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:13:04.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:13:04.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:13:04.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:13:12, diff=-7.528023s, valid=True
2026-06-03T10:13:04.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:13:04.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:13:04.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:13:04.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48581.472794s, valid=False
2026-06-03T10:13:04.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:13:04.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:13:04.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:13:04.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:13:04.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:13:04.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:13:04.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:13:04.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:13:04.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:13:04.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:13:04.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:13:04.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:13:04.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:13:04.865 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:13:05.078 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:13:05.422 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:13:05.523 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:13:05.523 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:13:05.523 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:13:05.754 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:13:05.754 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:13:35.764 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:13:35.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:13:35.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:13:35.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:13:35.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:13:36.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:13:36.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:13:36.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:13:36.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:13:36.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:13:36.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:13:36.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:13:36.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:13:38.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:13:38.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:13:38.724 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:13:38.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:13:38.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:13:38.747 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:13:38.748 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:13:38.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:13:38.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:13:38.749 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:13:38.749 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:13:38.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:13:38.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:13:38.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:13:38.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:13:38.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:13:39.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:13:39.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:13:39.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:13:39.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:13:39.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:13:39.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:13:39.060 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:13:39.137 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:13:31
2026-06-03T10:13:39.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85758, datetime.datetime(2026, 6, 3, 10, 13, 31), datetime.datetime(2026, 6, 3, 10, 13, 31), 'salt', 6.94, 99.19, None, 39.02, 82.93, 0.11, 824.39, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:13:39.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:13:39.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:13:39.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:13:31, diff=8.144276s, valid=True
2026-06-03T10:13:39.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:13:39.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:13:39.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:13:12, diff=27.147656s, valid=True
2026-06-03T10:13:39.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:13:39.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:13:39.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:13:28, diff=11.155561s, valid=True
2026-06-03T10:13:39.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:13:39.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:13:39.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:13:39.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:13:39.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:13:39.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:13:39.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:13:12, diff=27.1592s, valid=True
2026-06-03T10:13:39.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:13:39.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:13:39.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:13:39.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48616.159996s, valid=False
2026-06-03T10:13:39.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:13:39.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:13:39.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:13:39.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:13:39.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:13:39.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:13:39.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:13:39.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:13:39.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:13:39.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:13:39.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:13:39.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:13:39.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:13:39.479 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:13:39.693 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:13:40.048 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:13:40.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:13:40.159 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:13:40.159 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:13:40.241 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:13:40.241 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:14:10.270 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:14:10.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:14:10.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:14:10.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:14:10.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:14:10.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:14:10.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:14:10.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:14:10.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:14:10.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:14:10.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:14:10.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:14:10.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:14:13.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:14:13.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:14:13.376 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:14:13.377 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:14:13.387 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:14:13.400 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:14:13.400 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:14:13.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:14:13.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:14:13.401 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:14:13.401 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:14:13.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:14:13.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:14:13.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:14:13.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:14:13.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:14:13.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T10:14:13.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:14:13.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T10:14:13.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:14:13.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:14:13.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:14:13.730 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:14:13.803 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:14:01
2026-06-03T10:14:13.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85759, datetime.datetime(2026, 6, 3, 10, 14, 1), datetime.datetime(2026, 6, 3, 10, 14, 1), 'salt', 6.91, 99.19, None, 38.67, 96.66, 0.11, 824.39, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:14:13.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:14:13.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:14:13.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:14:01, diff=12.8104s, valid=True
2026-06-03T10:14:13.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:14:13.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T10:14:13.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:13:12, diff=61.813787s, valid=True
2026-06-03T10:14:13.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:14:13.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:14:13.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:13:59, diff=14.821676s, valid=True
2026-06-03T10:14:13.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:14:13.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:14:13.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:14:13.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:14:13.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:14:13.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T10:14:13.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:13:12, diff=61.825291s, valid=True
2026-06-03T10:14:13.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:14:13.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:14:13.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:14:13.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48650.826074s, valid=False
2026-06-03T10:14:13.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:14:13.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:14:13.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:14:13.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:14:13.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:14:13.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:14:13.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:14:13.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:14:13.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:14:13.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:14:14.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:14:14.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:14:14.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:14:14.224 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:14:14.438 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:14:14.784 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:14:14.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:14:14.889 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:14:14.889 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:14:15.083 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:14:15.084 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:14:45.110 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:14:45.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:14:45.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:14:45.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:14:45.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:14:45.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:14:45.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:14:45.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:14:45.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:14:45.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:14:45.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:14:45.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:14:45.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:14:48.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:14:48.211 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:14:48.212 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:14:48.212 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:14:48.221 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:14:48.234 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:14:48.234 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:14:48.235 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:14:48.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:14:48.235 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:14:48.236 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:14:48.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:14:48.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:14:48.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:14:48.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:14:48.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:14:48.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T10:14:48.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:14:48.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T10:14:48.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:14:48.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:14:48.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:14:48.569 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:14:48.644 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:14:32
2026-06-03T10:14:48.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85760, datetime.datetime(2026, 6, 3, 10, 14, 32), datetime.datetime(2026, 6, 3, 10, 14, 31), 'salt', 6.94, 99.19, None, 37.65, 97.18, 0.11, 824.39, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:14:48.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:14:48.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:14:48.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:14:31, diff=17.651332s, valid=True
2026-06-03T10:14:48.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:14:48.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T10:14:48.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:13:12, diff=96.654754s, valid=True
2026-06-03T10:14:48.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:14:48.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:14:48.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:14:29, diff=19.662734s, valid=True
2026-06-03T10:14:48.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:14:48.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:14:48.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:14:48.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:14:48.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:14:48.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T10:14:48.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:13:12, diff=96.666376s, valid=True
2026-06-03T10:14:48.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:14:48.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:14:48.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:14:48.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48685.667168s, valid=False
2026-06-03T10:14:48.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:14:48.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:14:48.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:14:48.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:14:48.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:14:48.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:14:48.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:14:48.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:14:48.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:14:48.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:14:48.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:14:48.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:14:48.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:14:48.986 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:14:49.198 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:14:49.553 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:14:49.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:14:49.654 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:14:49.654 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:14:49.740 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:14:49.740 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:15:19.771 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:15:19.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:15:19.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:15:20.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:15:20.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:15:20.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:15:20.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:15:20.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:15:20.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:15:20.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:15:20.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:15:20.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:15:20.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:15:22.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:15:22.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:15:22.957 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:15:22.957 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:15:22.965 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:15:22.977 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:15:22.977 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:15:22.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:15:22.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:15:22.978 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:15:22.978 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:15:22.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:15:23.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:15:23.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:15:23.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:15:23.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:15:23.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T10:15:23.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:15:23.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T10:15:23.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:15:23.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:15:23.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:15:23.261 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:15:23.331 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:15:02
2026-06-03T10:15:23.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85761, datetime.datetime(2026, 6, 3, 10, 15, 2), datetime.datetime(2026, 6, 3, 10, 15, 1), 'salt', 6.91, 99.15, None, 38.07, 91.71, 0.12, 824.33, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:15:23.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:15:23.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:15:23.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:15:01, diff=22.338487s, valid=True
2026-06-03T10:15:23.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:15:23.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T10:15:23.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:13:12, diff=131.341846s, valid=True
2026-06-03T10:15:23.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:15:23.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:15:23.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:15:00, diff=23.349487s, valid=True
2026-06-03T10:15:23.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:15:23.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:15:23.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:15:23.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:15:23.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:15:23.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T10:15:23.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:13:12, diff=131.352937s, valid=True
2026-06-03T10:15:23.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:15:23.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:15:23.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:15:23.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48720.353685s, valid=False
2026-06-03T10:15:23.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:15:23.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:15:23.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:15:23.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:15:23.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:15:23.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:15:23.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:15:23.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:15:23.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:15:23.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:15:23.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:15:23.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:15:23.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:15:23.757 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:15:24.002 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:15:24.362 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:15:24.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:15:24.466 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:15:24.466 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:15:24.695 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:15:24.695 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:15:54.725 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:15:54.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:15:54.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:15:55.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:15:55.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:15:55.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:15:55.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:15:55.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:15:55.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:15:55.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:15:55.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:15:55.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:15:55.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:15:57.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:15:57.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:15:57.976 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:15:57.976 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:15:57.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:15:57.999 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:15:57.999 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:15:58.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:15:58.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:15:58.000 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:15:58.000 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:15:58.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:15:58.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:15:58.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:15:58.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:15:58.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:15:58.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:15:58.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:15:58.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:15:58.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:15:58.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:15:58.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:15:58.336 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:15:58.410 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:15:32
2026-06-03T10:15:58.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85762, datetime.datetime(2026, 6, 3, 10, 15, 32), datetime.datetime(2026, 6, 3, 10, 15, 31), 'salt', 6.88, 99.12, None, 34.4, 89.78, 0.12, 824.33, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:15:58.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:15:58.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:15:58.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:15:31, diff=27.417122s, valid=True
2026-06-03T10:15:58.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:15:58.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:15:58.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:13:12, diff=166.420467s, valid=True
2026-06-03T10:15:58.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:15:58.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:15:58.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:15:32, diff=26.428259s, valid=True
2026-06-03T10:15:58.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:15:58.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:15:58.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:15:58.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:15:58.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:15:58.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:15:58.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:13:12, diff=166.431865s, valid=True
2026-06-03T10:15:58.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:15:58.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:15:58.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:15:58.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48755.432639s, valid=False
2026-06-03T10:15:58.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:15:58.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:15:58.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:15:58.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:15:58.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:15:58.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:15:58.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:15:58.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:15:58.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:15:58.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:15:58.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:15:58.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:15:58.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:15:58.760 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:15:58.971 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:15:59.320 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:15:59.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:15:59.422 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:15:59.422 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:15:59.603 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:15:59.603 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:16:29.613 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:16:29.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:16:29.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:16:29.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:16:29.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:16:30.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:16:30.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:16:30.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:16:30.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:16:30.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:16:30.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:16:30.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:16:30.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:16:32.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:16:32.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:16:32.931 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:16:32.932 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:16:32.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:16:32.954 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:16:32.955 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:16:32.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:16:32.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:16:32.956 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:16:32.956 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:16:32.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:16:33.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:16:33.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:16:33.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:16:33.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:16:33.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:16:33.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:16:33.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:16:33.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:16:33.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:16:33.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:16:33.312 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:16:33.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:16:33
2026-06-03T10:16:33.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85764, datetime.datetime(2026, 6, 3, 10, 16, 33), datetime.datetime(2026, 6, 3, 10, 16, 32), 'salt', 6.98, 99.22, None, 45.66, 100.13, 0.11, 824.33, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T10:16:33.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:16:33.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:16:33.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:16:32, diff=1.393383s, valid=True
2026-06-03T10:16:33.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:16:33.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:16:33.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:13:12, diff=201.39689s, valid=True
2026-06-03T10:16:33.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:16:33.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:16:33.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:16:30, diff=3.404901s, valid=True
2026-06-03T10:16:33.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:16:33.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:16:33.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:16:33.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:16:33.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:16:33.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:16:33.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:13:12, diff=201.408588s, valid=True
2026-06-03T10:16:33.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:16:33.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:16:33.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:16:33.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48790.409381s, valid=False
2026-06-03T10:16:33.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:16:33.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:16:33.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:16:33.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:16:33.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:16:33.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:16:33.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:16:33.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:16:33.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:16:33.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:16:33.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:16:33.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:16:33.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:16:33.730 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:16:33.943 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:16:34.288 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:16:34.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:16:34.390 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:16:34.390 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:16:34.637 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:16:34.637 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:17:04.638 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:17:04.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:17:04.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:17:04.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:17:04.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:17:04.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:17:04.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:17:04.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:17:04.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:17:05.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:17:05.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:17:05.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:17:05.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:17:07.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:17:07.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:17:07.695 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:17:07.696 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:17:07.706 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:17:07.718 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:17:07.719 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:17:07.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:17:07.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:17:07.720 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:17:07.721 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:17:07.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:17:07.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:17:07.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:17:07.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:17:07.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:17:08.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:17:08.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:17:08.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:17:08.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:17:08.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:17:08.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:17:08.054 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:17:08.127 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:17:03
2026-06-03T10:17:08.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85765, datetime.datetime(2026, 6, 3, 10, 17, 3), datetime.datetime(2026, 6, 3, 10, 17, 2), 'salt', 7.01, 99.22, None, 47.03, 90.98, 0.11, 824.33, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T10:17:08.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:17:08.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:17:08.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:17:02, diff=6.134942s, valid=True
2026-06-03T10:17:08.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:17:08.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:17:08.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:13:12, diff=236.138468s, valid=True
2026-06-03T10:17:08.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:17:08.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:17:08.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:17:00, diff=8.146849s, valid=True
2026-06-03T10:17:08.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:17:08.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:17:08.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:17:08.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:17:08.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:17:08.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:17:08.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:13:12, diff=236.150627s, valid=True
2026-06-03T10:17:08.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:17:08.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:17:08.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:17:08.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48825.151424s, valid=False
2026-06-03T10:17:08.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:17:08.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:17:08.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:17:08.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:17:08.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:17:08.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:17:08.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:17:08.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:17:08.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:17:08.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:17:08.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:17:08.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:17:08.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:17:08.471 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:17:08.744 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:17:09.086 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:17:09.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:17:09.189 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:17:09.189 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:17:09.392 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:17:09.393 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:17:39.417 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:17:39.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:17:39.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:17:39.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:17:39.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:17:39.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:17:39.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:17:39.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:17:39.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:17:39.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:17:39.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:17:39.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:17:39.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:17:42.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:17:42.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:17:42.641 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:17:42.641 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:17:42.651 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:17:42.664 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:17:42.665 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:17:42.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:17:42.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:17:42.666 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:17:42.666 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:17:42.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:17:42.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:17:42.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:17:42.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:17:42.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:17:42.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:17:42.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:17:43.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:17:43.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:17:43.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:17:43.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:17:43.052 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:17:43.125 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:17:33
2026-06-03T10:17:43.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85766, datetime.datetime(2026, 6, 3, 10, 17, 33), datetime.datetime(2026, 6, 3, 10, 17, 32), 'salt', 6.98, 99.22, None, 34.51, 100.72, 0.11, 824.32, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:17:43.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:17:43.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:17:43.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:17:32, diff=11.133245s, valid=True
2026-06-03T10:17:43.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:17:43.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:17:43.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:18:12, diff=-28.863133s, valid=True
2026-06-03T10:17:43.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:17:43.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:17:43.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:17:30, diff=13.145489s, valid=True
2026-06-03T10:17:43.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:17:43.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:17:43.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:17:43.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:17:43.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:17:43.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:17:43.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:18:12, diff=-28.850632s, valid=True
2026-06-03T10:17:43.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:17:43.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:17:43.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:17:43.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48860.150241s, valid=False
2026-06-03T10:17:43.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:17:43.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:17:43.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:17:43.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:17:43.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:17:43.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:17:43.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:17:43.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:17:43.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:17:43.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:17:43.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:17:43.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:17:43.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:17:43.472 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:17:43.685 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:17:44.028 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:17:44.132 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:17:44.133 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:17:44.133 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:17:44.337 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:17:44.337 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:18:14.367 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:18:14.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:18:14.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:18:14.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:18:14.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:18:14.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:18:14.768 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:18:14.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:18:14.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:18:14.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:18:14.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:18:14.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:18:14.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:18:17.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:18:17.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:18:17.333 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:18:17.333 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:18:17.345 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:18:17.358 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:18:17.358 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:18:17.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:18:17.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:18:17.359 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:18:17.360 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:18:17.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:18:17.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:18:17.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:18:17.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:18:17.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:18:17.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:18:17.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:18:17.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:18:17.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:18:17.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:18:17.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:18:17.714 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:18:17.782 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:18:03
2026-06-03T10:18:17.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85767, datetime.datetime(2026, 6, 3, 10, 18, 3), datetime.datetime(2026, 6, 3, 10, 18, 3), 'salt', 6.98, 99.15, None, 36.8, 98.14, 0.12, 824.26, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:18:17.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:18:17.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:18:17.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:18:03, diff=14.789921s, valid=True
2026-06-03T10:18:17.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:18:17.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:18:17.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:18:12, diff=5.793452s, valid=True
2026-06-03T10:18:17.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:18:17.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:18:17.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:18:00, diff=17.801881s, valid=True
2026-06-03T10:18:17.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:18:17.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:18:17.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:18:17.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:18:17.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:18:17.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:18:17.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:18:12, diff=5.805596s, valid=True
2026-06-03T10:18:17.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:18:17.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:18:17.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:18:17.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48894.806403s, valid=False
2026-06-03T10:18:17.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:18:17.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:18:17.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:18:17.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:18:17.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:18:17.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:18:17.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:18:17.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:18:17.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:18:17.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:18:18.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:18:18.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:18:18.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:18:18.201 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:18:18.412 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:18:18.757 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:18:18.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:18:18.859 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:18:18.859 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:18:19.010 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:18:19.011 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:18:49.012 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:18:49.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:18:49.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:18:49.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:18:49.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:18:49.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:18:49.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:18:49.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:18:49.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:18:49.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:18:49.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:18:49.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:18:49.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:18:52.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:18:52.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:18:52.375 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:18:52.375 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:18:52.385 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:18:52.398 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:18:52.399 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:18:52.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:18:52.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:18:52.400 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:18:52.400 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:18:52.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:18:52.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:18:52.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:18:52.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:18:52.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:18:52.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:18:52.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:18:52.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:18:52.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:18:52.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:18:52.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:18:52.745 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:18:52.825 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:18:34
2026-06-03T10:18:52.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85768, datetime.datetime(2026, 6, 3, 10, 18, 34), datetime.datetime(2026, 6, 3, 10, 18, 33), 'salt', 7.01, 99.18, None, 36.41, 91.64, 0.11, 824.2, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:18:52.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:18:52.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:18:52.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:18:33, diff=19.833166s, valid=True
2026-06-03T10:18:52.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:18:52.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:18:52.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:19:12, diff=-19.163315s, valid=True
2026-06-03T10:18:52.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:18:52.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:18:52.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:18:31, diff=21.844869s, valid=True
2026-06-03T10:18:52.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:18:52.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:18:52.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:18:52.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:18:52.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:18:52.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:18:52.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:19:12, diff=-19.15139s, valid=True
2026-06-03T10:18:52.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:18:52.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:18:52.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:18:52.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48929.849426s, valid=False
2026-06-03T10:18:52.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:18:52.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:18:52.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:18:52.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:18:52.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:18:52.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:18:52.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:18:52.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:18:52.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:18:52.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:18:53.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:18:53.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:18:53.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:18:53.171 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:18:53.383 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:18:53.727 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:18:53.828 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:18:53.829 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:18:53.829 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:18:53.986 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:18:53.986 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:19:24.014 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:19:24.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:19:24.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:19:24.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:19:24.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:19:24.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:19:24.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:19:24.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:19:24.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:19:24.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:19:24.458 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:19:24.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:19:24.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:19:27.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:19:27.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:19:27.035 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:19:27.036 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:19:27.047 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:19:27.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:19:27.066 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:19:27.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:19:27.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:19:27.067 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:19:27.067 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:19:27.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:19:27.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:19:27.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:19:27.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:19:27.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:19:27.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:19:27.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:19:27.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:19:27.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:19:27.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:19:27.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:19:27.457 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:19:27.532 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:19:04
2026-06-03T10:19:27.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85769, datetime.datetime(2026, 6, 3, 10, 19, 4), datetime.datetime(2026, 6, 3, 10, 19, 3), 'salt', 7.04, 99.22, None, 47.81, 84.5, 0.11, 824.08, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T10:19:27.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:19:27.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:19:27.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:19:03, diff=24.540551s, valid=True
2026-06-03T10:19:27.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:19:27.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:19:27.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:19:12, diff=15.544224s, valid=True
2026-06-03T10:19:27.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:19:27.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:19:27.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:19:01, diff=26.552824s, valid=True
2026-06-03T10:19:27.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:19:27.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:19:27.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:19:27.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:19:27.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:19:27.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:19:27.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:19:12, diff=15.556775s, valid=True
2026-06-03T10:19:27.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:19:27.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:19:27.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:19:27.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48964.55765s, valid=False
2026-06-03T10:19:27.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:19:27.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:19:27.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:19:27.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:19:27.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:19:27.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:19:27.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:19:27.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:19:27.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:19:27.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:19:27.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:19:27.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:19:27.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:19:27.948 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:19:28.165 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:19:28.513 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:19:28.616 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:19:28.616 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:19:28.616 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:19:28.851 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:19:28.851 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:19:58.874 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:19:58.874 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:19:58.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:19:59.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:19:59.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:19:59.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:19:59.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:19:59.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:19:59.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:19:59.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:19:59.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:19:59.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:19:59.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:20:01.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:20:01.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:20:01.845 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:20:01.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:20:01.853 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:20:01.865 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:20:01.865 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:20:01.865 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:20:01.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:20:01.866 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:20:01.866 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:20:01.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:20:01.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:20:01.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:20:02.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:20:02.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:20:02.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:20:02.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:20:02.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:20:02.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:20:02.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:20:02.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:20:02.198 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:20:02.267 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:19:34
2026-06-03T10:20:02.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85770, datetime.datetime(2026, 6, 3, 10, 19, 34), datetime.datetime(2026, 6, 3, 10, 19, 34), 'salt', 7.11, 99.15, None, 47.74, 94.95, 0.12, 824.08, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T10:20:02.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:20:02.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:20:02.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:19:34, diff=28.279521s, valid=True
2026-06-03T10:20:02.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:20:02.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:20:02.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:20:12, diff=-9.714442s, valid=True
2026-06-03T10:20:02.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:20:02.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:20:02.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:19:32, diff=30.300152s, valid=True
2026-06-03T10:20:02.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:20:02.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:20:02.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:20:02.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:20:02.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:20:02.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:20:02.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:20:12, diff=-9.694209s, valid=True
2026-06-03T10:20:02.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:20:02.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:20:02.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:20:02.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=48999.306499s, valid=False
2026-06-03T10:20:02.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:20:02.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:20:02.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:20:02.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:20:02.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:20:02.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:20:02.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:20:02.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:20:02.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:20:02.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:20:02.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:20:02.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:20:02.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:20:02.628 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:20:02.843 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:20:03.189 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:20:03.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:20:03.291 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:20:03.292 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:20:04.474 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:20:04.474 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:20:34.504 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:20:34.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:20:34.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:20:34.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:20:34.674 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:20:34.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:20:34.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:20:34.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:20:34.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:20:34.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:20:34.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:20:34.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:20:34.939 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:20:37.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:20:37.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:20:37.728 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:20:37.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:20:37.739 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:20:37.751 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:20:37.752 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:20:37.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:20:37.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:20:37.753 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:20:37.753 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:20:37.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:20:37.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:20:37.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:20:38.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:20:38.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:20:38.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:20:38.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:20:38.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:20:38.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:20:38.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:20:38.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:20:38.228 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:20:38.301 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:20:35
2026-06-03T10:20:38.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85772, datetime.datetime(2026, 6, 3, 10, 20, 35), datetime.datetime(2026, 6, 3, 10, 20, 34), 'salt', 7.11, 99.18, None, 46.04, 98.8, 0.12, 824.26, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T10:20:38.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:20:38.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:20:38.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:20:34, diff=4.308013s, valid=True
2026-06-03T10:20:38.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:20:38.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:20:38.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:21:12, diff=-33.689112s, valid=True
2026-06-03T10:20:38.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:20:38.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:20:38.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:20:32, diff=6.317533s, valid=True
2026-06-03T10:20:38.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:20:38.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:20:38.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:20:38.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:20:38.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:20:38.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:20:38.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:21:12, diff=-33.679452s, valid=True
2026-06-03T10:20:38.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:20:38.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:20:38.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:20:38.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49035.321206s, valid=False
2026-06-03T10:20:38.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:20:38.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:20:38.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:20:38.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:20:38.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:20:38.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:20:38.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:20:38.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:20:38.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:20:38.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:20:38.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:20:38.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:20:38.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:20:38.634 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:20:38.848 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:20:39.195 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:20:39.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:20:39.298 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:20:39.298 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:20:39.512 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:20:39.512 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:21:09.542 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:21:09.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:21:09.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:21:09.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:21:09.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:21:09.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:21:09.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:21:09.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:21:09.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:21:09.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:21:09.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:21:09.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:21:09.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:21:12.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:21:12.378 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:21:12.378 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:21:12.379 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:21:12.390 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:21:12.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:21:12.404 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:21:12.404 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:21:12.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:21:12.405 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:21:12.405 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:21:12.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:21:12.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:21:12.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:21:12.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:21:12.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:21:12.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:21:12.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:21:12.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:21:12.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:21:12.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:21:12.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:21:12.767 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:21:12.837 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:21:05
2026-06-03T10:21:12.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85773, datetime.datetime(2026, 6, 3, 10, 21, 5), datetime.datetime(2026, 6, 3, 10, 21, 4), 'salt', 7.11, 99.25, None, 46.19, 95.18, 0.11, 824.26, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T10:21:12.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:21:12.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:21:12.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:21:04, diff=8.844882s, valid=True
2026-06-03T10:21:12.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:21:12.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:21:12.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:21:12, diff=0.848517s, valid=True
2026-06-03T10:21:12.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:21:12.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:21:12.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:21:02, diff=10.857091s, valid=True
2026-06-03T10:21:12.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:21:12.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:21:12.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:21:12.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:21:12.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:21:12.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:21:12.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:21:12, diff=0.86098s, valid=True
2026-06-03T10:21:12.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:21:12.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:21:12.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:21:12.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49069.861856s, valid=False
2026-06-03T10:21:12.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:21:12.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:21:12.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:21:12.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:21:12.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:21:12.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:21:12.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:21:12.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:21:12.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:21:13.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:21:13.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:21:13.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:21:13.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:21:13.194 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:21:13.408 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:21:13.753 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:21:13.913 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:21:13.913 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:21:13.913 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:21:14.145 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:21:14.145 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:21:44.176 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:21:44.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:21:44.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:21:44.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:21:44.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:21:44.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:21:44.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:21:44.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:21:44.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:21:44.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:21:44.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:21:44.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:21:44.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:21:46.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:21:46.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:21:46.999 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:21:46.999 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:21:47.009 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:21:47.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:21:47.022 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:21:47.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:21:47.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:21:47.024 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:21:47.024 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:21:47.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:21:47.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:21:47.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:21:47.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:21:47.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:21:47.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:21:47.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:21:47.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:21:47.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:21:47.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:21:47.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:21:47.354 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:21:47.424 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:21:35
2026-06-03T10:21:47.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85774, datetime.datetime(2026, 6, 3, 10, 21, 35), datetime.datetime(2026, 6, 3, 10, 21, 35), 'salt', 6.97, 99.12, None, 47.7, 101.17, 0.12, 824.08, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T10:21:47.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:21:47.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:21:47.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:21:35, diff=12.431611s, valid=True
2026-06-03T10:21:47.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:21:47.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:21:47.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:22:12, diff=-24.564892s, valid=True
2026-06-03T10:21:47.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:21:47.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:21:47.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:21:32, diff=15.443342s, valid=True
2026-06-03T10:21:47.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:21:47.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:21:47.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:21:47.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:21:47.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:21:47.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:21:47.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:22:12, diff=-24.552888s, valid=True
2026-06-03T10:21:47.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:21:47.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:21:47.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:21:47.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49104.447935s, valid=False
2026-06-03T10:21:47.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:21:47.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:21:47.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:21:47.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:21:47.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:21:47.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:21:47.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:21:47.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:21:47.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:21:47.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:21:47.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:21:47.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:21:47.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:21:47.771 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:21:47.988 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:21:48.338 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:21:48.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:21:48.441 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:21:48.441 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:21:48.510 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:21:48.510 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:22:18.540 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:22:18.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:22:18.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:22:18.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:22:18.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:22:18.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:22:18.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:22:18.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:22:18.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:22:18.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:22:18.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:22:18.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:22:18.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:22:21.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:22:21.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:22:21.295 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:22:21.295 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:22:21.307 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:22:21.320 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:22:21.320 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:22:21.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:22:21.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:22:21.322 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:22:21.322 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:22:21.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:22:21.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:22:21.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:22:21.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:22:21.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:22:21.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:22:21.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:22:21.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:22:21.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:22:21.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:22:21.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:22:21.667 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:22:21.736 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:22:06
2026-06-03T10:22:21.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85775, datetime.datetime(2026, 6, 3, 10, 22, 6), datetime.datetime(2026, 6, 3, 10, 22, 5), 'salt', 7.04, 99.25, None, 37.37, 110.53, 0.1, 824.32, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:22:21.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:22:21.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:22:21.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:22:05, diff=16.743541s, valid=True
2026-06-03T10:22:21.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:22:21.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:22:21.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:22:12, diff=9.746915s, valid=True
2026-06-03T10:22:21.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:22:21.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:22:21.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:22:02, diff=19.754793s, valid=True
2026-06-03T10:22:21.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:22:21.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:22:21.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:22:21.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:22:21.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:22:21.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:22:21.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:22:12, diff=9.758389s, valid=True
2026-06-03T10:22:21.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:22:21.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:22:21.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:22:21.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49138.759182s, valid=False
2026-06-03T10:22:21.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:22:21.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:22:21.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:22:21.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:22:21.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:22:21.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:22:21.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:22:21.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:22:21.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:22:21.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:22:21.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:22:21.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:22:22.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:22:22.078 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:22:22.369 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:22:22.715 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:22:22.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:22:22.817 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:22:22.817 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:22:22.970 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:22:22.970 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:22:53.000 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:22:53.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:22:53.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:22:53.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:22:53.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:22:53.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:22:53.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:22:53.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:22:53.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:22:53.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:22:53.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:22:53.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:22:53.427 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:22:55.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:22:55.881 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:22:55.882 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:22:55.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:22:55.892 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:22:55.905 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:22:55.906 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:22:55.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:22:55.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:22:55.907 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:22:55.907 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:22:55.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:22:56.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:22:56.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:22:56.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:22:56.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:22:56.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:22:56.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:22:56.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:22:56.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:22:56.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:22:56.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:22:56.387 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:22:56.478 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:22:36
2026-06-03T10:22:56.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85776, datetime.datetime(2026, 6, 3, 10, 22, 36), datetime.datetime(2026, 6, 3, 10, 22, 35), 'salt', 6.97, 99.22, None, 36.02, 102.88, 0.1, 824.38, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:22:56.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:22:56.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:22:56.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:22:35, diff=21.487357s, valid=True
2026-06-03T10:22:56.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:22:56.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:22:56.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:23:12, diff=-15.508526s, valid=True
2026-06-03T10:22:56.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:22:56.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:22:56.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:22:32, diff=24.500962s, valid=True
2026-06-03T10:22:56.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:22:56.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:22:56.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:22:56.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:22:56.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:22:56.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:22:56.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:23:12, diff=-15.494643s, valid=True
2026-06-03T10:22:56.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:22:56.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:22:56.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:22:56.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49173.506314s, valid=False
2026-06-03T10:22:56.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:22:56.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:22:56.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:22:56.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:22:56.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:22:56.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:22:56.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:22:56.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:22:56.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:22:56.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:22:56.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:22:56.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:22:56.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:22:56.833 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:22:57.047 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:22:57.396 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:22:57.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:22:57.500 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:22:57.500 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:22:57.566 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:22:57.566 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:23:27.597 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:23:27.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:23:27.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:23:27.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:23:27.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:23:28.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:23:28.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:23:28.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:23:28.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:23:28.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:23:28.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:23:28.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:23:28.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:23:30.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:23:30.518 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:23:30.518 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:23:30.518 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:23:30.527 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:23:30.539 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:23:30.539 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:23:30.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:23:30.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:23:30.540 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:23:30.540 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:23:30.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:23:30.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:23:30.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:23:30.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:23:30.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:23:30.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:23:30.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:23:30.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:23:30.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:23:30.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:23:30.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:23:30.830 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:23:30.904 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:23:06
2026-06-03T10:23:30.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85777, datetime.datetime(2026, 6, 3, 10, 23, 6), datetime.datetime(2026, 6, 3, 10, 23, 5), 'salt', 6.94, 99.28, None, 39.48, 92.76, 0.1, 824.14, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:23:30.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:23:30.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:23:30.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:23:05, diff=25.911374s, valid=True
2026-06-03T10:23:30.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:23:30.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:23:30.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:23:12, diff=18.914695s, valid=True
2026-06-03T10:23:30.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:23:30.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:23:30.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:23:03, diff=27.922349s, valid=True
2026-06-03T10:23:30.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:23:30.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:23:30.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:23:30.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:23:30.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:23:30.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:23:30.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:23:12, diff=18.925882s, valid=True
2026-06-03T10:23:30.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:23:30.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:23:30.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:23:30.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49207.92667s, valid=False
2026-06-03T10:23:30.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:23:30.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:23:30.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:23:30.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:23:30.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:23:30.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:23:30.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:23:30.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:23:31.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:23:31.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:23:31.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:23:31.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:23:31.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:23:31.317 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:23:31.531 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:23:31.877 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:23:31.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:23:31.982 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:23:31.982 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:23:32.063 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:23:32.063 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:24:02.093 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:24:02.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:24:02.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:24:02.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:24:02.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:24:02.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:24:02.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:24:02.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:24:02.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:24:02.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:24:02.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:24:02.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:24:02.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:24:04.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:24:04.982 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:24:04.983 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:24:04.984 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:24:04.993 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:24:05.006 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:24:05.006 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:24:05.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:24:05.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:24:05.007 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:24:05.008 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:24:05.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:24:05.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:24:05.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:24:05.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:24:05.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:24:05.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:24:05.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:24:05.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:24:05.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:24:05.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:24:05.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:24:05.335 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:24:05.408 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:23:37
2026-06-03T10:24:05.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85778, datetime.datetime(2026, 6, 3, 10, 23, 37), datetime.datetime(2026, 6, 3, 10, 23, 36), 'salt', 6.91, 99.25, None, 38.49, 88.7, 0.11, 824.26, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:24:05.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:24:05.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:24:05.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:23:36, diff=29.41617s, valid=True
2026-06-03T10:24:05.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:24:05.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:24:05.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:24:12, diff=-6.580299s, valid=True
2026-06-03T10:24:05.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:24:05.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:24:05.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:23:33, diff=32.428991s, valid=True
2026-06-03T10:24:05.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:24:05.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:24:05.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:24:05.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:24:05.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:24:05.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:24:05.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:24:12, diff=-6.56723s, valid=True
2026-06-03T10:24:05.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:24:05.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:24:05.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:24:05.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49242.433584s, valid=False
2026-06-03T10:24:05.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:24:05.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:24:05.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:24:05.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:24:05.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:24:05.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:24:05.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:24:05.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:24:05.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:24:05.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:24:05.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:24:05.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:24:05.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:24:05.755 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:24:05.971 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:24:06.317 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:24:06.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:24:06.420 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:24:06.420 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:24:06.539 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:24:06.539 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:24:36.570 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:24:36.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:24:36.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:24:36.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:24:36.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:24:36.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:24:36.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:24:36.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:24:36.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:24:36.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:24:36.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:24:37.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:24:37.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:24:39.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:24:39.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:24:39.417 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:24:39.417 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:24:39.427 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:24:39.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:24:39.440 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:24:39.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:24:39.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:24:39.442 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:24:39.442 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:24:39.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:24:39.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:24:39.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:24:39.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:24:39.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:24:39.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:24:39.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:24:39.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:24:39.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:24:39.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:24:39.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:24:39.793 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:24:39.871 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:24:37
2026-06-03T10:24:39.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85780, datetime.datetime(2026, 6, 3, 10, 24, 37), datetime.datetime(2026, 6, 3, 10, 24, 37), 'salt', 7.07, 99.28, None, 39.2, 85.93, 0.09, 824.02, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:24:39.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:24:39.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:24:39.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:24:37, diff=2.877407s, valid=True
2026-06-03T10:24:39.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:24:39.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:24:39.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:25:12, diff=-32.119695s, valid=True
2026-06-03T10:24:39.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:24:39.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:24:39.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:24:36, diff=3.887264s, valid=True
2026-06-03T10:24:39.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:24:39.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:24:39.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:24:39.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:24:39.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:24:39.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:24:39.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:25:12, diff=-32.109174s, valid=True
2026-06-03T10:24:39.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:24:39.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:24:39.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:24:39.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49276.891656s, valid=False
2026-06-03T10:24:39.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:24:39.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:24:39.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:24:39.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:24:39.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:24:39.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:24:39.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:24:39.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:24:39.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:24:40.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:24:40.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:24:40.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:24:40.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:24:40.293 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:24:40.521 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:24:40.864 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:24:40.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:24:40.967 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:24:40.967 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:24:41.131 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:24:41.131 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:25:11.134 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:25:11.134 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:25:11.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:25:11.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:25:11.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:25:11.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:25:11.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:25:11.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:25:11.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:25:11.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:25:11.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:25:11.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:25:11.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:25:14.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:25:14.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:25:14.299 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:25:14.300 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:25:14.310 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:25:14.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:25:14.323 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:25:14.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:25:14.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:25:14.325 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:25:14.325 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:25:14.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:25:14.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:25:14.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:25:14.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:25:14.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:25:14.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:25:14.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:25:14.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:25:14.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:25:14.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:25:14.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:25:14.670 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:25:14.742 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:25:08
2026-06-03T10:25:14.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85781, datetime.datetime(2026, 6, 3, 10, 25, 8), datetime.datetime(2026, 6, 3, 10, 25, 7), 'salt', 6.94, 99.12, None, 49.11, 79.78, 0.12, 824.08, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T10:25:14.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:25:14.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:25:14.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:25:07, diff=7.74961s, valid=True
2026-06-03T10:25:14.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:25:14.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:25:14.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:25:12, diff=2.75308s, valid=True
2026-06-03T10:25:14.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:25:14.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:25:14.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:25:03, diff=11.761261s, valid=True
2026-06-03T10:25:14.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:25:14.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:25:14.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:25:14.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:25:14.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:25:14.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:25:14.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:25:12, diff=2.764962s, valid=True
2026-06-03T10:25:14.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:25:14.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:25:14.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:25:14.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49311.765775s, valid=False
2026-06-03T10:25:14.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:25:14.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:25:14.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:25:14.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:25:14.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:25:14.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:25:14.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:25:14.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:25:14.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:25:14.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:25:14.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:25:14.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:25:15.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:25:15.084 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:25:15.296 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:25:15.638 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:25:15.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:25:15.743 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:25:15.743 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:25:15.816 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:25:15.816 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:25:45.846 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:25:45.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:25:45.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:25:45.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:25:46.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:25:46.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:25:46.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:25:46.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:25:46.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:25:46.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:25:46.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:25:46.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:25:46.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:25:48.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:25:48.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:25:48.905 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:25:48.905 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:25:48.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:25:48.928 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:25:48.928 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:25:48.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:25:48.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:25:48.929 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:25:48.930 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:25:48.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:25:49.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:25:49.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:25:49.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:25:49.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:25:49.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:25:49.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:25:49.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:25:49.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:25:49.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:25:49.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:25:49.285 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:25:49.358 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:25:38
2026-06-03T10:25:49.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85782, datetime.datetime(2026, 6, 3, 10, 25, 38), datetime.datetime(2026, 6, 3, 10, 25, 37), 'salt', 7.11, 99.25, None, 35.74, 83.58, 0.1, 824.02, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:25:49.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:25:49.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:25:49.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:25:37, diff=12.366451s, valid=True
2026-06-03T10:25:49.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:25:49.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:25:49.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:26:12, diff=-22.629948s, valid=True
2026-06-03T10:25:49.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:25:49.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:25:49.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:25:34, diff=15.378389s, valid=True
2026-06-03T10:25:49.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:25:49.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:25:49.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:25:49.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:25:49.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:25:49.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:25:49.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:26:12, diff=-22.617764s, valid=True
2026-06-03T10:25:49.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:25:49.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:25:49.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:25:49.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49346.383077s, valid=False
2026-06-03T10:25:49.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:25:49.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:25:49.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:25:49.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:25:49.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:25:49.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:25:49.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:25:49.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:25:49.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:25:49.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:25:49.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:25:49.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:25:49.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:25:49.702 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:25:49.930 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:25:50.282 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:25:50.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:25:50.384 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:25:50.384 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:25:52.919 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:25:52.920 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:26:22.950 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:26:22.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:26:22.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:26:23.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:26:23.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:26:23.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:26:23.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:26:23.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:26:23.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:26:23.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:26:23.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:26:23.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:26:23.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:26:25.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:26:25.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:26:25.925 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:26:25.925 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:26:25.937 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:26:25.949 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:26:25.950 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:26:25.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:26:25.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:26:25.951 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:26:25.951 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:26:25.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:26:26.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:26:26.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:26:26.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:26:26.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:26:26.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:26:26.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:26:26.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:26:26.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:26:26.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:26:26.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:26:26.310 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:26:26.415 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:26:08
2026-06-03T10:26:26.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85783, datetime.datetime(2026, 6, 3, 10, 26, 8), datetime.datetime(2026, 6, 3, 10, 26, 8), 'salt', 7.14, 99.18, None, 40.51, 101.28, 0.11, 824.02, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:26:26.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:26:26.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:26:26.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:26:08, diff=18.423037s, valid=True
2026-06-03T10:26:26.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:26:26.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:26:26.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:26:12, diff=14.426661s, valid=True
2026-06-03T10:26:26.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:26:26.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:26:26.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:26:04, diff=22.435235s, valid=True
2026-06-03T10:26:26.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:26:26.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:26:26.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:26:26.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:26:26.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:26:26.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:26:26.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:26:12, diff=14.439124s, valid=True
2026-06-03T10:26:26.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:26:26.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:26:26.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:26:26.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49383.439962s, valid=False
2026-06-03T10:26:26.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:26:26.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:26:26.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:26:26.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:26:26.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:26:26.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:26:26.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:26:26.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:26:26.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:26:26.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:26:26.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:26:26.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:26:26.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:26:26.760 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:26:26.972 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:26:27.373 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:26:27.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:26:27.475 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:26:27.475 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:26:27.542 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:26:27.542 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:26:57.572 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:26:57.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:26:57.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:26:57.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:26:57.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:26:58.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:26:58.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:26:58.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:26:58.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:26:58.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:26:58.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:26:58.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:26:58.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:27:00.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:27:00.690 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:27:00.691 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:27:00.691 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:27:00.701 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:27:00.714 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:27:00.714 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:27:00.715 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:27:00.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:27:00.716 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:27:00.716 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:27:00.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:27:00.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:27:00.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:27:00.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:27:00.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:27:01.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:27:01.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:27:01.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:27:01.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:27:01.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:27:01.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:27:01.070 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:27:01.160 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:26:38
2026-06-03T10:27:01.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85784, datetime.datetime(2026, 6, 3, 10, 26, 38), datetime.datetime(2026, 6, 3, 10, 26, 38), 'salt', 7.14, 99.28, None, 46.22, 85.98, 0.1, 824.02, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T10:27:01.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:27:01.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:27:01.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:26:38, diff=23.168203s, valid=True
2026-06-03T10:27:01.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:27:01.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:27:01.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:27:12, diff=-10.828023s, valid=True
2026-06-03T10:27:01.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:27:01.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:27:01.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:26:34, diff=27.180681s, valid=True
2026-06-03T10:27:01.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:27:01.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:27:01.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:27:01.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:27:01.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:27:01.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:27:01.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:27:12, diff=-10.815452s, valid=True
2026-06-03T10:27:01.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:27:01.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:27:01.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:27:01.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49418.185398s, valid=False
2026-06-03T10:27:01.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:27:01.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:27:01.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:27:01.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:27:01.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:27:01.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:27:01.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:27:01.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:27:01.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:27:01.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:27:01.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:27:01.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:27:01.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:27:01.505 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:27:01.755 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:27:02.099 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:27:02.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:27:02.200 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:27:02.200 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:27:02.383 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:27:02.383 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:27:32.414 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:27:32.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:27:32.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:27:32.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:27:32.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:27:32.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:27:32.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:27:32.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:27:32.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:27:32.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:27:32.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:27:32.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:27:32.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:27:35.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:27:35.631 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:27:35.632 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:27:35.632 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:27:35.642 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:27:35.659 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:27:35.660 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:27:35.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:27:35.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:27:35.661 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:27:35.661 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:27:35.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:27:35.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:27:35.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:27:35.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:27:35.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:27:35.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:27:35.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:27:35.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:27:35.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:27:35.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:27:35.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:27:35.988 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:27:36.072 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:27:09
2026-06-03T10:27:36.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85785, datetime.datetime(2026, 6, 3, 10, 27, 9), datetime.datetime(2026, 6, 3, 10, 27, 8), 'salt', 7.08, 99.22, None, 40.19, 95.2, 0.11, 823.96, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:27:36.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:27:36.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:27:36.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:27:08, diff=28.079691s, valid=True
2026-06-03T10:27:36.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:27:36.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:27:36.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:27:12, diff=24.083157s, valid=True
2026-06-03T10:27:36.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:27:36.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:27:36.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:27:04, diff=32.091171s, valid=True
2026-06-03T10:27:36.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:27:36.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:27:36.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:27:36.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:27:36.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:27:36.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:27:36.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:27:12, diff=24.094876s, valid=True
2026-06-03T10:27:36.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:27:36.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:27:36.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:27:36.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49453.095685s, valid=False
2026-06-03T10:27:36.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:27:36.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:27:36.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:27:36.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:27:36.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:27:36.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:27:36.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:27:36.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:27:36.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:27:36.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:27:36.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:27:36.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:27:36.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:27:36.488 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:27:36.700 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:27:37.049 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:27:37.151 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:27:37.151 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:27:37.151 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:27:37.371 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:27:37.371 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:28:07.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:28:07.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:28:07.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:28:07.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:28:07.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:28:07.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:28:07.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:28:07.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:28:07.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:28:07.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:28:07.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:28:07.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:28:07.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:28:10.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:28:10.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:28:10.641 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:28:10.641 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:28:10.649 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:28:10.665 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:28:10.665 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:28:10.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:28:10.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:28:10.665 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:28:10.665 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:28:10.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:28:10.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:28:10.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:28:10.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:28:10.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:28:10.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:28:10.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:28:11.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:28:11.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:28:11.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:28:11.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:28:11.032 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:28:11.107 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:28:09
2026-06-03T10:28:11.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85787, datetime.datetime(2026, 6, 3, 10, 28, 9), datetime.datetime(2026, 6, 3, 10, 28, 9), 'salt', 7.14, 99.32, None, 40.89, 95.53, 0.09, 824.14, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:28:11.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:28:11.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:28:11.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:28:09, diff=2.114709s, valid=True
2026-06-03T10:28:11.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:28:11.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:28:11.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:28:12, diff=-0.881775s, valid=True
2026-06-03T10:28:11.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:28:11.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:28:11.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:28:06, diff=5.126576s, valid=True
2026-06-03T10:28:11.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:28:11.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:28:11.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:28:11.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:28:11.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:28:11.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:28:11.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:28:12, diff=-0.869634s, valid=True
2026-06-03T10:28:11.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:28:11.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:28:11.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:28:11.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49488.131212s, valid=False
2026-06-03T10:28:11.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:28:11.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:28:11.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:28:11.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:28:11.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:28:11.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:28:11.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:28:11.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:28:11.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:28:11.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:28:11.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:28:11.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:28:11.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:28:11.455 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:28:11.669 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:28:12.014 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:28:12.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:28:12.118 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:28:12.118 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:28:12.261 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:28:12.261 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:28:42.291 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:28:42.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:28:42.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:28:42.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:28:42.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:28:42.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:28:42.633 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:28:42.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:28:42.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:28:42.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:28:42.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:28:42.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:28:42.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:28:45.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:28:45.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:28:45.304 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:28:45.305 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:28:45.312 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:28:45.325 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:28:45.325 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:28:45.325 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:28:45.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:28:45.325 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:28:45.325 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:28:45.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:28:45.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:28:45.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:28:45.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:28:45.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:28:45.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:28:45.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:28:45.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:28:45.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:28:45.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:28:45.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:28:45.599 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:28:45.671 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:28:40
2026-06-03T10:28:45.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85788, datetime.datetime(2026, 6, 3, 10, 28, 40), datetime.datetime(2026, 6, 3, 10, 28, 39), 'salt', 7.04, 99.25, None, 43.57, 92.34, 0.1, 824.14, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:28:45.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:28:45.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:28:45.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:28:39, diff=6.678433s, valid=True
2026-06-03T10:28:45.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:28:45.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:28:45.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:29:12, diff=-26.318441s, valid=True
2026-06-03T10:28:45.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:28:45.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:28:45.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:28:37, diff=8.688901s, valid=True
2026-06-03T10:28:45.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:28:45.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:28:45.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:28:45.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:28:45.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:28:45.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:28:45.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:29:12, diff=-26.307722s, valid=True
2026-06-03T10:28:45.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:28:45.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:28:45.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:28:45.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49522.693027s, valid=False
2026-06-03T10:28:45.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:28:45.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:28:45.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:28:45.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:28:45.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:28:45.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:28:45.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:28:45.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:28:45.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:28:45.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:28:45.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:28:45.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:28:46.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:28:46.084 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:28:46.325 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:28:46.671 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:28:46.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:28:46.773 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:28:46.773 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:28:46.931 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:28:46.931 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:29:16.953 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:29:16.953 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:29:16.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:29:17.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:29:17.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:29:17.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:29:17.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:29:17.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:29:17.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:29:17.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:29:17.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:29:17.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:29:17.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:29:20.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:29:20.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:29:20.033 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:29:20.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:29:20.042 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:29:20.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:29:20.054 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:29:20.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:29:20.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:29:20.055 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:29:20.055 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:29:20.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:29:20.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:29:20.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:29:20.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:29:20.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:29:20.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:29:20.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:29:20.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:29:20.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:29:20.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:29:20.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:29:20.330 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:29:20.398 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:29:10
2026-06-03T10:29:20.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85789, datetime.datetime(2026, 6, 3, 10, 29, 10), datetime.datetime(2026, 6, 3, 10, 29, 9), 'salt', 7.04, 99.25, None, 48.37, 90.7, 0.1, 824.08, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T10:29:20.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:29:20.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:29:20.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:29:09, diff=11.406061s, valid=True
2026-06-03T10:29:20.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:29:20.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:29:20.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:29:12, diff=8.409268s, valid=True
2026-06-03T10:29:20.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:29:20.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:29:20.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:29:09, diff=11.416648s, valid=True
2026-06-03T10:29:20.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:29:20.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:29:20.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:29:20.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:29:20.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:29:20.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:29:20.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:29:12, diff=8.420016s, valid=True
2026-06-03T10:29:20.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:29:20.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:29:20.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:29:20.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49557.420763s, valid=False
2026-06-03T10:29:20.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:29:20.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:29:20.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:29:20.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:29:20.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:29:20.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:29:20.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:29:20.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:29:20.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:29:20.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:29:20.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:29:20.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:29:20.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:29:20.738 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:29:20.966 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:29:21.309 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:29:21.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:29:21.411 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:29:21.411 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:29:21.580 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:29:21.581 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:29:51.610 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:29:51.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:29:51.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:29:51.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:29:51.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:29:51.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:29:51.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:29:51.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:29:51.952 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:29:51.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:29:51.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:29:51.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:29:51.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:29:54.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:29:54.604 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:29:54.605 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:29:54.605 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:29:54.615 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:29:54.632 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:29:54.633 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:29:54.633 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:29:54.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:29:54.634 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:29:54.634 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:29:54.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:29:54.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:29:54.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:29:54.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:29:54.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:29:54.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:29:54.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:29:54.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:29:54.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:29:54.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:29:54.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:29:54.964 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:29:55.032 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:29:40
2026-06-03T10:29:55.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85790, datetime.datetime(2026, 6, 3, 10, 29, 40), datetime.datetime(2026, 6, 3, 10, 29, 40), 'salt', 6.94, 99.25, None, 47.6, 94.78, 0.1, 824.08, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T10:29:55.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:29:55.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:29:55.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:29:40, diff=15.040098s, valid=True
2026-06-03T10:29:55.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:29:55.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:29:55.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:30:12, diff=-16.956405s, valid=True
2026-06-03T10:29:55.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:29:55.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:29:55.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:29:36, diff=19.05199s, valid=True
2026-06-03T10:29:55.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:29:55.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:29:55.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:29:55.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:29:55.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:29:55.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:29:55.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:30:12, diff=-16.944285s, valid=True
2026-06-03T10:29:55.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:29:55.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:29:55.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:29:55.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49592.056509s, valid=False
2026-06-03T10:29:55.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:29:55.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:29:55.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:29:55.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:29:55.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:29:55.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:29:55.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:29:55.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:29:55.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:29:55.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:29:55.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:29:55.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:29:55.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:29:55.444 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:29:55.658 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:29:56.002 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:29:56.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:29:56.104 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:29:56.104 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:29:56.174 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:29:56.174 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:30:26.204 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:30:26.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:30:26.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:30:26.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:30:26.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:30:26.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:30:26.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:30:26.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:30:26.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:30:26.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:30:26.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:30:26.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:30:26.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:30:29.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:30:29.351 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:30:29.351 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:30:29.351 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:30:29.360 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:30:29.375 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:30:29.376 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:30:29.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:30:29.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:30:29.376 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:30:29.376 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:30:29.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:30:29.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:30:29.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:30:29.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:30:29.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:30:29.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:30:29.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:30:29.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:30:29.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:30:29.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:30:29.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:30:29.962 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:30:30.059 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:30:11
2026-06-03T10:30:30.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85791, datetime.datetime(2026, 6, 3, 10, 30, 11), datetime.datetime(2026, 6, 3, 10, 30, 10), 'salt', 6.91, 99.22, None, 49.25, 88.98, 0.11, 823.78, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T10:30:30.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:30:30.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:30:30.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:30:10, diff=20.066614s, valid=True
2026-06-03T10:30:30.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:30:30.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:30:30.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:30:12, diff=18.069592s, valid=True
2026-06-03T10:30:30.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:30:30.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:30:30.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:30:06, diff=24.076605s, valid=True
2026-06-03T10:30:30.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:30:30.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:30:30.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:30:30.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:30:30.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:30:30.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:30:30.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:30:12, diff=18.079958s, valid=True
2026-06-03T10:30:30.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:30:30.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:30:30.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:30:30.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49627.080825s, valid=False
2026-06-03T10:30:30.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:30:30.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:30:30.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:30:30.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:30:30.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:30:30.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:30:30.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:30:30.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:30:30.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:30:30.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:30:30.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:30:30.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:30:30.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:30:30.404 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:30:30.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:30:30.961 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:30:31.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:30:31.062 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:30:31.062 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:30:31.250 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:30:31.251 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:31:01.281 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:31:01.281 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:31:01.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:31:01.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:31:01.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:31:01.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:31:01.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:31:01.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:31:01.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:31:01.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:31:01.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:31:01.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:31:01.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:31:04.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:31:04.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:31:04.546 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:31:04.547 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:31:04.557 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:31:04.570 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:31:04.571 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:31:04.571 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:31:04.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:31:04.572 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:31:04.572 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:31:04.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:31:04.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:31:04.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:31:05.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:31:05.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:31:05.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:31:05.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:31:05.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:31:05.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:31:05.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:31:05.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:31:05.291 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:31:05.405 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:30:41
2026-06-03T10:31:05.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85792, datetime.datetime(2026, 6, 3, 10, 30, 41), datetime.datetime(2026, 6, 3, 10, 30, 40), 'salt', 6.91, 99.19, None, 53.1, 88.11, 0.11, 823.9, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T10:31:05.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:31:05.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:31:05.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:30:40, diff=25.414317s, valid=True
2026-06-03T10:31:05.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:31:05.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:31:05.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:31:12, diff=-6.5812s, valid=True
2026-06-03T10:31:05.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:31:05.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:31:05.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:30:36, diff=29.42939s, valid=True
2026-06-03T10:31:05.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:31:05.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:31:05.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:31:05.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:31:05.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:31:05.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:31:05.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:31:12, diff=-6.565834s, valid=True
2026-06-03T10:31:05.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:31:05.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:31:05.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:31:05.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49662.435194s, valid=False
2026-06-03T10:31:05.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:31:05.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:31:05.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:31:05.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:31:05.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:31:05.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:31:05.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:31:05.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:31:05.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:31:05.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:31:05.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:31:05.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:31:05.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:31:05.758 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:31:05.971 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:31:06.313 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:31:06.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:31:06.415 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:31:06.415 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:31:06.570 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:31:06.570 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:31:36.600 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:31:36.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:31:36.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:31:36.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:31:36.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:31:37.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:31:37.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:31:37.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:31:37.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:31:37.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:31:37.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:31:37.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:31:37.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:31:39.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:31:39.674 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:31:39.675 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:31:39.675 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:31:39.685 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:31:39.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:31:39.699 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:31:39.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:31:39.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:31:39.700 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:31:39.700 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:31:39.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:31:39.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:31:39.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:31:40.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:31:40.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:31:40.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:31:40.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:31:40.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:31:40.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:31:40.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:31:40.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:31:40.231 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:31:40.328 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:31:11
2026-06-03T10:31:40.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85793, datetime.datetime(2026, 6, 3, 10, 31, 11), datetime.datetime(2026, 6, 3, 10, 31, 11), 'salt', 6.88, 99.18, None, 47.63, 95.3, 0.12, 823.84, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T10:31:40.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:31:40.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:31:40.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:31:11, diff=29.337035s, valid=True
2026-06-03T10:31:40.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:31:40.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:31:40.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:31:12, diff=28.341002s, valid=True
2026-06-03T10:31:40.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:31:40.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:31:40.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:31:07, diff=33.350192s, valid=True
2026-06-03T10:31:40.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:31:40.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:31:40.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:31:40.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:31:40.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:31:40.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:31:40.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:31:12, diff=28.354369s, valid=True
2026-06-03T10:31:40.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:31:40.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:31:40.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:31:40.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49697.35528s, valid=False
2026-06-03T10:31:40.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:31:40.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:31:40.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:31:40.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:31:40.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:31:40.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:31:40.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:31:40.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:31:40.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:31:40.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:31:40.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:31:40.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:31:40.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:31:40.679 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:31:40.951 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:31:41.295 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:31:41.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:31:41.398 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:31:41.398 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:31:41.600 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:31:41.600 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:32:11.601 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:32:11.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:32:11.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:32:11.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:32:11.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:32:12.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:32:12.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:32:12.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:32:12.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:32:12.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:32:12.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:32:12.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:32:12.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:32:14.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:32:14.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:32:14.951 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:32:14.951 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:32:14.962 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:32:14.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:32:14.975 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:32:14.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:32:14.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:32:14.977 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:32:14.977 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:32:15.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:32:15.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:32:15.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:32:15.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:32:15.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:32:15.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:32:15.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:32:15.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:32:15.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:32:15.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:32:15.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:32:15.429 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:32:15.501 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:32:12
2026-06-03T10:32:15.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85795, datetime.datetime(2026, 6, 3, 10, 32, 12), datetime.datetime(2026, 6, 3, 10, 32, 12), 'salt', 6.94, 99.25, None, 44.1, 86.47, 0.1, 823.96, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:32:15.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:32:15.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:32:15.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:32:12, diff=3.508382s, valid=True
2026-06-03T10:32:15.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:32:15.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:32:15.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:32:12, diff=3.51125s, valid=True
2026-06-03T10:32:15.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:32:15.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:32:15.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:32:07, diff=8.518188s, valid=True
2026-06-03T10:32:15.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:32:15.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:32:15.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:32:15.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:32:15.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:32:15.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:32:15.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:32:12, diff=3.521263s, valid=True
2026-06-03T10:32:15.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:32:15.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:32:15.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:32:15.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49732.521933s, valid=False
2026-06-03T10:32:15.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:32:15.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:32:15.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:32:15.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:32:15.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:32:15.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:32:15.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:32:15.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:32:15.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:32:15.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:32:15.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:32:15.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:32:15.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:32:15.836 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:32:16.049 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:32:16.392 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:32:16.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:32:16.494 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:32:16.494 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:32:17.212 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:32:17.212 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:32:47.242 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:32:47.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:32:47.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:32:47.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:32:47.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:32:47.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:32:47.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:32:47.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:32:47.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:32:47.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:32:47.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:32:47.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:32:47.634 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:32:50.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:32:50.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:32:50.305 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:32:50.305 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:32:50.313 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:32:50.325 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:32:50.326 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:32:50.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:32:50.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:32:50.327 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:32:50.327 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:32:50.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:32:50.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:32:50.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:32:50.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:32:50.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:32:50.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:32:50.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:32:50.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:32:50.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:32:51.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:32:51.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:32:51.010 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:32:51.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:32:43
2026-06-03T10:32:51.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85796, datetime.datetime(2026, 6, 3, 10, 32, 43), datetime.datetime(2026, 6, 3, 10, 32, 42), 'salt', 6.91, 99.22, None, 49.4, 99.33, 0.11, 823.96, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T10:32:51.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:32:51.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:32:51.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:32:42, diff=9.126227s, valid=True
2026-06-03T10:32:51.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:32:51.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:32:51.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:33:12, diff=-20.869348s, valid=True
2026-06-03T10:32:51.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:32:51.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:32:51.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:32:39, diff=12.141117s, valid=True
2026-06-03T10:32:51.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:32:51.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:32:51.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:32:51.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:32:51.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:32:51.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:32:51.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:33:12, diff=-20.854131s, valid=True
2026-06-03T10:32:51.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:32:51.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:32:51.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:32:51.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49768.14692s, valid=False
2026-06-03T10:32:51.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:32:51.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:32:51.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:32:51.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:32:51.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:32:51.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:32:51.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:32:51.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:32:51.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:32:51.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:32:51.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:32:51.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:32:51.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:32:51.543 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:32:51.756 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:32:52.100 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:32:52.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:32:52.202 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:32:52.202 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:32:52.413 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:32:52.413 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:33:22.420 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:33:22.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:33:22.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:33:22.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:33:22.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:33:22.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:33:22.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:33:22.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:33:22.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:33:22.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:33:22.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:33:22.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:33:22.882 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:33:25.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:33:25.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:33:25.565 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:33:25.565 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:33:25.575 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:33:25.588 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:33:25.589 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:33:25.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:33:25.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:33:25.591 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:33:25.592 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:33:25.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:33:25.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:33:25.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:33:26.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:33:26.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:33:26.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:33:26.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:33:26.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:33:26.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:33:26.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:33:26.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:33:26.239 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:33:26.332 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:33:14
2026-06-03T10:33:26.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85797, datetime.datetime(2026, 6, 3, 10, 33, 14), datetime.datetime(2026, 6, 3, 10, 33, 13), 'salt', 6.97, 99.22, None, 43.19, 84.8, 0.1, 824.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:33:26.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:33:26.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:33:26.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:33:13, diff=13.341485s, valid=True
2026-06-03T10:33:26.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:33:26.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:33:26.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:33:12, diff=14.345841s, valid=True
2026-06-03T10:33:26.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:33:26.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:33:26.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:33:10, diff=16.356083s, valid=True
2026-06-03T10:33:26.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:33:26.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:33:26.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:33:26.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:33:26.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:33:26.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:33:26.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:33:12, diff=14.360783s, valid=True
2026-06-03T10:33:26.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:33:26.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:33:26.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:33:26.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49803.361781s, valid=False
2026-06-03T10:33:26.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:33:26.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:33:26.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:33:26.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:33:26.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:33:26.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:33:26.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:33:26.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:33:26.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:33:26.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:33:26.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:33:26.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:33:26.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:33:26.697 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:33:26.928 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:33:27.279 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:33:27.381 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:33:27.381 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:33:27.381 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:33:27.452 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:33:27.452 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:33:57.464 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:33:57.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:33:57.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:33:57.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:33:57.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:33:58.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:33:58.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:33:58.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:33:58.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:33:58.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:33:58.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:33:58.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:33:58.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:34:00.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:34:00.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:34:00.836 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:34:00.836 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:34:00.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:34:00.856 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:34:00.857 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:34:00.857 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:34:00.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:34:00.857 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:34:00.857 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:34:01.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:34:01.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:34:01.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:34:01.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:34:01.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:34:01.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:34:01.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:34:01.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:34:01.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:34:01.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:34:01.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:34:01.565 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:34:01.661 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:33:44
2026-06-03T10:34:01.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85798, datetime.datetime(2026, 6, 3, 10, 33, 44), datetime.datetime(2026, 6, 3, 10, 33, 43), 'salt', 6.91, 99.22, None, 47.1, 92.69, 0.11, 823.95, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T10:34:01.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:34:01.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:34:01.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:33:43, diff=18.670374s, valid=True
2026-06-03T10:34:01.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:34:01.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:34:01.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:34:12, diff=-10.325324s, valid=True
2026-06-03T10:34:01.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:34:01.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:34:01.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:33:42, diff=19.684759s, valid=True
2026-06-03T10:34:01.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:34:01.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:34:01.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:34:01.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:34:01.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:34:01.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:34:01.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:34:12, diff=-10.310649s, valid=True
2026-06-03T10:34:01.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:34:01.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:34:01.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:34:01.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49838.69037s, valid=False
2026-06-03T10:34:01.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:34:01.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:34:01.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:34:01.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:34:01.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:34:01.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:34:01.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:34:01.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:34:01.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:34:01.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:34:01.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:34:02.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:34:02.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:34:02.123 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:34:02.338 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:34:02.681 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:34:02.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:34:02.783 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:34:02.783 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:34:02.955 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:34:02.955 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:34:32.978 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:34:32.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:34:32.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:34:33.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:34:33.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:34:33.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:34:33.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:34:33.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:34:33.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:34:33.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:34:33.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:34:33.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:34:33.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:34:36.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:34:36.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:34:36.118 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:34:36.118 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:34:36.128 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:34:36.141 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:34:36.141 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:34:36.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:34:36.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:34:36.142 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:34:36.143 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:34:36.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:34:36.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:34:36.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:34:36.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:34:36.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:34:36.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:34:36.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:34:36.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:34:36.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:34:36.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:34:36.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:34:36.809 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:34:36.933 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:34:14
2026-06-03T10:34:36.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85799, datetime.datetime(2026, 6, 3, 10, 34, 14), datetime.datetime(2026, 6, 3, 10, 34, 14), 'salt', 7.07, 99.25, None, 46.57, 100.67, 0.1, 823.83, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T10:34:36.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:34:36.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:34:36.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:34:14, diff=22.942878s, valid=True
2026-06-03T10:34:36.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:34:36.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:34:36.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:34:12, diff=24.947176s, valid=True
2026-06-03T10:34:36.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:34:36.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:34:36.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:34:14, diff=22.957392s, valid=True
2026-06-03T10:34:36.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:34:36.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:34:36.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:34:36.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:34:36.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:34:36.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:34:36.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:34:12, diff=24.961957s, valid=True
2026-06-03T10:34:36.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:34:36.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:34:36.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:34:36.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49873.962941s, valid=False
2026-06-03T10:34:36.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:34:36.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:34:36.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:34:36.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:34:36.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:34:37.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:34:37.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:34:37.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:34:37.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:34:37.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:34:37.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:34:37.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:34:37.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:34:37.317 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:34:37.538 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:34:37.929 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:34:38.036 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:34:38.037 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:34:38.037 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:34:38.187 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:34:38.188 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:35:08.218 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:35:08.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:35:08.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:35:08.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:35:08.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:35:08.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:35:08.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:35:08.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:35:08.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:35:08.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:35:08.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:35:08.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:35:08.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:35:11.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:35:11.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:35:11.487 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:35:11.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:35:11.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:35:11.509 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:35:11.509 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:35:11.510 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:35:11.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:35:11.510 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:35:11.511 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:35:11.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:35:11.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:35:11.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:35:11.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:35:11.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:35:12.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:35:12.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:35:12.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:35:12.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:35:12.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:35:12.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:35:12.200 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:35:12.301 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:34:45
2026-06-03T10:35:12.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85800, datetime.datetime(2026, 6, 3, 10, 34, 45), datetime.datetime(2026, 6, 3, 10, 34, 44), 'salt', 7.11, 99.28, None, 43.36, 99.26, 0.1, 824.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:35:12.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:35:12.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:35:12.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:34:44, diff=28.307505s, valid=True
2026-06-03T10:35:12.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:35:12.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:35:12.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:35:12, diff=0.310382s, valid=True
2026-06-03T10:35:12.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:35:12.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:35:12.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:34:39, diff=33.317013s, valid=True
2026-06-03T10:35:12.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:35:12.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:35:12.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:35:12.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:35:12.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:35:12.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:35:12.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:35:12, diff=0.32s, valid=True
2026-06-03T10:35:12.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:35:12.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:35:12.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:35:12.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49909.320648s, valid=False
2026-06-03T10:35:12.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:35:12.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:35:12.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:35:12.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:35:12.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:35:12.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:35:12.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:35:12.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:35:12.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:35:12.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:35:12.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:35:12.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:35:12.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:35:12.633 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:35:12.865 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:35:13.217 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:35:13.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:35:13.320 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:35:13.320 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:35:13.475 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:35:13.475 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:35:43.486 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:35:43.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:35:43.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:35:43.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:35:43.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:35:44.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:35:44.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:35:44.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:35:44.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:35:44.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:35:44.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:35:44.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:35:44.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:35:46.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:35:46.683 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:35:46.684 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:35:46.684 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:35:46.694 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:35:46.706 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:35:46.707 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:35:46.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:35:46.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:35:46.708 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:35:46.708 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:35:46.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:35:46.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:35:46.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:35:46.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:35:46.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:35:47.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:35:47.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:35:47.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:35:47.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:35:47.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:35:47.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:35:47.077 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:35:47.156 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:35:46
2026-06-03T10:35:47.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85802, datetime.datetime(2026, 6, 3, 10, 35, 46), datetime.datetime(2026, 6, 3, 10, 35, 45), 'salt', 7.07, 99.31, None, 41.81, 107.34, 0.09, 823.89, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:35:47.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:35:47.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:35:47.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:35:45, diff=2.164142s, valid=True
2026-06-03T10:35:47.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:35:47.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:35:47.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:36:12, diff=-24.832205s, valid=True
2026-06-03T10:35:47.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:35:47.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:35:47.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:35:39, diff=8.176366s, valid=True
2026-06-03T10:35:47.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:35:47.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:35:47.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:35:47.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:35:47.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:35:47.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:35:47.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:36:12, diff=-24.819693s, valid=True
2026-06-03T10:35:47.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:35:47.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:35:47.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:35:47.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49944.181175s, valid=False
2026-06-03T10:35:47.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:35:47.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:35:47.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:35:47.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:35:47.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:35:47.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:35:47.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:35:47.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:35:47.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:35:47.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:35:47.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:35:47.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:35:47.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:35:47.505 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:35:47.722 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:35:48.070 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:35:48.235 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:35:48.236 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:35:48.236 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:35:48.308 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:35:48.308 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:36:18.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:36:18.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:36:18.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:36:18.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:36:18.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:36:18.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:36:18.746 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:36:18.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:36:18.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:36:18.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:36:18.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:36:18.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:36:18.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:36:21.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:36:21.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:36:21.483 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:36:21.483 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:36:21.494 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:36:21.506 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:36:21.507 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:36:21.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:36:21.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:36:21.508 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:36:21.508 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:36:21.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:36:21.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:36:21.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:36:21.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:36:21.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:36:21.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:36:21.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:36:21.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:36:21.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:36:21.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:36:21.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:36:21.834 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:36:21.903 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:36:17
2026-06-03T10:36:21.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85803, datetime.datetime(2026, 6, 3, 10, 36, 17), datetime.datetime(2026, 6, 3, 10, 36, 16), 'salt', 7.11, 99.25, None, 46.86, 100.6, 0.11, 823.95, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T10:36:21.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:36:21.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:36:21.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:36:16, diff=5.910871s, valid=True
2026-06-03T10:36:21.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:36:21.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:36:21.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:36:12, diff=9.914332s, valid=True
2026-06-03T10:36:21.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:36:21.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:36:21.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:36:09, diff=12.92253s, valid=True
2026-06-03T10:36:21.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:36:21.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:36:21.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:36:21.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:36:21.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:36:21.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:36:21.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:36:12, diff=9.926235s, valid=True
2026-06-03T10:36:21.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:36:21.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:36:21.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:36:21.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=49978.927051s, valid=False
2026-06-03T10:36:21.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:36:21.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:36:21.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:36:21.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:36:21.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:36:21.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:36:21.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:36:21.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:36:22.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:36:22.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:36:22.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:36:22.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:36:22.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:36:22.246 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:36:22.459 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:36:22.803 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:36:22.905 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:36:22.905 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:36:22.905 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:36:23.114 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:36:23.114 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:36:53.138 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:36:53.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:36:53.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:36:53.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:36:53.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:36:53.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:36:53.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:36:53.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:36:53.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:36:53.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:36:53.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:36:53.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:36:53.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:36:56.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:36:56.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:36:56.437 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:36:56.437 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:36:56.448 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:36:56.460 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:36:56.461 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:36:56.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:36:56.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:36:56.462 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:36:56.462 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:36:56.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:36:56.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:36:56.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:36:56.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:36:56.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:36:57.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:36:57.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:36:57.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:36:57.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:36:57.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:36:57.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:36:57.148 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:36:57.255 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:36:47
2026-06-03T10:36:57.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85804, datetime.datetime(2026, 6, 3, 10, 36, 47), datetime.datetime(2026, 6, 3, 10, 36, 46), 'salt', 7.07, 99.18, None, 48.69, 97.69, 0.11, 823.95, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T10:36:57.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:36:57.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:36:57.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:36:46, diff=11.264594s, valid=True
2026-06-03T10:36:57.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:36:57.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:36:57.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:37:12, diff=-14.731048s, valid=True
2026-06-03T10:36:57.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:36:57.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:36:57.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:36:41, diff=16.278956s, valid=True
2026-06-03T10:36:57.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:36:57.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:36:57.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:36:57.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:36:57.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:36:57.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:36:57.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:37:12, diff=-14.716451s, valid=True
2026-06-03T10:36:57.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:36:57.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:36:57.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:36:57.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50014.28453s, valid=False
2026-06-03T10:36:57.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:36:57.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:36:57.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:36:57.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:36:57.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:36:57.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:36:57.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:36:57.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:36:57.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:36:57.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:36:57.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:36:57.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:36:57.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:36:57.610 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:36:57.896 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:36:58.241 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:36:58.343 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:36:58.343 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:36:58.343 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:36:58.415 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:36:58.415 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:37:28.445 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:37:28.445 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:37:28.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:37:28.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:37:28.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:37:28.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:37:28.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:37:28.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:37:28.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:37:28.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:37:28.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:37:28.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:37:28.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:37:31.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:37:31.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:37:31.229 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:37:31.229 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:37:31.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:37:31.251 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:37:31.252 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:37:31.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:37:31.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:37:31.253 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:37:31.253 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:37:31.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:37:31.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:37:31.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:37:31.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:37:31.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:37:31.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:37:31.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:37:31.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:37:31.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:37:31.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:37:31.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:37:31.599 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:37:31.669 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:37:17
2026-06-03T10:37:31.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85805, datetime.datetime(2026, 6, 3, 10, 37, 17), datetime.datetime(2026, 6, 3, 10, 37, 16), 'salt', 7.01, 99.21, None, 45.87, 97.71, 0.11, 824.01, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T10:37:31.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:37:31.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:37:31.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:37:16, diff=15.676961s, valid=True
2026-06-03T10:37:31.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:37:31.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:37:31.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:37:12, diff=19.680513s, valid=True
2026-06-03T10:37:31.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:37:31.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:37:31.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:37:12, diff=19.68875s, valid=True
2026-06-03T10:37:31.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:37:31.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:37:31.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:37:31.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:37:31.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:37:31.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:37:31.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:37:12, diff=19.692511s, valid=True
2026-06-03T10:37:31.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:37:31.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:37:31.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:37:31.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50048.693327s, valid=False
2026-06-03T10:37:31.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:37:31.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:37:31.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:37:31.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:37:31.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:37:31.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:37:31.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:37:31.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:37:31.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:37:31.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:37:31.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:37:31.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:37:31.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:37:32.017 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:37:32.223 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:37:32.558 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:37:32.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:37:32.658 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:37:32.659 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:37:32.887 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:37:32.887 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:38:02.904 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:38:02.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:38:02.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:38:03.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:38:03.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:38:03.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:38:03.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:38:03.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:38:03.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:38:03.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:38:03.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:38:03.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:38:03.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:38:05.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:38:05.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:38:05.907 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:38:05.907 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:38:05.919 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:38:05.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:38:05.932 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:38:05.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:38:05.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:38:05.933 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:38:05.933 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:38:05.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:38:06.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:38:06.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:38:06.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:38:06.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:38:06.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:38:06.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:38:06.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:38:06.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:38:06.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:38:06.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:38:06.286 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:38:06.370 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:37:48
2026-06-03T10:38:06.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85806, datetime.datetime(2026, 6, 3, 10, 37, 48), datetime.datetime(2026, 6, 3, 10, 37, 47), 'salt', 7.04, 99.18, None, 41.39, 85.65, 0.11, 824.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:38:06.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:38:06.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:38:06.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:37:47, diff=19.377794s, valid=True
2026-06-03T10:38:06.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:38:06.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:38:06.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:38:12, diff=-5.618744s, valid=True
2026-06-03T10:38:06.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:38:06.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:38:06.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:37:43, diff=23.38954s, valid=True
2026-06-03T10:38:06.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:38:06.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:38:06.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:38:06.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:38:06.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:38:06.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:38:06.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:38:12, diff=-5.606735s, valid=True
2026-06-03T10:38:06.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:38:06.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:38:06.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:38:06.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50083.394081s, valid=False
2026-06-03T10:38:06.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:38:06.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:38:06.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:38:06.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:38:06.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:38:06.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:38:06.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:38:06.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:38:06.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:38:06.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:38:06.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:38:06.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:38:06.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:38:06.787 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:38:06.991 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:38:07.326 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:38:07.426 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:38:07.426 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:38:07.426 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:38:07.611 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:38:07.611 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:38:37.642 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:38:37.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:38:37.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:38:37.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:38:37.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:38:38.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:38:38.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:38:38.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:38:38.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:38:38.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:38:38.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:38:38.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:38:38.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:38:40.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:38:40.412 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:38:40.413 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:38:40.413 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:38:40.423 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:38:40.437 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:38:40.437 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:38:40.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:38:40.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:38:40.438 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:38:40.439 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:38:40.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:38:40.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:38:40.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:38:40.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:38:40.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:38:40.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:38:40.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:38:40.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:38:40.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:38:40.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:38:40.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:38:40.784 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:38:40.856 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:38:18
2026-06-03T10:38:40.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85807, datetime.datetime(2026, 6, 3, 10, 38, 18), datetime.datetime(2026, 6, 3, 10, 38, 17), 'salt', 7.11, 99.25, None, 34.65, 92.41, 0.11, 824.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:38:40.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:38:40.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:38:40.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:38:17, diff=23.863716s, valid=True
2026-06-03T10:38:40.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:38:40.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:38:40.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:38:12, diff=28.867204s, valid=True
2026-06-03T10:38:40.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:38:40.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:38:40.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:38:15, diff=25.875389s, valid=True
2026-06-03T10:38:40.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:38:40.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:38:40.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:38:40.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:38:40.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:38:40.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:38:40.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:38:12, diff=28.879159s, valid=True
2026-06-03T10:38:40.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:38:40.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:38:40.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:38:40.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50117.879986s, valid=False
2026-06-03T10:38:40.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:38:40.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:38:40.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:38:40.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:38:40.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:38:40.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:38:40.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:38:40.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:38:40.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:38:41.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:38:41.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:38:41.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:38:41.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:38:41.202 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:38:41.406 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:38:41.741 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:38:41.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:38:41.842 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:38:41.842 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:38:41.913 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:38:41.913 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:39:11.931 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:39:11.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:39:11.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:39:12.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:39:12.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:39:12.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:39:12.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:39:12.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:39:12.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:39:12.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:39:12.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:39:12.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:39:12.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:39:15.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:39:15.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:39:15.156 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:39:15.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:39:15.167 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:39:15.180 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:39:15.180 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:39:15.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:39:15.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:39:15.181 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:39:15.182 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:39:15.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:39:15.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:39:15.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:39:15.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:39:15.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:39:15.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:39:15.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:39:15.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:39:15.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:39:15.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:39:15.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:39:15.524 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:39:15.601 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:38:48
2026-06-03T10:39:15.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85808, datetime.datetime(2026, 6, 3, 10, 38, 48), datetime.datetime(2026, 6, 3, 10, 38, 48), 'salt', 7.21, 99.32, None, 40.86, 97.15, 0.1, 823.95, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:39:15.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:39:15.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:39:15.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:38:48, diff=27.608533s, valid=True
2026-06-03T10:39:15.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:39:15.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:39:15.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:39:12, diff=3.611925s, valid=True
2026-06-03T10:39:15.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:39:15.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:39:15.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:38:47, diff=28.620049s, valid=True
2026-06-03T10:39:15.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:39:15.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:39:15.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:39:15.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:39:15.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:39:15.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:39:15.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:39:12, diff=3.623709s, valid=True
2026-06-03T10:39:15.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:39:15.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:39:15.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:39:15.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50152.62448s, valid=False
2026-06-03T10:39:15.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:39:15.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:39:15.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:39:15.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:39:15.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:39:15.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:39:15.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:39:15.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:39:15.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:39:15.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:39:15.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:39:15.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:39:15.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:39:16.013 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:39:16.218 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:39:16.553 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:39:16.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:39:16.654 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:39:16.655 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:39:16.839 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:39:16.839 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:39:46.867 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:39:46.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:39:46.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:39:47.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:39:47.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:39:47.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:39:47.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:39:47.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:39:47.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:39:47.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:39:47.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:39:47.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:39:47.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:39:50.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:39:50.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:39:50.019 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:39:50.019 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:39:50.025 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:39:50.042 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:39:50.043 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:39:50.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:39:50.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:39:50.043 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:39:50.044 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:39:50.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:39:50.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:39:50.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:39:50.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:39:50.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:39:50.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:39:50.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:39:50.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:39:50.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:39:51.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:39:51.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:39:51.025 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:39:51.143 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:39:49
2026-06-03T10:39:51.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85810, datetime.datetime(2026, 6, 3, 10, 39, 49), datetime.datetime(2026, 6, 3, 10, 39, 48), 'salt', 7.21, 99.25, None, 30.13, 93.82, 0.11, 824.14, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:39:51.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:39:51.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:39:51.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:39:48, diff=3.157096s, valid=True
2026-06-03T10:39:51.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:39:51.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:39:51.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:40:12, diff=-20.836652s, valid=True
2026-06-03T10:39:51.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:39:51.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:39:51.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:39:41, diff=10.177994s, valid=True
2026-06-03T10:39:51.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:39:51.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:39:51.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:39:51.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:39:51.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:39:51.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:39:51.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:40:12, diff=-20.815312s, valid=True
2026-06-03T10:39:51.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:39:51.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:39:51.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:39:51.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50188.18612s, valid=False
2026-06-03T10:39:51.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:39:51.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:39:51.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:39:51.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:39:51.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:39:51.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:39:51.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:39:51.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:39:51.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:39:51.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:39:51.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:39:51.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:39:51.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:39:51.521 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:39:51.725 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:39:52.066 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:39:52.165 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:39:52.166 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:39:52.166 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:39:52.323 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:39:52.323 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:40:22.337 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:40:22.337 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:40:22.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:40:22.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:40:23.012 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:40:23.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:40:23.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:40:23.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:40:23.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:40:23.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:40:23.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:40:23.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:40:23.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:40:25.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:40:25.849 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:40:25.849 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:40:25.849 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:40:25.861 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:40:25.873 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:40:25.874 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:40:25.874 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:40:25.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:40:25.875 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:40:25.875 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:40:25.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:40:26.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:40:26.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:40:26.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:40:26.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:40:26.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:40:26.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:40:26.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:40:26.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:40:26.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:40:26.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:40:26.218 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:40:26.302 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:40:19
2026-06-03T10:40:26.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85811, datetime.datetime(2026, 6, 3, 10, 40, 19), datetime.datetime(2026, 6, 3, 10, 40, 18), 'salt', 7.34, 99.32, None, 38.88, 93.02, 0.09, 823.96, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:40:26.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:40:26.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:40:26.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:40:18, diff=8.309837s, valid=True
2026-06-03T10:40:26.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:40:26.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:40:26.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:40:12, diff=14.313425s, valid=True
2026-06-03T10:40:26.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:40:26.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:40:26.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:40:11, diff=15.321668s, valid=True
2026-06-03T10:40:26.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:40:26.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:40:26.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:40:26.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:40:26.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:40:26.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:40:26.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:40:12, diff=14.325373s, valid=True
2026-06-03T10:40:26.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:40:26.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:40:26.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:40:26.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50223.326176s, valid=False
2026-06-03T10:40:26.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:40:26.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:40:26.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:40:26.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:40:26.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:40:26.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:40:26.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:40:26.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:40:26.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:40:26.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:40:26.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:40:26.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:40:26.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:40:26.714 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:40:26.919 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:40:27.256 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:40:27.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:40:27.357 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:40:27.357 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:40:29.240 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:40:29.240 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:40:59.250 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:40:59.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:40:59.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:40:59.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:40:59.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:40:59.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:40:59.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:40:59.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:40:59.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:40:59.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:40:59.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:40:59.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:40:59.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:41:02.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:41:02.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:41:02.254 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:41:02.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:41:02.265 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:41:02.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:41:02.278 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:41:02.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:41:02.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:41:02.280 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:41:02.280 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:41:02.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:41:02.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:41:02.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:41:02.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:41:02.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:41:02.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:41:02.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:41:02.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:41:02.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:41:02.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:41:02.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:41:02.615 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:41:02.689 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:40:49
2026-06-03T10:41:02.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85812, datetime.datetime(2026, 6, 3, 10, 40, 49), datetime.datetime(2026, 6, 3, 10, 40, 49), 'salt', 7.34, 99.22, None, 39.13, 100.63, 0.11, 824.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:41:02.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:41:02.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:41:02.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:40:49, diff=13.697319s, valid=True
2026-06-03T10:41:02.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:41:02.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:41:02.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:41:12, diff=-9.299133s, valid=True
2026-06-03T10:41:02.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:41:02.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:41:02.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:40:42, diff=20.70946s, valid=True
2026-06-03T10:41:02.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:41:02.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:41:02.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:41:02.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:41:02.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:41:02.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:41:02.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:41:12, diff=-9.286798s, valid=True
2026-06-03T10:41:02.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:41:02.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:41:02.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:41:02.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50259.714004s, valid=False
2026-06-03T10:41:02.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:41:02.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:41:02.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:41:02.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:41:02.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:41:02.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:41:02.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:41:02.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:41:02.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:41:02.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:41:02.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:41:02.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:41:03.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:41:03.046 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:41:03.258 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:41:03.603 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:41:03.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:41:03.706 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:41:03.706 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:41:03.835 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:41:03.836 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:41:33.866 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:41:33.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:41:33.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:41:33.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:41:33.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:41:34.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:41:34.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:41:34.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:41:34.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:41:34.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:41:34.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:41:34.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:41:34.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:41:36.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:41:36.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:41:36.709 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:41:36.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:41:36.719 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:41:36.732 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:41:36.732 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:41:36.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:41:36.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:41:36.733 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:41:36.734 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:41:36.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:41:36.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:41:36.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:41:36.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:41:36.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:41:37.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:41:37.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:41:37.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:41:37.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:41:37.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:41:37.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:41:37.070 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:41:37.141 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:41:20
2026-06-03T10:41:37.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85813, datetime.datetime(2026, 6, 3, 10, 41, 20), datetime.datetime(2026, 6, 3, 10, 41, 19), 'salt', 7.44, 99.32, None, 37.82, 101.09, 0.1, 823.95, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:41:37.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:41:37.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:41:37.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:41:19, diff=18.147863s, valid=True
2026-06-03T10:41:37.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:41:37.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:41:37.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:41:12, diff=25.15071s, valid=True
2026-06-03T10:41:37.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:41:37.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:41:37.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:41:14, diff=23.157366s, valid=True
2026-06-03T10:41:37.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:41:37.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:41:37.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:41:37.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:41:37.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:41:37.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:41:37.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:41:12, diff=25.160406s, valid=True
2026-06-03T10:41:37.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:41:37.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:41:37.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:41:37.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50294.16106s, valid=False
2026-06-03T10:41:37.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:41:37.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:41:37.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:41:37.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:41:37.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:41:37.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:41:37.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:41:37.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:41:37.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:41:37.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:41:37.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:41:37.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:41:37.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:41:37.478 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:41:37.730 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:41:38.069 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:41:38.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:41:38.175 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:41:38.175 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:41:38.440 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:41:38.440 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:42:08.454 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:42:08.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:42:08.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:42:08.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:42:08.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:42:08.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:42:08.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:42:08.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:42:08.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:42:08.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:42:08.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:42:08.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:42:08.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:42:11.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:42:11.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:42:11.303 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:42:11.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:42:11.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:42:11.327 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:42:11.327 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:42:11.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:42:11.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:42:11.329 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:42:11.329 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:42:11.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:42:11.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:42:11.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:42:11.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:42:11.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:42:11.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:42:11.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:42:11.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:42:11.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:42:11.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:42:11.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:42:11.654 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:42:11.730 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:41:50
2026-06-03T10:42:11.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85814, datetime.datetime(2026, 6, 3, 10, 41, 50), datetime.datetime(2026, 6, 3, 10, 41, 49), 'salt', 7.31, 99.28, None, 41.6, 98.72, 0.1, 824.08, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:42:11.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:42:11.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:42:11.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:41:49, diff=22.737773s, valid=True
2026-06-03T10:42:11.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:42:11.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:42:11.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:42:12, diff=-0.258856s, valid=True
2026-06-03T10:42:11.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:42:11.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:42:11.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:41:45, diff=26.749239s, valid=True
2026-06-03T10:42:11.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:42:11.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:42:11.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:42:11.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:42:11.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:42:11.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:42:11.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:42:12, diff=-0.247164s, valid=True
2026-06-03T10:42:11.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:42:11.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:42:11.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:42:11.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50328.75361s, valid=False
2026-06-03T10:42:11.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:42:11.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:42:11.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:42:11.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:42:11.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:42:11.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:42:11.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:42:11.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:42:11.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:42:11.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:42:11.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:42:11.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:42:12.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:42:12.075 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:42:12.270 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:42:12.597 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:42:12.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:42:12.698 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:42:12.698 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:42:12.913 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:42:12.913 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:42:42.913 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:42:42.913 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:42:42.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:42:43.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:42:43.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:42:43.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:42:43.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:42:43.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:42:43.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:42:43.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:42:43.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:42:43.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:42:43.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:42:46.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:42:46.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:42:46.034 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:42:46.034 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:42:46.042 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:42:46.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:42:46.054 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:42:46.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:42:46.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:42:46.054 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:42:46.054 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:42:46.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:42:46.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:42:46.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:42:46.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:42:46.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:42:46.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:42:46.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:42:46.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:42:46.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:42:46.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:42:46.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:42:46.343 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:42:46.413 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:42:20
2026-06-03T10:42:46.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85815, datetime.datetime(2026, 6, 3, 10, 42, 20), datetime.datetime(2026, 6, 3, 10, 42, 19), 'salt', 7.31, 99.25, None, 39.98, 104.66, 0.11, 824.14, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:42:46.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:42:46.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:42:46.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:42:19, diff=27.420379s, valid=True
2026-06-03T10:42:46.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:42:46.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:42:46.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:42:12, diff=34.423543s, valid=True
2026-06-03T10:42:46.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:42:46.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:42:46.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:42:17, diff=29.43109s, valid=True
2026-06-03T10:42:46.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:42:46.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:42:46.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:42:46.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:42:46.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:42:46.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:42:46.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:42:12, diff=34.434489s, valid=True
2026-06-03T10:42:46.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:42:46.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:42:46.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:42:46.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50363.435235s, valid=False
2026-06-03T10:42:46.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:42:46.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:42:46.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:42:46.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:42:46.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:42:46.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:42:46.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:42:46.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:42:46.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:42:46.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:42:46.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:42:46.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:42:46.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:42:46.752 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:42:46.947 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:42:47.275 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:42:47.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:42:47.376 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:42:47.376 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:42:47.520 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:42:47.520 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:43:17.550 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:43:17.551 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:43:17.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:43:17.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:43:17.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:43:18.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:43:18.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:43:18.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:43:18.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:43:18.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:43:18.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:43:18.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:43:18.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:43:20.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:43:20.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:43:20.477 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:43:20.477 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:43:20.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:43:20.499 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:43:20.499 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:43:20.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:43:20.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:43:20.499 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:43:20.499 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:43:20.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:43:20.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:43:20.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:43:20.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:43:20.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:43:20.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:43:20.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:43:20.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:43:20.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:43:20.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:43:20.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:43:20.823 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:43:20.894 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:42:50
2026-06-03T10:43:20.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85816, datetime.datetime(2026, 6, 3, 10, 42, 50), datetime.datetime(2026, 6, 3, 10, 42, 50), 'salt', 7.24, 99.32, None, 42.27, 103.72, 0.09, 823.89, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:43:20.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:43:20.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:43:20.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:42:50, diff=30.901679s, valid=True
2026-06-03T10:43:20.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:43:20.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:43:20.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:43:12, diff=8.905155s, valid=True
2026-06-03T10:43:20.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:43:20.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:43:20.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:42:48, diff=32.913379s, valid=True
2026-06-03T10:43:20.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:43:20.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:43:20.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:43:20.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:43:20.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:43:20.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:43:20.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:43:12, diff=8.917093s, valid=True
2026-06-03T10:43:20.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:43:20.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:43:20.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:43:20.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50397.917938s, valid=False
2026-06-03T10:43:20.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:43:20.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:43:20.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:43:20.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:43:20.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:43:20.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:43:20.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:43:20.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:43:21.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:43:21.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:43:21.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:43:21.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:43:21.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:43:21.238 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:43:21.499 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:43:21.826 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:43:21.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:43:21.926 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:43:21.926 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:43:22.006 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:43:22.006 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:43:52.012 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:43:52.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:43:52.012 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:43:52.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:43:52.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:43:52.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:43:52.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:43:52.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:43:52.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:43:52.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:43:52.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:43:52.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:43:52.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:43:54.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:43:54.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:43:54.876 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:43:54.876 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:43:54.883 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:43:54.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:43:54.895 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:43:54.896 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:43:54.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:43:54.896 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:43:54.897 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:43:54.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:43:55.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:43:55.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:43:55.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:43:55.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:43:55.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:43:55.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:43:55.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:43:55.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:43:55.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:43:55.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:43:55.186 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:43:55.254 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:43:51
2026-06-03T10:43:55.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85818, datetime.datetime(2026, 6, 3, 10, 43, 51), datetime.datetime(2026, 6, 3, 10, 43, 50), 'salt', 7.21, 99.28, None, 37.29, 106.42, 0.1, 823.83, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:43:55.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:43:55.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:43:55.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:43:50, diff=5.26161s, valid=True
2026-06-03T10:43:55.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:43:55.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:43:55.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:44:12, diff=-16.735166s, valid=True
2026-06-03T10:43:55.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:43:55.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:43:55.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:43:43, diff=12.272349s, valid=True
2026-06-03T10:43:55.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:43:55.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:43:55.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:43:55.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:43:55.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:43:55.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:43:55.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:44:12, diff=-16.72428s, valid=True
2026-06-03T10:43:55.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:43:55.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:43:55.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:43:55.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50432.276442s, valid=False
2026-06-03T10:43:55.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:43:55.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:43:55.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:43:55.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:43:55.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:43:55.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:43:55.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:43:55.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:43:55.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:43:55.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:43:55.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:43:55.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:43:55.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:43:55.595 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:43:55.789 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:43:56.120 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:43:56.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:43:56.226 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:43:56.226 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:43:56.442 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:43:56.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:44:26.472 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:44:26.473 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:44:26.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:44:26.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:44:26.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:44:26.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:44:26.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:44:26.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:44:26.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:44:26.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:44:26.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:44:26.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:44:26.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:44:29.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:44:29.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:44:29.332 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:44:29.332 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:44:29.343 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:44:29.356 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:44:29.357 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:44:29.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:44:29.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:44:29.358 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:44:29.358 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:44:29.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:44:29.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:44:29.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:44:29.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:44:29.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:44:29.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:44:29.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:44:29.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:44:29.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:44:29.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:44:29.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:44:29.648 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:44:29.718 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:44:21
2026-06-03T10:44:29.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85819, datetime.datetime(2026, 6, 3, 10, 44, 21), datetime.datetime(2026, 6, 3, 10, 44, 20), 'salt', 7.17, 99.25, None, 41.63, 104.87, 0.1, 824.02, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:44:29.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:44:29.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:44:29.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:44:20, diff=9.725539s, valid=True
2026-06-03T10:44:29.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:44:29.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:44:29.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:44:12, diff=17.728775s, valid=True
2026-06-03T10:44:29.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:44:29.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:44:29.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:44:13, diff=16.736112s, valid=True
2026-06-03T10:44:29.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:44:29.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:44:29.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:44:29.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:44:29.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:44:29.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:44:29.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:44:12, diff=17.739452s, valid=True
2026-06-03T10:44:29.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:44:29.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:44:29.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:44:29.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50466.740187s, valid=False
2026-06-03T10:44:29.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:44:29.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:44:29.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:44:29.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:44:29.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:44:29.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:44:29.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:44:29.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:44:29.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:44:29.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:44:29.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:44:29.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:44:30.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:44:30.163 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:44:30.356 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:44:30.683 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:44:30.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:44:30.783 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:44:30.783 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:44:30.961 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:44:30.961 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:45:00.991 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:45:00.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:45:00.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:45:01.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:45:01.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:45:01.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:45:01.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:45:01.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:45:01.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:45:01.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:45:01.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:45:01.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:45:01.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:45:04.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:45:04.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:45:04.137 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:45:04.137 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:45:04.147 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:45:04.159 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:45:04.160 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:45:04.160 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:45:04.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:45:04.160 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:45:04.160 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:45:04.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:45:04.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:45:04.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:45:04.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:45:04.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:45:04.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:45:04.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:45:04.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:45:04.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:45:04.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:45:04.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:45:04.449 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:45:04.526 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:44:51
2026-06-03T10:45:04.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85820, datetime.datetime(2026, 6, 3, 10, 44, 51), datetime.datetime(2026, 6, 3, 10, 44, 51), 'salt', 7.21, 99.18, None, 35.14, 99.5, 0.12, 824.02, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:45:04.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:45:04.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:45:04.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:44:51, diff=13.53285s, valid=True
2026-06-03T10:45:04.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:45:04.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:45:04.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:45:12, diff=-7.463873s, valid=True
2026-06-03T10:45:04.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:45:04.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:45:04.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:44:43, diff=21.543784s, valid=True
2026-06-03T10:45:04.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:45:04.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:45:04.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:45:04.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:45:04.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:45:04.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:45:04.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:45:12, diff=-7.452746s, valid=True
2026-06-03T10:45:04.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:45:04.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:45:04.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:45:04.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50501.548035s, valid=False
2026-06-03T10:45:04.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:45:04.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:45:04.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:45:04.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:45:04.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:45:04.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:45:04.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:45:04.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:45:04.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:45:04.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:45:04.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:45:04.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:45:04.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:45:04.868 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:45:05.064 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:45:05.397 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:45:05.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:45:05.498 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:45:05.498 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:45:05.685 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:45:05.685 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:45:35.692 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:45:35.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:45:35.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:45:35.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:45:35.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:45:36.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:45:36.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:45:36.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:45:36.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:45:36.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:45:36.117 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:45:36.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:45:36.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:45:38.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:45:38.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:45:38.800 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:45:38.801 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:45:38.811 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:45:38.824 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:45:38.825 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:45:38.825 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:45:38.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:45:38.826 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:45:38.826 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:45:38.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:45:38.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:45:38.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:45:39.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:45:39.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:45:39.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:45:39.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:45:39.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:45:39.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:45:39.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:45:39.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:45:39.174 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:45:39.247 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:45:22
2026-06-03T10:45:39.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85821, datetime.datetime(2026, 6, 3, 10, 45, 22), datetime.datetime(2026, 6, 3, 10, 45, 21), 'salt', 7.41, 99.28, None, 35.18, 85.72, 0.1, 823.95, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:45:39.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:45:39.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:45:39.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:45:21, diff=18.25469s, valid=True
2026-06-03T10:45:39.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:45:39.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:45:39.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:45:12, diff=27.25815s, valid=True
2026-06-03T10:45:39.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:45:39.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:45:39.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:45:14, diff=25.266271s, valid=True
2026-06-03T10:45:39.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:45:39.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:45:39.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:45:39.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:45:39.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:45:39.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:45:39.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:45:12, diff=27.270031s, valid=True
2026-06-03T10:45:39.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:45:39.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:45:39.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:45:39.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50536.27085s, valid=False
2026-06-03T10:45:39.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:45:39.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:45:39.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:45:39.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:45:39.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:45:39.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:45:39.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:45:39.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:45:39.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:45:39.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:45:39.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:45:39.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:45:39.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:45:39.657 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:45:39.856 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:45:40.205 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:45:40.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:45:40.305 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:45:40.305 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:45:40.374 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:45:40.375 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:46:10.398 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:46:10.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:46:10.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:46:10.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:46:10.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:46:11.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:46:11.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:46:11.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:46:11.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:46:11.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:46:11.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:46:11.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:46:11.084 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:46:13.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:46:13.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:46:13.728 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:46:13.729 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:46:13.739 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:46:13.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:46:13.753 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:46:13.753 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:46:13.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:46:13.754 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:46:13.754 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:46:13.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:46:13.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:46:13.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:46:13.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:46:13.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:46:14.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:46:14.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:46:14.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:46:14.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:46:14.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:46:14.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:46:14.084 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:46:14.154 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:45:52
2026-06-03T10:46:14.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85822, datetime.datetime(2026, 6, 3, 10, 45, 52), datetime.datetime(2026, 6, 3, 10, 45, 51), 'salt', 7.47, 99.25, None, 34.61, 90.88, 0.1, 824.2, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:46:14.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:46:14.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:46:14.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:45:51, diff=23.161856s, valid=True
2026-06-03T10:46:14.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:46:14.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:46:14.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:46:12, diff=2.165329s, valid=True
2026-06-03T10:46:14.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:46:14.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:46:14.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:45:46, diff=28.173551s, valid=True
2026-06-03T10:46:14.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:46:14.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:46:14.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:46:14.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:46:14.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:46:14.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:46:14.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:46:12, diff=2.177265s, valid=True
2026-06-03T10:46:14.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:46:14.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:46:14.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:46:14.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50571.178071s, valid=False
2026-06-03T10:46:14.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:46:14.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:46:14.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:46:14.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:46:14.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:46:14.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:46:14.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:46:14.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:46:14.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:46:14.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:46:14.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:46:14.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:46:14.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:46:14.497 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:46:14.690 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:46:15.018 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:46:15.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:46:15.118 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:46:15.118 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:46:15.295 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:46:15.350 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:46:45.367 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:46:45.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:46:45.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:46:45.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:46:45.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:46:45.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:46:45.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:46:45.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:46:45.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:46:45.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:46:45.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:46:45.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:46:45.795 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:46:48.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:46:48.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:46:48.418 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:46:48.418 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:46:48.429 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:46:48.442 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:46:48.448 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:46:48.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:46:48.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:46:48.449 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:46:48.449 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:46:48.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:46:48.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:46:48.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:46:48.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:46:48.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:46:48.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:46:48.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:46:48.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:46:48.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:46:48.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:46:48.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:46:48.827 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:46:48.897 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:46:22
2026-06-03T10:46:48.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85823, datetime.datetime(2026, 6, 3, 10, 46, 22), datetime.datetime(2026, 6, 3, 10, 46, 21), 'salt', 7.44, 99.22, None, 34.01, 81.91, 0.11, 824.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:46:48.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:46:48.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:46:48.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:46:21, diff=27.905201s, valid=True
2026-06-03T10:46:48.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:46:48.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:46:48.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:46:12, diff=36.908853s, valid=True
2026-06-03T10:46:48.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:46:48.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:46:48.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:46:17, diff=31.917309s, valid=True
2026-06-03T10:46:48.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:46:48.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:46:48.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:46:48.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:46:48.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:46:48.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:46:48.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:46:12, diff=36.921243s, valid=True
2026-06-03T10:46:48.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:46:48.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:46:48.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:46:48.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50605.922116s, valid=False
2026-06-03T10:46:48.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:46:48.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:46:48.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:46:48.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:46:48.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:46:48.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:46:48.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:46:48.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:46:49.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:46:49.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:46:49.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:46:49.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:46:49.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:46:49.311 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:46:49.507 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:46:49.840 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:46:49.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:46:49.950 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:46:49.950 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:46:52.237 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:46:52.237 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:47:22.249 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:47:22.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:47:22.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:47:22.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:47:22.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:47:22.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:47:22.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:47:22.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:47:22.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:47:22.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:47:22.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:47:22.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:47:22.860 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:47:25.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:47:25.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:47:25.548 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:47:25.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:47:25.558 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:47:25.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:47:25.574 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:47:25.574 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:47:25.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:47:25.575 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:47:25.575 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:47:25.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:47:25.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:47:25.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:47:25.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:47:25.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:47:25.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:47:25.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:47:25.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:47:25.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:47:25.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:47:25.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:47:25.918 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:47:25.990 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:47:23
2026-06-03T10:47:25.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85825, datetime.datetime(2026, 6, 3, 10, 47, 23), datetime.datetime(2026, 6, 3, 10, 47, 22), 'salt', 7.44, 99.31, None, 37.72, 90.32, 0.1, 824.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:47:25.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:47:25.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:47:25.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:47:22, diff=3.998477s, valid=True
2026-06-03T10:47:25.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:47:25.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:47:26.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:47:12, diff=14.003774s, valid=True
2026-06-03T10:47:26.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:47:26.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:47:26.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:47:21, diff=5.012588s, valid=True
2026-06-03T10:47:26.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:47:26.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:47:26.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:47:26.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:47:26.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:47:26.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:47:26.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:47:12, diff=14.016509s, valid=True
2026-06-03T10:47:26.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:47:26.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:47:26.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:47:26.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50643.017381s, valid=False
2026-06-03T10:47:26.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:47:26.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:47:26.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:47:26.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:47:26.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:47:26.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:47:26.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:47:26.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:47:26.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:47:26.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:47:26.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:47:26.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:47:26.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:47:26.361 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:47:26.569 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:47:26.921 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:47:27.028 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:47:27.028 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:47:27.029 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:47:27.100 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:47:27.100 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:47:57.131 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:47:57.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:47:57.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:47:57.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:47:57.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:47:57.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:47:57.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:47:57.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:47:57.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:47:57.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:47:57.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:47:57.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:47:57.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:48:00.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:48:00.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:48:00.273 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:48:00.273 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:48:00.284 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:48:00.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:48:00.301 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:48:00.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:48:00.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:48:00.303 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:48:00.303 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:48:00.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:48:00.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:48:00.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:48:00.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:48:00.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:48:00.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:48:00.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:48:00.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:48:00.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:48:00.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:48:00.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:48:00.643 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:48:00.725 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:47:53
2026-06-03T10:48:00.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85826, datetime.datetime(2026, 6, 3, 10, 47, 53), datetime.datetime(2026, 6, 3, 10, 47, 52), 'salt', 7.27, 99.31, None, 39.38, 90.44, 0.09, 824.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:48:00.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:48:00.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:48:00.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:47:52, diff=8.734132s, valid=True
2026-06-03T10:48:00.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:48:00.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:48:00.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:48:12, diff=-11.261175s, valid=True
2026-06-03T10:48:00.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:48:00.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:48:00.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:47:52, diff=8.748829s, valid=True
2026-06-03T10:48:00.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:48:00.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:48:00.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:48:00.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:48:00.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:48:00.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:48:00.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:48:12, diff=-11.24747s, valid=True
2026-06-03T10:48:00.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:48:00.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:48:00.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:48:00.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50677.75333s, valid=False
2026-06-03T10:48:00.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:48:00.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:48:00.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:48:00.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:48:00.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:48:00.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:48:00.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:48:00.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:48:00.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:48:00.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:48:00.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:48:00.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:48:01.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:48:01.074 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:48:01.272 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:48:01.642 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:48:01.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:48:01.745 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:48:01.745 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:48:01.930 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:48:01.930 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:48:31.942 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:48:31.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:48:31.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:48:32.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:48:32.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:48:32.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:48:32.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:48:32.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:48:32.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:48:32.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:48:32.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:48:32.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:48:32.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:48:35.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:48:35.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:48:35.084 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:48:35.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:48:35.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:48:35.106 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:48:35.107 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:48:35.107 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:48:35.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:48:35.108 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:48:35.108 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:48:35.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:48:35.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:48:35.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:48:35.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:48:35.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:48:35.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:48:35.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:48:35.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:48:35.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:48:35.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:48:35.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:48:35.454 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:48:35.525 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:48:23
2026-06-03T10:48:35.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85827, datetime.datetime(2026, 6, 3, 10, 48, 23), datetime.datetime(2026, 6, 3, 10, 48, 22), 'salt', 7.34, 99.28, None, 33.2, 88.65, 0.1, 823.83, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:48:35.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:48:35.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:48:35.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:48:22, diff=13.531973s, valid=True
2026-06-03T10:48:35.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:48:35.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:48:35.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:48:12, diff=23.534831s, valid=True
2026-06-03T10:48:35.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:48:35.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:48:35.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:48:15, diff=20.541539s, valid=True
2026-06-03T10:48:35.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:48:35.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:48:35.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:48:35.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:48:35.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:48:35.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:48:35.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:48:12, diff=23.544582s, valid=True
2026-06-03T10:48:35.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:48:35.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:48:35.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:48:35.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50712.545234s, valid=False
2026-06-03T10:48:35.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:48:35.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:48:35.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:48:35.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:48:35.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:48:35.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:48:35.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:48:35.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:48:35.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:48:35.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:48:35.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:48:35.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:48:35.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:48:35.858 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:48:36.053 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:48:36.446 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:48:36.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:48:36.547 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:48:36.547 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:48:36.767 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:48:36.767 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:49:06.794 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:49:06.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:49:06.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:49:06.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:49:06.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:49:07.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:49:07.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:49:07.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:49:07.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:49:07.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:49:07.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:49:07.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:49:07.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:49:09.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:49:09.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:49:09.837 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:49:09.837 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:49:09.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:49:09.858 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:49:09.859 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:49:09.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:49:09.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:49:09.859 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:49:09.859 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:49:09.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:49:09.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:49:09.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:49:10.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:49:10.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:49:10.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:49:10.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:49:10.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:49:10.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:49:10.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:49:10.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:49:10.155 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:49:10.249 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:48:53
2026-06-03T10:49:10.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85828, datetime.datetime(2026, 6, 3, 10, 48, 53), datetime.datetime(2026, 6, 3, 10, 48, 53), 'salt', 7.37, 99.25, None, 37.75, 88.21, 0.1, 824.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:49:10.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:49:10.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:49:10.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:48:53, diff=17.255943s, valid=True
2026-06-03T10:49:10.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:49:10.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:49:10.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:49:12, diff=-1.741094s, valid=True
2026-06-03T10:49:10.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:49:10.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:49:10.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:48:46, diff=24.26591s, valid=True
2026-06-03T10:49:10.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:49:10.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:49:10.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:49:10.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:49:10.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:49:10.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:49:10.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:49:12, diff=-1.730963s, valid=True
2026-06-03T10:49:10.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:49:10.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:49:10.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:49:10.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50747.269743s, valid=False
2026-06-03T10:49:10.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:49:10.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:49:10.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:49:10.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:49:10.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:49:10.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:49:10.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:49:10.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:49:10.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:49:10.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:49:10.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:49:10.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:49:10.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:49:10.588 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:49:10.787 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:49:11.121 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:49:11.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:49:11.223 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:49:11.223 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:49:11.378 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:49:11.379 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:49:41.409 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:49:41.409 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:49:41.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:49:41.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:49:41.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:49:41.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:49:41.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:49:41.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:49:41.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:49:41.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:49:41.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:49:41.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:49:41.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:49:44.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:49:44.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:49:44.213 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:49:44.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:49:44.222 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:49:44.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:49:44.236 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:49:44.236 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:49:44.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:49:44.237 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:49:44.237 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:49:44.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:49:44.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:49:44.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:49:44.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:49:44.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:49:44.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:49:44.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:49:44.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:49:44.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:49:44.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:49:44.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:49:44.555 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:49:44.627 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:49:24
2026-06-03T10:49:44.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85829, datetime.datetime(2026, 6, 3, 10, 49, 24), datetime.datetime(2026, 6, 3, 10, 49, 23), 'salt', 7.44, 99.25, None, 34.93, 91.73, 0.11, 823.95, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:49:44.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:49:44.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:49:44.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:49:23, diff=21.634458s, valid=True
2026-06-03T10:49:44.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:49:44.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:49:44.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:49:12, diff=32.637782s, valid=True
2026-06-03T10:49:44.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:49:44.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:49:44.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:49:16, diff=28.645507s, valid=True
2026-06-03T10:49:44.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:49:44.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:49:44.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:49:44.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:49:44.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:49:44.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:49:44.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:49:12, diff=32.649008s, valid=True
2026-06-03T10:49:44.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:49:44.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:49:44.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:49:44.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50781.649773s, valid=False
2026-06-03T10:49:44.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:49:44.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:49:44.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:49:44.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:49:44.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:49:44.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:49:44.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:49:44.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:49:44.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:49:44.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:49:44.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:49:44.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:49:44.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:49:44.969 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:49:45.246 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:49:45.586 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:49:45.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:49:45.688 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:49:45.688 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:49:45.759 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:49:45.759 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:50:15.790 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:50:15.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:50:15.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:50:16.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:50:16.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:50:16.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:50:16.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:50:16.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:50:16.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:50:16.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:50:16.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:50:16.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:50:16.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:50:19.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:50:19.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:50:19.188 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:50:19.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:50:19.200 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:50:19.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:50:19.213 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:50:19.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:50:19.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:50:19.215 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:50:19.215 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:50:19.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:50:19.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:50:19.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:50:19.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:50:19.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:50:19.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:50:19.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:50:19.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:50:19.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:50:19.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:50:19.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:50:19.952 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:50:20.069 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:49:54
2026-06-03T10:50:20.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85830, datetime.datetime(2026, 6, 3, 10, 49, 54), datetime.datetime(2026, 6, 3, 10, 49, 53), 'salt', 7.31, 99.21, None, 33.91, 90.27, 0.11, 824.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:50:20.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:50:20.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:50:20.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:49:53, diff=27.07542s, valid=True
2026-06-03T10:50:20.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:50:20.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:50:20.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:50:12, diff=8.078916s, valid=True
2026-06-03T10:50:20.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:50:20.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:50:20.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:49:47, diff=33.086512s, valid=True
2026-06-03T10:50:20.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:50:20.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:50:20.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:50:20.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:50:20.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:50:20.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:50:20.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:50:12, diff=8.089693s, valid=True
2026-06-03T10:50:20.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:50:20.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:50:20.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:50:20.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50817.090355s, valid=False
2026-06-03T10:50:20.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:50:20.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:50:20.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:50:20.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:50:20.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:50:20.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:50:20.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:50:20.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:50:20.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:50:20.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:50:20.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:50:20.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:50:20.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:50:20.415 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:50:20.618 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:50:20.954 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:50:21.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:50:21.056 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:50:21.056 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:50:21.321 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:50:21.322 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:50:51.337 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:50:51.337 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:50:51.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:50:51.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:50:51.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:50:51.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:50:51.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:50:51.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:50:51.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:50:51.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:50:51.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:50:51.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:50:51.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:50:54.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:50:54.806 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:50:54.807 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:50:54.807 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:50:54.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:50:54.830 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:50:54.831 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:50:54.831 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:50:54.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:50:54.832 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:50:54.832 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:50:54.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:50:54.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:50:54.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:50:55.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:50:55.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:50:55.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:50:55.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:50:55.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T10:50:55.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:50:55.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:50:55.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:50:55.172 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:50:55.248 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:50:25
2026-06-03T10:50:55.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85831, datetime.datetime(2026, 6, 3, 10, 50, 25), datetime.datetime(2026, 6, 3, 10, 50, 24), 'salt', 7.41, 99.28, None, 41.07, 92.92, 0.1, 823.95, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:50:55.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:50:55.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:50:55.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:50:24, diff=31.255829s, valid=True
2026-06-03T10:50:55.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:50:55.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:50:55.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:50:12, diff=43.259307s, valid=True
2026-06-03T10:50:55.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:50:55.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:50:55.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:50:50, diff=5.267428s, valid=True
2026-06-03T10:50:55.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:50:55.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:50:55.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:50:55.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:50:55.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:50:55.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T10:50:55.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:50:12, diff=43.271232s, valid=True
2026-06-03T10:50:55.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:50:55.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:50:55.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:50:55.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50852.272056s, valid=False
2026-06-03T10:50:55.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:50:55.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:50:55.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:50:55.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:50:55.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:50:55.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:50:55.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:50:55.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:50:55.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:50:55.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:50:55.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:50:55.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:50:55.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:50:55.662 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:50:55.865 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:50:56.205 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:50:56.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:50:56.306 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:50:56.307 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:50:56.540 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:50:56.540 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:51:26.570 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:51:26.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:51:26.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:51:26.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:51:26.744 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:51:26.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:51:26.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:51:26.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:51:26.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:51:27.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:51:27.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:51:27.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:51:27.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:51:29.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:51:29.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:51:29.604 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:51:29.604 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:51:29.615 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:51:29.628 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:51:29.628 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:51:29.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:51:29.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:51:29.630 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:51:29.630 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:51:29.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:51:29.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:51:29.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:51:29.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:51:29.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:51:29.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:51:29.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:51:29.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T10:51:29.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:51:29.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:51:29.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:51:29.959 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:51:30.027 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:51:25
2026-06-03T10:51:30.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85833, datetime.datetime(2026, 6, 3, 10, 51, 25), datetime.datetime(2026, 6, 3, 10, 51, 25), 'salt', 7.21, 99.25, None, 38.49, 95.44, 0.11, 823.95, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:51:30.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:51:30.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:51:30.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:51:25, diff=5.033203s, valid=True
2026-06-03T10:51:30.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:51:30.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:51:30.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:51:12, diff=18.036137s, valid=True
2026-06-03T10:51:30.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:51:30.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:51:30.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:51:22, diff=8.043316s, valid=True
2026-06-03T10:51:30.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:51:30.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:51:30.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:51:30.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:51:30.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:51:30.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T10:51:30.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:51:12, diff=18.046429s, valid=True
2026-06-03T10:51:30.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:51:30.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:51:30.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:51:30.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50887.047104s, valid=False
2026-06-03T10:51:30.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:51:30.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:51:30.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:51:30.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:51:30.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:51:30.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:51:30.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:51:30.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:51:30.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:51:30.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:51:30.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:51:30.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:51:30.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:51:30.368 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:51:30.572 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:51:30.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:51:31.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:51:31.014 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:51:31.014 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:51:31.171 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:51:31.171 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:52:01.187 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:52:01.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:52:01.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:52:01.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:52:01.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:52:01.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:52:01.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:52:01.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:52:01.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:52:01.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:52:01.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:52:01.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:52:01.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:52:04.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:52:04.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:52:04.158 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:52:04.158 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:52:04.168 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:52:04.186 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:52:04.187 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:52:04.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:52:04.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:52:04.188 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:52:04.188 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:52:04.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:52:04.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:52:04.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:52:04.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:52:04.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:52:04.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T10:52:04.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:52:04.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T10:52:04.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:52:04.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:52:04.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:52:04.771 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:52:04.864 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:51:56
2026-06-03T10:52:04.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85834, datetime.datetime(2026, 6, 3, 10, 51, 56), datetime.datetime(2026, 6, 3, 10, 51, 55), 'salt', 7.27, 99.28, None, 32.11, 91.02, 0.1, 824.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:52:04.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:52:04.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:52:04.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:51:55, diff=9.872774s, valid=True
2026-06-03T10:52:04.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:52:04.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T10:52:04.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:52:12, diff=-7.123101s, valid=True
2026-06-03T10:52:04.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:52:04.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:52:04.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:51:53, diff=11.886571s, valid=True
2026-06-03T10:52:04.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:52:04.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:52:04.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:52:04.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:52:04.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:52:04.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T10:52:04.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:52:12, diff=-7.108954s, valid=True
2026-06-03T10:52:04.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:52:04.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:52:04.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:52:04.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50921.892078s, valid=False
2026-06-03T10:52:04.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:52:04.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:52:04.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:52:04.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:52:04.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:52:04.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:52:04.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:52:04.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:52:04.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:52:05.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:52:05.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:52:05.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:52:05.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:52:05.284 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:52:05.489 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:52:05.833 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:52:05.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:52:05.936 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:52:05.936 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:52:06.009 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:52:06.009 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:52:36.035 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:52:36.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:52:36.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:52:36.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:52:36.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:52:36.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:52:36.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:52:36.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:52:36.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:52:36.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:52:36.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:52:36.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:52:36.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:52:39.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:52:39.282 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:52:39.283 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:52:39.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:52:39.293 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:52:39.307 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:52:39.308 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:52:39.308 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:52:39.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:52:39.309 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:52:39.309 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:52:39.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:52:39.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:52:39.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:52:39.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:52:39.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:52:39.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T10:52:39.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:52:39.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T10:52:39.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:52:39.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:52:39.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:52:39.641 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:52:39.714 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:52:26
2026-06-03T10:52:39.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85835, datetime.datetime(2026, 6, 3, 10, 52, 26), datetime.datetime(2026, 6, 3, 10, 52, 25), 'salt', 7.34, 99.25, None, 28.97, 89.94, 0.11, 824.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:52:39.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:52:39.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:52:39.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:52:25, diff=14.722097s, valid=True
2026-06-03T10:52:39.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:52:39.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T10:52:39.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:52:12, diff=27.725612s, valid=True
2026-06-03T10:52:39.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:52:39.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:52:39.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:52:24, diff=15.733795s, valid=True
2026-06-03T10:52:39.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:52:39.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:52:39.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:52:39.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:52:39.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:52:39.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T10:52:39.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:52:12, diff=27.737524s, valid=True
2026-06-03T10:52:39.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:52:39.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:52:39.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:52:39.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50956.738346s, valid=False
2026-06-03T10:52:39.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:52:39.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:52:39.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:52:39.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:52:39.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:52:39.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:52:39.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:52:39.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:52:39.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:52:39.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:52:39.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:52:40.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:52:40.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:52:40.096 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:52:40.303 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:52:40.638 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:52:40.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:52:40.740 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:52:40.740 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:52:40.812 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:52:40.812 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:53:10.842 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:53:10.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:53:10.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:53:10.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:53:10.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:53:11.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:53:11.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:53:11.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:53:11.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:53:11.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:53:11.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:53:11.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:53:11.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:53:13.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:53:13.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:53:13.753 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:53:13.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:53:13.763 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:53:13.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:53:13.776 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:53:13.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:53:13.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:53:13.777 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:53:13.778 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:53:13.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:53:13.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:53:13.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:53:14.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:53:14.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:53:14.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T10:53:14.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:53:14.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T10:53:14.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:53:14.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:53:14.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:53:14.177 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:53:14.250 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:52:57
2026-06-03T10:53:14.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85836, datetime.datetime(2026, 6, 3, 10, 52, 57), datetime.datetime(2026, 6, 3, 10, 52, 56), 'salt', 7.27, 99.28, None, 34.72, 88.61, 0.1, 823.95, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:53:14.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:53:14.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:53:14.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:52:56, diff=18.256994s, valid=True
2026-06-03T10:53:14.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:53:14.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T10:53:14.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:53:12, diff=2.259889s, valid=True
2026-06-03T10:53:14.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:53:14.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:53:14.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:52:56, diff=18.266536s, valid=True
2026-06-03T10:53:14.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:53:14.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:53:14.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:53:14.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:53:14.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:53:14.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T10:53:14.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:53:12, diff=2.269571s, valid=True
2026-06-03T10:53:14.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:53:14.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:53:14.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:53:14.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=50991.270236s, valid=False
2026-06-03T10:53:14.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:53:14.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:53:14.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:53:14.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:53:14.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:53:14.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:53:14.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:53:14.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:53:14.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:53:14.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:53:14.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:53:14.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:53:14.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:53:14.586 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:53:14.792 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:53:15.133 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:53:15.235 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:53:15.236 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:53:15.236 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:53:15.387 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:53:15.387 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:53:45.407 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:53:45.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:53:45.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:53:45.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:53:45.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:53:45.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:53:45.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:53:45.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:53:45.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:53:45.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:53:45.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:53:45.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:53:45.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:53:48.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:53:48.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:53:48.329 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:53:48.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:53:48.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:53:48.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:53:48.354 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:53:48.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:53:48.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:53:48.355 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:53:48.355 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:53:48.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:53:48.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:53:48.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:53:48.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:53:48.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:53:48.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T10:53:48.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:53:48.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T10:53:48.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:53:48.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:53:48.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:53:48.683 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:53:48.753 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:53:28
2026-06-03T10:53:48.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85837, datetime.datetime(2026, 6, 3, 10, 53, 28), datetime.datetime(2026, 6, 3, 10, 53, 28), 'salt', 7.34, 99.35, None, 38.14, 95.74, 0.09, 824.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:53:48.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:53:48.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:53:48.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:53:28, diff=20.761217s, valid=True
2026-06-03T10:53:48.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:53:48.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T10:53:48.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:53:12, diff=36.764744s, valid=True
2026-06-03T10:53:48.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:53:48.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:53:48.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:53:28, diff=20.772776s, valid=True
2026-06-03T10:53:48.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:53:48.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:53:48.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:53:48.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:53:48.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:53:48.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T10:53:48.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:53:12, diff=36.776473s, valid=True
2026-06-03T10:53:48.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:53:48.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:53:48.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:53:48.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51025.77729s, valid=False
2026-06-03T10:53:48.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:53:48.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:53:48.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:53:48.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:53:48.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:53:48.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:53:48.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:53:48.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:53:48.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:53:48.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:53:48.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:53:49.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:53:49.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:53:49.098 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:53:49.300 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:53:49.636 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:53:49.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:53:49.737 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:53:49.738 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:53:49.807 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:53:49.807 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:54:19.837 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:54:19.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:54:19.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:54:19.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:54:19.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:54:20.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:54:20.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:54:20.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:54:20.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:54:20.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:54:20.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:54:20.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:54:20.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:54:22.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:54:22.780 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:54:22.781 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:54:22.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:54:22.793 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:54:22.806 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:54:22.807 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:54:22.807 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:54:22.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:54:22.808 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:54:22.808 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:54:22.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:54:23.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:54:23.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:54:23.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:54:23.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:54:23.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:54:23.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:54:23.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:54:23.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:54:23.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:54:23.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:54:23.488 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:54:23.592 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:53:59
2026-06-03T10:54:23.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85838, datetime.datetime(2026, 6, 3, 10, 53, 59), datetime.datetime(2026, 6, 3, 10, 53, 58), 'salt', 7.21, 99.21, None, 40.68, 88.21, 0.11, 824.19, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:54:23.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:54:23.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:54:23.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:53:58, diff=25.601154s, valid=True
2026-06-03T10:54:23.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:54:23.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:54:23.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:54:12, diff=11.605431s, valid=True
2026-06-03T10:54:23.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:54:23.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:54:23.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:53:59, diff=24.615533s, valid=True
2026-06-03T10:54:23.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:54:23.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:54:23.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:54:23.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:54:23.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:54:23.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:54:23.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:54:12, diff=11.620082s, valid=True
2026-06-03T10:54:23.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:54:23.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:54:23.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:54:23.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51060.621059s, valid=False
2026-06-03T10:54:23.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:54:23.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:54:23.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:54:23.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:54:23.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:54:23.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:54:23.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:54:23.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:54:23.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:54:23.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:54:23.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:54:23.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:54:23.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:54:23.946 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:54:24.148 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:54:24.486 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:54:24.587 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:54:24.587 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:54:24.587 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:54:24.810 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:54:24.810 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:54:54.841 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:54:54.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:54:54.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:54:54.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:54:54.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:54:55.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:54:55.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:54:55.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:54:55.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:54:55.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:54:55.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:54:55.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:54:55.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:54:57.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:54:57.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:54:57.665 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:54:57.665 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:54:57.676 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:54:57.692 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:54:57.693 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:54:57.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:54:57.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:54:57.694 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:54:57.694 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:54:57.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:54:57.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:54:57.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:54:57.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:54:57.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:54:57.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T10:54:57.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:54:57.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T10:54:57.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:54:57.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:54:57.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:54:57.997 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:54:58.067 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:54:29
2026-06-03T10:54:58.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85839, datetime.datetime(2026, 6, 3, 10, 54, 29), datetime.datetime(2026, 6, 3, 10, 54, 28), 'salt', 7.21, 99.28, None, 40.75, 89.54, 0.1, 823.89, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:54:58.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:54:58.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:54:58.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:54:28, diff=30.074615s, valid=True
2026-06-03T10:54:58.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:54:58.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T10:54:58.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:54:12, diff=46.077856s, valid=True
2026-06-03T10:54:58.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:54:58.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:54:58.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:54:28, diff=30.085555s, valid=True
2026-06-03T10:54:58.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:54:58.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:54:58.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:54:58.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:54:58.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:54:58.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T10:54:58.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:54:12, diff=46.089045s, valid=True
2026-06-03T10:54:58.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:54:58.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:54:58.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:54:58.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51095.089799s, valid=False
2026-06-03T10:54:58.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:54:58.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:54:58.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:54:58.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:54:58.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:54:58.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:54:58.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:54:58.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:54:58.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:54:58.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:54:58.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:54:58.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:54:58.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:54:58.412 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:54:58.613 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:54:59.012 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:54:59.113 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:54:59.113 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:54:59.113 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:54:59.267 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:54:59.267 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:55:29.297 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:55:29.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:55:29.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:55:29.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:55:29.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:55:29.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:55:29.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:55:29.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:55:29.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:55:29.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:55:29.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:55:29.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:55:29.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:55:32.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:55:32.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:55:32.049 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:55:32.049 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:55:32.059 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:55:32.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:55:32.073 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:55:32.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:55:32.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:55:32.074 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:55:32.075 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:55:32.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:55:32.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:55:32.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:55:32.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:55:32.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:55:32.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:55:32.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:55:32.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:55:32.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:55:32.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:55:32.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:55:32.418 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:55:32.493 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:55:30
2026-06-03T10:55:32.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85841, datetime.datetime(2026, 6, 3, 10, 55, 30), datetime.datetime(2026, 6, 3, 10, 55, 29), 'salt', 7.24, 99.28, None, 29.32, 96.02, 0.1, 824.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:55:32.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:55:32.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:55:32.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:55:29, diff=3.50105s, valid=True
2026-06-03T10:55:32.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:55:32.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:55:32.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:55:12, diff=20.50455s, valid=True
2026-06-03T10:55:32.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:55:32.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:55:32.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:55:29, diff=3.512798s, valid=True
2026-06-03T10:55:32.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:55:32.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:55:32.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:55:32.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:55:32.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:55:32.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:55:32.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:55:12, diff=20.516496s, valid=True
2026-06-03T10:55:32.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:55:32.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:55:32.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:55:32.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51129.517308s, valid=False
2026-06-03T10:55:32.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:55:32.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:55:32.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:55:32.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:55:32.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:55:32.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:55:32.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:55:32.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:55:32.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:55:32.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:55:32.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:55:32.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:55:32.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:55:32.836 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:55:33.039 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:55:33.376 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:55:33.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:55:33.477 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:55:33.477 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:55:33.740 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:55:33.740 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:56:03.753 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:56:03.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:56:03.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:56:03.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:56:03.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:56:04.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:56:04.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:56:04.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:56:04.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:56:04.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:56:04.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:56:04.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:56:04.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:56:06.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:56:06.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:56:06.496 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:56:06.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:56:06.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:56:06.518 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:56:06.518 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:56:06.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:56:06.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:56:06.519 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:56:06.520 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:56:06.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:56:06.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:56:06.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:56:06.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:56:06.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:56:06.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:56:06.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:56:06.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:56:06.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:56:06.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:56:06.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:56:06.865 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:56:06.936 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:56:00
2026-06-03T10:56:06.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85842, datetime.datetime(2026, 6, 3, 10, 56), datetime.datetime(2026, 6, 3, 10, 55, 59), 'salt', 7.27, 99.35, None, 27.2, 96.73, 0.09, 823.95, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:56:06.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:56:06.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:56:06.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:55:59, diff=7.943833s, valid=True
2026-06-03T10:56:06.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:56:06.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:56:06.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:56:12, diff=-5.052735s, valid=True
2026-06-03T10:56:06.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:56:06.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:56:06.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:55:59, diff=7.955259s, valid=True
2026-06-03T10:56:06.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:56:06.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:56:06.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:56:06.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:56:06.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:56:06.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:56:06.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:56:12, diff=-5.041114s, valid=True
2026-06-03T10:56:06.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:56:06.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:56:06.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:56:06.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51163.959702s, valid=False
2026-06-03T10:56:06.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:56:06.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:56:06.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:56:06.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:56:06.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:56:07.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:56:07.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:56:07.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:56:07.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:56:07.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:56:07.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:56:07.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:56:07.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:56:07.278 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:56:07.555 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:56:07.892 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:56:07.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:56:07.993 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:56:07.993 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:56:08.166 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:56:08.166 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:56:38.188 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:56:38.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:56:38.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:56:38.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:56:38.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:56:38.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:56:38.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:56:38.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:56:38.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:56:38.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:56:38.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:56:38.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:56:38.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:56:41.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:56:41.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:56:41.044 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:56:41.044 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:56:41.055 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:56:41.068 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:56:41.068 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:56:41.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:56:41.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:56:41.070 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:56:41.070 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:56:41.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:56:41.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:56:41.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:56:41.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:56:41.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:56:41.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:56:41.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:56:41.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:56:41.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:56:41.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:56:41.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:56:41.395 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:56:41.472 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:56:31
2026-06-03T10:56:41.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85843, datetime.datetime(2026, 6, 3, 10, 56, 31), datetime.datetime(2026, 6, 3, 10, 56, 30), 'salt', 7.44, 99.35, None, 27.59, 96.21, 0.09, 824.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:56:41.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:56:41.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:56:41.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:56:30, diff=11.480075s, valid=True
2026-06-03T10:56:41.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:56:41.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:56:41.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:56:12, diff=29.483466s, valid=True
2026-06-03T10:56:41.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:56:41.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:56:41.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:56:29, diff=12.491886s, valid=True
2026-06-03T10:56:41.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:56:41.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:56:41.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:56:41.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:56:41.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:56:41.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:56:41.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:56:12, diff=29.495553s, valid=True
2026-06-03T10:56:41.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:56:41.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:56:41.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:56:41.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51198.496351s, valid=False
2026-06-03T10:56:41.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:56:41.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:56:41.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:56:41.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:56:41.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:56:41.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:56:41.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:56:41.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:56:41.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:56:41.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:56:41.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:56:41.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:56:41.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:56:41.816 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:56:42.020 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:56:42.358 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:56:42.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:56:42.460 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:56:42.460 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:56:42.675 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:56:42.675 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:57:12.705 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:57:12.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:57:12.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:57:13.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:57:13.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:57:13.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:57:13.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:57:13.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:57:13.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:57:13.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:57:13.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:57:13.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:57:13.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:57:16.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:57:16.213 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:57:16.214 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:57:16.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:57:16.225 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:57:16.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:57:16.238 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:57:16.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:57:16.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:57:16.239 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:57:16.240 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:57:16.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:57:16.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:57:16.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:57:16.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:57:16.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:57:16.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:57:16.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:57:16.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:57:16.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:57:16.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:57:16.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:57:16.572 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:57:16.641 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:57:01
2026-06-03T10:57:16.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85844, datetime.datetime(2026, 6, 3, 10, 57, 1), datetime.datetime(2026, 6, 3, 10, 57, 1), 'salt', 7.47, 99.28, None, 34.75, 94.54, 0.1, 823.82, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:57:16.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:57:16.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:57:16.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:57:01, diff=15.649178s, valid=True
2026-06-03T10:57:16.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:57:16.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:57:16.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:57:12, diff=4.652688s, valid=True
2026-06-03T10:57:16.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:57:16.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:57:16.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:57:00, diff=16.660835s, valid=True
2026-06-03T10:57:16.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:57:16.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:57:16.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:57:16.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:57:16.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:57:16.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:57:16.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:57:12, diff=4.66458s, valid=True
2026-06-03T10:57:16.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:57:16.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:57:16.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:57:16.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51233.665401s, valid=False
2026-06-03T10:57:16.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:57:16.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:57:16.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:57:16.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:57:16.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:57:16.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:57:16.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:57:16.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:57:16.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:57:16.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:57:16.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:57:16.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:57:16.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:57:17.058 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:57:17.259 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:57:17.594 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:57:17.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:57:17.693 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:57:17.693 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:57:17.869 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:57:17.869 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:57:47.885 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:57:47.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:57:47.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:57:48.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:57:48.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:57:48.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:57:48.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:57:48.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:57:48.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:57:48.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:57:48.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:57:48.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:57:48.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:57:51.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:57:51.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:57:51.266 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:57:51.267 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:57:51.277 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:57:51.290 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:57:51.291 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:57:51.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:57:51.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:57:51.292 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:57:51.292 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:57:51.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:57:51.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:57:51.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:57:51.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:57:51.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:57:51.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T10:57:51.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:57:51.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T10:57:51.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:57:51.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:57:51.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:57:51.634 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:57:51.708 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:57:32
2026-06-03T10:57:51.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85845, datetime.datetime(2026, 6, 3, 10, 57, 32), datetime.datetime(2026, 6, 3, 10, 57, 30), 'salt', 7.37, 99.28, None, 39.31, 105.23, 0.1, 823.88, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:57:51.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:57:51.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:57:51.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:57:30, diff=21.71628s, valid=True
2026-06-03T10:57:51.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:57:51.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T10:57:51.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:57:12, diff=39.719781s, valid=True
2026-06-03T10:57:51.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:57:51.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:57:51.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:57:30, diff=21.728006s, valid=True
2026-06-03T10:57:51.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:57:51.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:57:51.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:57:51.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:57:51.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:57:51.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T10:57:51.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:57:12, diff=39.731759s, valid=True
2026-06-03T10:57:51.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:57:51.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:57:51.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:57:51.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51268.732583s, valid=False
2026-06-03T10:57:51.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:57:51.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:57:51.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:57:51.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:57:51.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:57:51.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:57:51.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:57:51.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:57:51.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:57:51.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:57:51.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:57:51.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:57:52.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:57:52.053 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:57:52.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:57:52.591 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:57:52.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:57:52.692 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:57:52.692 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:57:52.904 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:57:52.904 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:58:22.935 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:58:22.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:58:22.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:58:23.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:58:23.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:58:23.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:58:23.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:58:23.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:58:23.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:58:23.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:58:23.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:58:23.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:58:23.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:58:26.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:58:26.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:58:26.032 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:58:26.032 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:58:26.044 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:58:26.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:58:26.057 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:58:26.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:58:26.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:58:26.058 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:58:26.058 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:58:26.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:58:26.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:58:26.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:58:26.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:58:26.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:58:26.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:58:26.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:58:26.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T10:58:26.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:58:26.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:58:26.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:58:26.391 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:58:26.460 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:58:02
2026-06-03T10:58:26.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85846, datetime.datetime(2026, 6, 3, 10, 58, 2), datetime.datetime(2026, 6, 3, 10, 58, 1), 'salt', 7.2, 99.28, None, 39.8, 97.71, 0.09, 824.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:58:26.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:58:26.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:58:26.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:58:01, diff=25.467702s, valid=True
2026-06-03T10:58:26.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:58:26.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:58:26.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:58:12, diff=14.471174s, valid=True
2026-06-03T10:58:26.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:58:26.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:58:26.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:58:00, diff=26.479344s, valid=True
2026-06-03T10:58:26.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:58:26.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:58:26.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:58:26.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:58:26.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:58:26.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T10:58:26.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:58:12, diff=14.483041s, valid=True
2026-06-03T10:58:26.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:58:26.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:58:26.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:58:26.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51303.48385s, valid=False
2026-06-03T10:58:26.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:58:26.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:58:26.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:58:26.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:58:26.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:58:26.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:58:26.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:58:26.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:58:26.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:58:26.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:58:26.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:58:26.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:58:26.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:58:26.872 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:58:27.074 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:58:27.411 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:58:27.513 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:58:27.514 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:58:27.514 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:58:27.694 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:58:27.695 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:58:57.725 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:58:57.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:58:57.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:58:58.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:58:58.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:58:58.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:58:58.314 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:58:58.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:58:58.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:58:58.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:58:58.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:58:58.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:58:58.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:59:00.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:59:00.952 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:59:00.953 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:59:00.953 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:59:00.964 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:59:00.977 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:59:00.978 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:59:00.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:59:00.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:59:00.979 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:59:00.979 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:59:00.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:59:01.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T10:59:01.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:59:01.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T10:59:01.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:59:01.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T10:59:01.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:59:01.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T10:59:01.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:59:01.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:59:01.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:59:01.321 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:59:01.394 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:58:32
2026-06-03T10:59:01.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85847, datetime.datetime(2026, 6, 3, 10, 58, 32), datetime.datetime(2026, 6, 3, 10, 58, 31), 'salt', 7.2, 99.25, None, 37.37, 105.74, 0.1, 823.88, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:59:01.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:59:01.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T10:59:01.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:58:31, diff=30.401909s, valid=True
2026-06-03T10:59:01.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:59:01.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T10:59:01.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:58:12, diff=49.405406s, valid=True
2026-06-03T10:59:01.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:59:01.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T10:59:01.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:58:31, diff=30.413577s, valid=True
2026-06-03T10:59:01.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:59:01.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:59:01.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:59:01.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:59:01.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:59:01.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T10:59:01.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:58:12, diff=49.417305s, valid=True
2026-06-03T10:59:01.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:59:01.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:59:01.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:59:01.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51338.418121s, valid=False
2026-06-03T10:59:01.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:59:01.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:59:01.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:59:01.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:59:01.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:59:01.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:59:01.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:59:01.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:59:01.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:59:01.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:59:01.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:59:01.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:59:01.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:59:01.742 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:59:01.947 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:59:02.322 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:59:02.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:59:02.427 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:59:02.427 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:59:02.494 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:59:02.494 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T10:59:32.501 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T10:59:32.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T10:59:32.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T10:59:32.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T10:59:32.795 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T10:59:33.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T10:59:33.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T10:59:33.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T10:59:33.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T10:59:33.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T10:59:33.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T10:59:33.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T10:59:33.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T10:59:37.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T10:59:37.314 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T10:59:37.314 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T10:59:37.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T10:59:37.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T10:59:37.335 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T10:59:37.335 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T10:59:37.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T10:59:37.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T10:59:37.335 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T10:59:37.335 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T10:59:37.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T10:59:37.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T10:59:37.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T10:59:37.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T10:59:37.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:59:37.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T10:59:37.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T10:59:37.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T10:59:37.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T10:59:37.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T10:59:37.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T10:59:37.743 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T10:59:37.815 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 10:59:33
2026-06-03T10:59:37.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85849, datetime.datetime(2026, 6, 3, 10, 59, 33), datetime.datetime(2026, 6, 3, 10, 59, 32), 'salt', 7.34, 99.35, None, 32.96, 95.81, 0.09, 824.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T10:59:37.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T10:59:37.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T10:59:37.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:59:32, diff=5.823229s, valid=True
2026-06-03T10:59:37.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T10:59:37.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T10:59:37.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:58:12, diff=85.826559s, valid=True
2026-06-03T10:59:37.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T10:59:37.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T10:59:37.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:59:31, diff=6.833944s, valid=True
2026-06-03T10:59:37.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T10:59:37.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:59:37.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T10:59:37.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T10:59:37.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T10:59:37.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T10:59:37.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:58:12, diff=85.837171s, valid=True
2026-06-03T10:59:37.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T10:59:37.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T10:59:37.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T10:59:37.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51374.83787s, valid=False
2026-06-03T10:59:37.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T10:59:37.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T10:59:37.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T10:59:37.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T10:59:37.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T10:59:37.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T10:59:37.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T10:59:37.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T10:59:37.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T10:59:37.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T10:59:38.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T10:59:38.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T10:59:38.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T10:59:38.155 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T10:59:38.359 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:59:38.697 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T10:59:38.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T10:59:38.799 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T10:59:38.799 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T10:59:38.968 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T10:59:38.969 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:00:08.974 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:00:08.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:00:08.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:00:09.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:00:09.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:00:09.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:00:09.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:00:09.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:00:09.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:00:09.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:00:09.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:00:09.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:00:09.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:00:12.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:00:12.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:00:12.291 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:00:12.291 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:00:12.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:00:12.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:00:12.316 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:00:12.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:00:12.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:00:12.317 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:00:12.317 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:00:12.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:00:12.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:00:12.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:00:12.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:00:12.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:00:12.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T11:00:12.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:00:12.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T11:00:12.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:00:12.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:00:12.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:00:12.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:00:12.781 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:00:03
2026-06-03T11:00:12.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85850, datetime.datetime(2026, 6, 3, 11, 0, 3), datetime.datetime(2026, 6, 3, 11, 0, 2), 'salt', 7.37, 99.31, None, 34.68, 98.28, 0.09, 823.76, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:00:12.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:00:12.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:00:12.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:00:02, diff=10.789081s, valid=True
2026-06-03T11:00:12.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:00:12.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T11:00:12.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:58:12, diff=120.792688s, valid=True
2026-06-03T11:00:12.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:00:12.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:00:12.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:00:01, diff=11.801065s, valid=True
2026-06-03T11:00:12.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:00:12.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:00:12.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:00:12.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:00:12.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:00:12.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T11:00:12.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:58:12, diff=120.804927s, valid=True
2026-06-03T11:00:12.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:00:12.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:00:12.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:00:12.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51409.805768s, valid=False
2026-06-03T11:00:12.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:00:12.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:00:12.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:00:12.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:00:12.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:00:12.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:00:12.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:00:12.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:00:12.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:00:12.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:00:13.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:00:13.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:00:13.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:00:13.127 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:00:13.329 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:00:13.665 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:00:13.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:00:13.767 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:00:13.767 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:00:14.790 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:00:14.791 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:00:44.797 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:00:44.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:00:44.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:00:45.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:00:45.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:00:45.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:00:45.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:00:45.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:00:45.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:00:45.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:00:45.429 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:00:45.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:00:45.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:00:48.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:00:48.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:00:48.412 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:00:48.412 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:00:48.423 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:00:48.437 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:00:48.438 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:00:48.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:00:48.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:00:48.439 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:00:48.439 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:00:48.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:00:48.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:00:48.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:00:48.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:00:48.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:00:48.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T11:00:48.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:00:48.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T11:00:48.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:00:48.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:00:48.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:00:48.722 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:00:48.790 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:00:33
2026-06-03T11:00:48.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85851, datetime.datetime(2026, 6, 3, 11, 0, 33), datetime.datetime(2026, 6, 3, 11, 0, 32), 'salt', 7.47, 99.34, None, 32.28, 95.11, 0.09, 823.88, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:00:48.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:00:48.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:00:48.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:00:32, diff=16.796506s, valid=True
2026-06-03T11:00:48.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:00:48.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T11:00:48.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:58:12, diff=156.799311s, valid=True
2026-06-03T11:00:48.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:00:48.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:00:48.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:00:31, diff=17.805859s, valid=True
2026-06-03T11:00:48.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:00:48.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:00:48.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:00:48.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:00:48.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:00:48.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T11:00:48.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:58:12, diff=156.808826s, valid=True
2026-06-03T11:00:48.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:00:48.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:00:48.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:00:48.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51445.809465s, valid=False
2026-06-03T11:00:48.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:00:48.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:00:48.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:00:48.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:00:48.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:00:48.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:00:48.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:00:48.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:00:48.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:00:48.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:00:48.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:00:49.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:00:49.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:00:49.122 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:00:49.326 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:00:49.666 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:00:49.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:00:49.769 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:00:49.769 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:00:49.940 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:00:49.940 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:01:19.969 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:01:19.969 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:01:19.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:01:20.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:01:20.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:01:20.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:01:20.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:01:20.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:01:20.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:01:20.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:01:20.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:01:20.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:01:20.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:01:23.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:01:23.403 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:01:23.403 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:01:23.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:01:23.412 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:01:23.423 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:01:23.424 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:01:23.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:01:23.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:01:23.424 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:01:23.424 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:01:23.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:01:23.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:01:23.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:01:23.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:01:23.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:01:23.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:01:23.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:01:23.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:01:23.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:01:23.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:01:23.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:01:23.741 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:01:23.818 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:01:03
2026-06-03T11:01:23.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85852, datetime.datetime(2026, 6, 3, 11, 1, 3), datetime.datetime(2026, 6, 3, 11, 1, 3), 'salt', 7.54, 99.34, None, 33.91, 91.45, 0.09, 823.88, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:01:23.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:01:23.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:01:23.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:01:03, diff=20.82539s, valid=True
2026-06-03T11:01:23.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:01:23.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:01:23.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:58:12, diff=191.828831s, valid=True
2026-06-03T11:01:23.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:01:23.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:01:23.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:01:01, diff=22.836832s, valid=True
2026-06-03T11:01:23.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:01:23.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:01:23.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:01:23.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:01:23.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:01:23.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:01:23.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:58:12, diff=191.840568s, valid=True
2026-06-03T11:01:23.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:01:23.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:01:23.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:01:23.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51480.841358s, valid=False
2026-06-03T11:01:23.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:01:23.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:01:23.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:01:23.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:01:23.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:01:23.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:01:23.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:01:23.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:01:23.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:01:23.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:01:24.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:01:24.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:01:24.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:01:24.161 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:01:24.366 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:01:24.761 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:01:24.862 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:01:24.862 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:01:24.863 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:01:25.037 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:01:25.037 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:01:55.067 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:01:55.067 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:01:55.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:01:55.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:01:55.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:01:55.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:01:55.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:01:55.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:01:55.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:01:55.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:01:55.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:01:55.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:01:55.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:01:58.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:01:58.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:01:58.097 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:01:58.097 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:01:58.107 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:01:58.120 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:01:58.121 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:01:58.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:01:58.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:01:58.123 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:01:58.123 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:01:58.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:01:58.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:01:58.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:01:58.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:01:58.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:01:58.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:01:58.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:01:58.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:01:58.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:01:58.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:01:58.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:01:58.405 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:01:58.475 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:01:34
2026-06-03T11:01:58.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85853, datetime.datetime(2026, 6, 3, 11, 1, 34), datetime.datetime(2026, 6, 3, 11, 1, 33), 'salt', 7.47, 99.21, None, 37.19, 96.56, 0.11, 824.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:01:58.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:01:58.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:01:58.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:01:33, diff=25.48276s, valid=True
2026-06-03T11:01:58.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:01:58.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:01:58.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:58:12, diff=226.486028s, valid=True
2026-06-03T11:01:58.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:01:58.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:01:58.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:01:32, diff=26.493654s, valid=True
2026-06-03T11:01:58.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:01:58.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:01:58.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:01:58.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:01:58.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:01:58.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:01:58.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:58:12, diff=226.497127s, valid=True
2026-06-03T11:01:58.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:01:58.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:01:58.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:01:58.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51515.497902s, valid=False
2026-06-03T11:01:58.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:01:58.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:01:58.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:01:58.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:01:58.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:01:58.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:01:58.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:01:58.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:01:58.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:01:58.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:01:58.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:01:58.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:01:58.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:01:58.816 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:01:59.021 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:01:59.360 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:01:59.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:01:59.467 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:01:59.467 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:01:59.645 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:01:59.645 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:02:29.676 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:02:29.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:02:29.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:02:29.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:02:29.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:02:30.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:02:30.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:02:30.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:02:30.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:02:30.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:02:30.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:02:30.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:02:30.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:02:32.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:02:32.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:02:32.786 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:02:32.786 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:02:32.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:02:32.809 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:02:32.810 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:02:32.811 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:02:32.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:02:32.811 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:02:32.811 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:02:32.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:02:32.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:02:32.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:02:33.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:02:33.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:02:33.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:02:33.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:02:33.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:02:33.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:02:33.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:02:33.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:02:33.137 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:02:33.205 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:02:04
2026-06-03T11:02:33.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85854, datetime.datetime(2026, 6, 3, 11, 2, 4), datetime.datetime(2026, 6, 3, 11, 2, 3), 'salt', 7.6, 99.34, None, 34.37, 82.6, 0.09, 823.82, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:02:33.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:02:33.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:02:33.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:02:03, diff=30.213207s, valid=True
2026-06-03T11:02:33.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:02:33.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:02:33.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:58:12, diff=261.216743s, valid=True
2026-06-03T11:02:33.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:02:33.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:02:33.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:02:02, diff=31.225049s, valid=True
2026-06-03T11:02:33.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:02:33.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:02:33.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:02:33.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:02:33.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:02:33.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:02:33.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 10:58:12, diff=261.22879s, valid=True
2026-06-03T11:02:33.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:02:33.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:02:33.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:02:33.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51550.229598s, valid=False
2026-06-03T11:02:33.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:02:33.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:02:33.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:02:33.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:02:33.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:02:33.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:02:33.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:02:33.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:02:33.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:02:33.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:02:33.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:02:33.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:02:33.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:02:33.549 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:02:33.824 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:02:34.160 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:02:34.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:02:34.262 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:02:34.262 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:02:34.451 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:02:34.451 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:03:04.482 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:03:04.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:03:04.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:03:04.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:03:04.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:03:04.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:03:04.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:03:04.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:03:04.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:03:05.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:03:05.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:03:05.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:03:05.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:03:07.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:03:07.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:03:07.566 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:03:07.566 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:03:07.577 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:03:07.595 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:03:07.596 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:03:07.596 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:03:07.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:03:07.597 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:03:07.598 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:03:07.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:03:07.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:03:07.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:03:07.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:03:07.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:03:07.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:03:07.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:03:07.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:03:07.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:03:07.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:03:07.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:03:07.945 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:03:08.015 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:03:04
2026-06-03T11:03:08.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85856, datetime.datetime(2026, 6, 3, 11, 3, 4), datetime.datetime(2026, 6, 3, 11, 3, 4), 'salt', 7.57, 99.38, None, 32.64, 83.06, 0.09, 823.88, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:03:08.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:03:08.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:03:08.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:03:04, diff=4.022778s, valid=True
2026-06-03T11:03:08.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:03:08.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:03:08.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:03:12, diff=-3.973739s, valid=True
2026-06-03T11:03:08.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:03:08.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:03:08.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:03:04, diff=4.034456s, valid=True
2026-06-03T11:03:08.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:03:08.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:03:08.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:03:08.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:03:08.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:03:08.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:03:08.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:03:12, diff=-3.961761s, valid=True
2026-06-03T11:03:08.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:03:08.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:03:08.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:03:08.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51585.039063s, valid=False
2026-06-03T11:03:08.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:03:08.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:03:08.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:03:08.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:03:08.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:03:08.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:03:08.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:03:08.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:03:08.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:03:08.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:03:08.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:03:08.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:03:08.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:03:08.360 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:03:08.565 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:03:08.909 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:03:09.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:03:09.012 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:03:09.012 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:03:09.163 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:03:09.163 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:03:39.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:03:39.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:03:39.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:03:39.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:03:39.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:03:39.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:03:39.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:03:39.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:03:39.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:03:39.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:03:39.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:03:39.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:03:39.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:03:42.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:03:42.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:03:42.302 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:03:42.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:03:42.312 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:03:42.325 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:03:42.325 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:03:42.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:03:42.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:03:42.326 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:03:42.326 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:03:42.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:03:42.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:03:42.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:03:42.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:03:42.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:03:42.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:03:42.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:03:42.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:03:42.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:03:42.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:03:42.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:03:42.673 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:03:42.743 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:03:35
2026-06-03T11:03:42.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85857, datetime.datetime(2026, 6, 3, 11, 3, 35), datetime.datetime(2026, 6, 3, 11, 3, 34), 'salt', 7.6, 99.38, None, 39.27, 104.9, 0.08, 823.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:03:42.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:03:42.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:03:42.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:03:34, diff=8.75038s, valid=True
2026-06-03T11:03:42.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:03:42.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:03:42.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:04:12, diff=-29.246251s, valid=True
2026-06-03T11:03:42.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:03:42.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:03:42.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:03:33, diff=9.761629s, valid=True
2026-06-03T11:03:42.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:03:42.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:03:42.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:03:42.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:03:42.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:03:42.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:03:42.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:04:12, diff=-29.234793s, valid=True
2026-06-03T11:03:42.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:03:42.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:03:42.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:03:42.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51619.765991s, valid=False
2026-06-03T11:03:42.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:03:42.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:03:42.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:03:42.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:03:42.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:03:42.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:03:42.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:03:42.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:03:42.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:03:42.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:03:42.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:03:42.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:03:43.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:03:43.157 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:03:43.359 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:03:43.696 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:03:43.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:03:43.797 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:03:43.797 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:03:43.955 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:03:43.955 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:04:13.985 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:04:13.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:04:13.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:04:14.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:04:14.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:04:14.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:04:14.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:04:14.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:04:14.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:04:14.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:04:14.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:04:14.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:04:14.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:04:17.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:04:17.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:04:17.118 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:04:17.118 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:04:17.130 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:04:17.142 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:04:17.143 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:04:17.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:04:17.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:04:17.144 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:04:17.144 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:04:17.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:04:17.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:04:17.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:04:17.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:04:17.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:04:17.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:04:17.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:04:17.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:04:17.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:04:17.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:04:17.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:04:17.486 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:04:17.561 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:04:05
2026-06-03T11:04:17.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85858, datetime.datetime(2026, 6, 3, 11, 4, 5), datetime.datetime(2026, 6, 3, 11, 4, 4), 'salt', 7.57, 99.31, None, 36.38, 101.0, 0.09, 823.94, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:04:17.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:04:17.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:04:17.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:04:04, diff=13.568396s, valid=True
2026-06-03T11:04:17.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:04:17.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:04:17.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:04:12, diff=5.571856s, valid=True
2026-06-03T11:04:17.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:04:17.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:04:17.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:04:03, diff=14.579891s, valid=True
2026-06-03T11:04:17.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:04:17.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:04:17.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:04:17.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:04:17.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:04:17.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:04:17.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:04:12, diff=5.583562s, valid=True
2026-06-03T11:04:17.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:04:17.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:04:17.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:04:17.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51654.584364s, valid=False
2026-06-03T11:04:17.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:04:17.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:04:17.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:04:17.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:04:17.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:04:17.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:04:17.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:04:17.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:04:17.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:04:17.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:04:17.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:04:17.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:04:17.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:04:17.904 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:04:18.106 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:04:18.442 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:04:18.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:04:18.543 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:04:18.543 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:04:18.775 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:04:18.775 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:04:48.805 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:04:48.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:04:48.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:04:48.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:04:48.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:04:49.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:04:49.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:04:49.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:04:49.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:04:49.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:04:49.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:04:49.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:04:49.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:04:51.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:04:51.893 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:04:51.894 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:04:51.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:04:51.904 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:04:51.916 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:04:51.917 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:04:51.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:04:51.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:04:51.918 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:04:51.919 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:04:51.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:04:52.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:04:52.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:04:52.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:04:52.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:04:52.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:04:52.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:04:52.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:04:52.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:04:52.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:04:52.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:04:52.268 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:04:52.355 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:04:35
2026-06-03T11:04:52.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85859, datetime.datetime(2026, 6, 3, 11, 4, 35), datetime.datetime(2026, 6, 3, 11, 4, 34), 'salt', 7.64, 99.41, None, 36.69, 95.86, 0.08, 823.88, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:04:52.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:04:52.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:04:52.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:04:34, diff=18.363029s, valid=True
2026-06-03T11:04:52.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:04:52.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:04:52.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:05:12, diff=-19.63349s, valid=True
2026-06-03T11:04:52.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:04:52.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:04:52.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:04:34, diff=18.374913s, valid=True
2026-06-03T11:04:52.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:04:52.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:04:52.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:04:52.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:04:52.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:04:52.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:04:52.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:05:12, diff=-19.621373s, valid=True
2026-06-03T11:04:52.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:04:52.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:04:52.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:04:52.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51689.379432s, valid=False
2026-06-03T11:04:52.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:04:52.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:04:52.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:04:52.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:04:52.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:04:52.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:04:52.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:04:52.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:04:52.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:04:52.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:04:52.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:04:52.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:04:52.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:04:52.769 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:04:52.974 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:04:53.316 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:04:53.418 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:04:53.418 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:04:53.418 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:04:53.592 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:04:53.592 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:05:23.593 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:05:23.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:05:23.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:05:23.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:05:23.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:05:24.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:05:24.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:05:24.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:05:24.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:05:24.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:05:24.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:05:24.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:05:24.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:05:26.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:05:26.973 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:05:26.974 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:05:26.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:05:26.984 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:05:26.997 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:05:26.998 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:05:26.998 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:05:26.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:05:26.999 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:05:26.999 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:05:27.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:05:27.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:05:27.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:05:27.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:05:27.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:05:27.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:05:27.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:05:27.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:05:27.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:05:27.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:05:27.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:05:27.342 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:05:27.420 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:05:05
2026-06-03T11:05:27.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85860, datetime.datetime(2026, 6, 3, 11, 5, 5), datetime.datetime(2026, 6, 3, 11, 5, 5), 'salt', 7.7, 99.31, None, 36.2, 83.65, 0.09, 824.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:05:27.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:05:27.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:05:27.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:05:05, diff=22.427324s, valid=True
2026-06-03T11:05:27.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:05:27.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:05:27.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:05:12, diff=15.430814s, valid=True
2026-06-03T11:05:27.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:05:27.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:05:27.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:05:04, diff=23.438871s, valid=True
2026-06-03T11:05:27.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:05:27.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:05:27.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:05:27.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:05:27.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:05:27.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:05:27.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:05:12, diff=15.442599s, valid=True
2026-06-03T11:05:27.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:05:27.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:05:27.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:05:27.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51724.443399s, valid=False
2026-06-03T11:05:27.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:05:27.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:05:27.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:05:27.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:05:27.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:05:27.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:05:27.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:05:27.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:05:27.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:05:27.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:05:27.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:05:27.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:05:27.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:05:27.763 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:05:27.968 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:05:28.306 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:05:28.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:05:28.408 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:05:28.408 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:05:28.480 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:05:28.480 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:05:58.486 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:05:58.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:05:58.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:05:59.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:05:59.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:05:59.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:05:59.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:05:59.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:05:59.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:05:59.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:05:59.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:05:59.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:05:59.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:06:02.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:06:02.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:06:02.308 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:06:02.308 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:06:02.318 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:06:02.330 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:06:02.331 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:06:02.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:06:02.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:06:02.332 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:06:02.332 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:06:02.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:06:02.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:06:02.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:06:02.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:06:02.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:06:02.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:06:02.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:06:02.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:06:02.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:06:02.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:06:02.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:06:02.755 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:06:02.839 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:05:36
2026-06-03T11:06:02.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85861, datetime.datetime(2026, 6, 3, 11, 5, 36), datetime.datetime(2026, 6, 3, 11, 5, 35), 'salt', 7.7, 99.34, None, 31.86, 99.24, 0.09, 823.82, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:06:02.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:06:02.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:06:02.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:05:35, diff=27.845702s, valid=True
2026-06-03T11:06:02.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:06:02.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:06:02.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:06:12, diff=-9.151449s, valid=True
2026-06-03T11:06:02.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:06:02.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:06:02.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:05:34, diff=28.855188s, valid=True
2026-06-03T11:06:02.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:06:02.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:06:02.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:06:02.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:06:02.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:06:02.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:06:02.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:06:12, diff=-9.141776s, valid=True
2026-06-03T11:06:02.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:06:02.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:06:02.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:06:02.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51759.858874s, valid=False
2026-06-03T11:06:02.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:06:02.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:06:02.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:06:02.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:06:02.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:06:02.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:06:02.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:06:02.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:06:02.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:06:02.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:06:03.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:06:03.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:06:03.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:06:03.171 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:06:03.377 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:06:03.717 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:06:03.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:06:03.819 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:06:03.819 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:06:05.762 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:06:05.763 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:06:35.775 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:06:35.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:06:35.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:06:36.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:06:36.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:06:36.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:06:36.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:06:36.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:06:36.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:06:36.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:06:36.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:06:36.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:06:36.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:06:38.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:06:38.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:06:38.824 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:06:38.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:06:38.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:06:38.848 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:06:38.849 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:06:38.849 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:06:38.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:06:38.850 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:06:38.850 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:06:38.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:06:39.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:06:39.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:06:39.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:06:39.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:06:39.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:06:39.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:06:39.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:06:39.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:06:39.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:06:39.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:06:39.242 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:06:39.326 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:06:36
2026-06-03T11:06:39.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85863, datetime.datetime(2026, 6, 3, 11, 6, 36), datetime.datetime(2026, 6, 3, 11, 6, 35), 'salt', 7.77, 99.34, None, 35.11, 97.69, 0.09, 823.82, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:06:39.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:06:39.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:06:39.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:06:35, diff=4.333852s, valid=True
2026-06-03T11:06:39.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:06:39.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:06:39.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:07:12, diff=-32.662542s, valid=True
2026-06-03T11:06:39.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:06:39.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:06:39.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:06:34, diff=5.345919s, valid=True
2026-06-03T11:06:39.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:06:39.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:06:39.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:06:39.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:06:39.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:06:39.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:06:39.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:07:12, diff=-32.65018s, valid=True
2026-06-03T11:06:39.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:06:39.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:06:39.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:06:39.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51796.350692s, valid=False
2026-06-03T11:06:39.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:06:39.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:06:39.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:06:39.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:06:39.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:06:39.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:06:39.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:06:39.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:06:39.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:06:39.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:06:39.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:06:39.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:06:39.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:06:39.673 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:06:39.883 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:06:40.240 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:06:40.343 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:06:40.343 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:06:40.343 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:06:40.809 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:06:40.810 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:07:10.840 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:07:10.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:07:10.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:07:10.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:07:10.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:07:11.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:07:11.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:07:11.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:07:11.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:07:11.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:07:11.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:07:11.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:07:11.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:07:13.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:07:13.962 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:07:13.963 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:07:13.963 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:07:13.972 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:07:13.983 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:07:13.984 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:07:13.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:07:13.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:07:13.984 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:07:13.984 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:07:13.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:07:14.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:07:14.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:07:14.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:07:14.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:07:14.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:07:14.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:07:14.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:07:14.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:07:14.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:07:14.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:07:14.265 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:07:14.342 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:07:06
2026-06-03T11:07:14.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85864, datetime.datetime(2026, 6, 3, 11, 7, 6), datetime.datetime(2026, 6, 3, 11, 7, 6), 'salt', 7.77, 99.31, None, 35.21, 93.51, 0.1, 823.88, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:07:14.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:07:14.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:07:14.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:07:06, diff=8.349467s, valid=True
2026-06-03T11:07:14.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:07:14.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:07:14.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:07:12, diff=2.352708s, valid=True
2026-06-03T11:07:14.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:07:14.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:07:14.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:07:05, diff=9.360411s, valid=True
2026-06-03T11:07:14.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:07:14.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:07:14.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:07:14.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:07:14.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:07:14.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:07:14.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:07:12, diff=2.363892s, valid=True
2026-06-03T11:07:14.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:07:14.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:07:14.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:07:14.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51831.364653s, valid=False
2026-06-03T11:07:14.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:07:14.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:07:14.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:07:14.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:07:14.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:07:14.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:07:14.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:07:14.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:07:14.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:07:14.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:07:14.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:07:14.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:07:14.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:07:14.681 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:07:14.887 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:07:15.226 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:07:15.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:07:15.328 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:07:15.328 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:07:15.400 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:07:15.400 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:07:45.430 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:07:45.430 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:07:45.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:07:45.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:07:45.587 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:07:45.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:07:45.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:07:45.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:07:45.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:07:45.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:07:45.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:07:45.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:07:45.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:07:48.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:07:48.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:07:48.392 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:07:48.392 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:07:48.402 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:07:48.415 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:07:48.415 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:07:48.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:07:48.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:07:48.417 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:07:48.417 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:07:48.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:07:48.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:07:48.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:07:48.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:07:48.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:07:48.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:07:48.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:07:48.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:07:48.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:07:48.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:07:48.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:07:48.763 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:07:48.841 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:07:37
2026-06-03T11:07:48.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85865, datetime.datetime(2026, 6, 3, 11, 7, 37), datetime.datetime(2026, 6, 3, 11, 7, 36), 'salt', 7.8, 99.28, None, 37.01, 93.72, 0.1, 823.82, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:07:48.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:07:48.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:07:48.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:07:36, diff=12.848991s, valid=True
2026-06-03T11:07:48.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:07:48.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:07:48.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:08:12, diff=-23.14753s, valid=True
2026-06-03T11:07:48.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:07:48.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:07:48.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:07:36, diff=12.860723s, valid=True
2026-06-03T11:07:48.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:07:48.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:07:48.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:07:48.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:07:48.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:07:48.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:07:48.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:08:12, diff=-23.135545s, valid=True
2026-06-03T11:07:48.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:07:48.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:07:48.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:07:48.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51865.865282s, valid=False
2026-06-03T11:07:48.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:07:48.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:07:48.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:07:48.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:07:48.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:07:48.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:07:48.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:07:48.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:07:48.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:07:49.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:07:49.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:07:49.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:07:49.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:07:49.186 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:07:49.392 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:07:49.787 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:07:49.892 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:07:49.893 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:07:49.893 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:07:50.094 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:07:50.095 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:08:20.124 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:08:20.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:08:20.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:08:20.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:08:20.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:08:20.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:08:20.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:08:20.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:08:20.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:08:20.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:08:20.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:08:20.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:08:20.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:08:22.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:08:22.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:08:22.977 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:08:22.977 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:08:22.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:08:23.000 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:08:23.001 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:08:23.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:08:23.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:08:23.002 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:08:23.002 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:08:23.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:08:23.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:08:23.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:08:23.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:08:23.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:08:23.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:08:23.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:08:23.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:08:23.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:08:23.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:08:23.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:08:23.398 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:08:23.482 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:08:07
2026-06-03T11:08:23.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85866, datetime.datetime(2026, 6, 3, 11, 8, 7), datetime.datetime(2026, 6, 3, 11, 8, 6), 'salt', 7.83, 99.34, None, 35.18, 95.44, 0.08, 823.94, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:08:23.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:08:23.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:08:23.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:08:06, diff=17.489978s, valid=True
2026-06-03T11:08:23.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:08:23.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:08:23.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:08:12, diff=11.493566s, valid=True
2026-06-03T11:08:23.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:08:23.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:08:23.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:08:05, diff=18.502071s, valid=True
2026-06-03T11:08:23.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:08:23.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:08:23.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:08:23.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:08:23.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:08:23.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:08:23.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:08:12, diff=11.505909s, valid=True
2026-06-03T11:08:23.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:08:23.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:08:23.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:08:23.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51900.506743s, valid=False
2026-06-03T11:08:23.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:08:23.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:08:23.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:08:23.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:08:23.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:08:23.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:08:23.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:08:23.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:08:23.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:08:23.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:08:23.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:08:23.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:08:23.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:08:23.829 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:08:24.034 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:08:24.374 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:08:24.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:08:24.475 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:08:24.476 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:08:24.550 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:08:24.550 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:08:54.580 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:08:54.580 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:08:54.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:08:54.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:08:54.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:08:54.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:08:54.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:08:54.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:08:54.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:08:55.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:08:55.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:08:55.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:08:55.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:08:57.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:08:57.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:08:57.709 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:08:57.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:08:57.719 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:08:57.731 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:08:57.732 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:08:57.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:08:57.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:08:57.733 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:08:57.733 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:08:57.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:08:57.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:08:57.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:08:57.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:08:57.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:08:58.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:08:58.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:08:58.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:08:58.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:08:58.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:08:58.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:08:58.092 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:08:58.166 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:08:37
2026-06-03T11:08:58.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85867, datetime.datetime(2026, 6, 3, 11, 8, 37), datetime.datetime(2026, 6, 3, 11, 8, 36), 'salt', 7.77, 99.31, None, 35.5, 109.36, 0.1, 823.76, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:08:58.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:08:58.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:08:58.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:08:36, diff=22.17252s, valid=True
2026-06-03T11:08:58.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:08:58.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:08:58.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:09:12, diff=-13.82463s, valid=True
2026-06-03T11:08:58.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:08:58.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:08:58.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:08:36, diff=22.182087s, valid=True
2026-06-03T11:08:58.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:08:58.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:08:58.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:08:58.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:08:58.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:08:58.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:08:58.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:09:12, diff=-13.814869s, valid=True
2026-06-03T11:08:58.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:08:58.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:08:58.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:08:58.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51935.185808s, valid=False
2026-06-03T11:08:58.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:08:58.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:08:58.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:08:58.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:08:58.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:08:58.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:08:58.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:08:58.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:08:58.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:08:58.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:08:58.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:08:58.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:08:58.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:08:58.499 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:08:58.793 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:08:59.131 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:08:59.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:08:59.233 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:08:59.233 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:08:59.363 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:08:59.363 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:09:29.378 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:09:29.378 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:09:29.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:09:29.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:09:29.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:09:29.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:09:29.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:09:29.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:09:29.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:09:29.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:09:29.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:09:29.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:09:29.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:09:32.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:09:32.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:09:32.179 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:09:32.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:09:32.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:09:32.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:09:32.202 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:09:32.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:09:32.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:09:32.203 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:09:32.203 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:09:32.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:09:32.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:09:32.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:09:32.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:09:32.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:09:32.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:09:32.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:09:32.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:09:32.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:09:32.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:09:32.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:09:32.543 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:09:32.611 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:09:07
2026-06-03T11:09:32.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85868, datetime.datetime(2026, 6, 3, 11, 9, 7), datetime.datetime(2026, 6, 3, 11, 9, 7), 'salt', 7.77, 99.28, None, 32.57, 102.43, 0.1, 824.0, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:09:32.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:09:32.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:09:32.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:09:07, diff=25.617884s, valid=True
2026-06-03T11:09:32.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:09:32.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:09:32.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:09:12, diff=20.620757s, valid=True
2026-06-03T11:09:32.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:09:32.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:09:32.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:09:06, diff=26.62743s, valid=True
2026-06-03T11:09:32.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:09:32.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:09:32.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:09:32.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:09:32.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:09:32.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:09:32.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:09:12, diff=20.630489s, valid=True
2026-06-03T11:09:32.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:09:32.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:09:32.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:09:32.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=51969.631154s, valid=False
2026-06-03T11:09:32.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:09:32.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:09:32.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:09:32.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:09:32.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:09:32.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:09:32.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:09:32.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:09:32.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:09:32.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:09:32.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:09:32.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:09:32.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:09:32.944 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:09:33.149 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:09:33.491 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:09:33.592 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:09:33.592 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:09:33.592 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:09:33.788 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:09:33.788 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:10:03.812 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:10:03.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:10:03.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:10:03.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:10:03.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:10:04.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:10:04.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:10:04.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:10:04.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:10:04.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:10:04.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:10:04.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:10:04.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:10:06.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:10:06.757 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:10:06.758 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:10:06.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:10:06.771 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:10:06.784 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:10:06.784 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:10:06.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:10:06.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:10:06.786 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:10:06.786 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:10:06.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:10:06.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:10:06.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:10:07.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:10:07.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:10:07.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:10:07.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:10:07.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:10:07.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:10:07.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:10:07.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:10:07.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:10:07.185 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:09:38
2026-06-03T11:10:07.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85869, datetime.datetime(2026, 6, 3, 11, 9, 38), datetime.datetime(2026, 6, 3, 11, 9, 37), 'salt', 7.93, 99.34, None, 32.85, 102.08, 0.09, 823.94, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:10:07.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:10:07.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:10:07.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:09:37, diff=30.192445s, valid=True
2026-06-03T11:10:07.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:10:07.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:10:07.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:10:12, diff=-4.804099s, valid=True
2026-06-03T11:10:07.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:10:07.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:10:07.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:09:36, diff=31.203951s, valid=True
2026-06-03T11:10:07.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:10:07.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:10:07.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:10:07.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:10:07.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:10:07.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:10:07.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:10:12, diff=-4.792395s, valid=True
2026-06-03T11:10:07.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:10:07.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:10:07.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:10:07.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52004.208384s, valid=False
2026-06-03T11:10:07.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:10:07.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:10:07.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:10:07.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:10:07.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:10:07.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:10:07.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:10:07.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:10:07.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:10:07.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:10:07.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:10:07.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:10:07.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:10:07.599 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:10:07.808 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:10:08.154 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:10:08.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:10:08.257 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:10:08.257 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:10:08.431 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:10:08.431 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:10:38.434 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:10:38.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:10:38.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:10:38.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:10:38.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:10:38.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:10:38.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:10:38.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:10:38.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:10:38.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:10:38.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:10:38.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:10:38.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:10:41.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:10:41.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:10:41.223 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:10:41.223 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:10:41.234 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:10:41.247 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:10:41.248 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:10:41.249 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:10:41.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:10:41.250 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:10:41.250 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:10:41.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:10:41.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:10:41.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:10:41.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:10:41.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:10:41.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:10:41.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:10:41.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:10:41.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:10:41.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:10:41.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:10:41.590 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:10:41.659 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:10:38
2026-06-03T11:10:41.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85871, datetime.datetime(2026, 6, 3, 11, 10, 38), datetime.datetime(2026, 6, 3, 11, 10, 37), 'salt', 7.74, 99.34, None, 39.76, 110.7, 0.09, 823.82, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:10:41.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:10:41.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:10:41.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:10:37, diff=4.666788s, valid=True
2026-06-03T11:10:41.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:10:41.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:10:41.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:11:12, diff=-30.329746s, valid=True
2026-06-03T11:10:41.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:10:41.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:10:41.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:10:36, diff=5.678305s, valid=True
2026-06-03T11:10:41.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:10:41.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:10:41.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:10:41.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:10:41.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:10:41.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:10:41.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:11:12, diff=-30.318058s, valid=True
2026-06-03T11:10:41.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:10:41.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:10:41.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:10:41.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52038.682754s, valid=False
2026-06-03T11:10:41.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:10:41.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:10:41.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:10:41.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:10:41.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:10:41.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:10:41.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:10:41.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:10:41.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:10:41.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:10:41.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:10:41.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:10:41.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:10:42.004 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:10:42.215 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:10:42.556 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:10:42.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:10:42.659 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:10:42.659 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:10:42.731 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:10:42.731 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:11:12.736 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:11:12.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:11:12.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:11:12.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:11:12.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:11:13.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:11:13.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:11:13.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:11:13.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:11:13.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:11:13.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:11:13.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:11:13.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:11:15.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:11:15.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:11:15.528 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:11:15.528 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:11:15.538 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:11:15.551 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:11:15.551 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:11:15.552 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:11:15.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:11:15.552 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:11:15.553 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:11:15.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:11:15.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:11:15.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:11:15.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:11:15.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:11:15.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:11:15.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:11:15.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:11:15.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:11:15.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:11:15.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:11:15.883 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:11:15.954 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:11:08
2026-06-03T11:11:15.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85872, datetime.datetime(2026, 6, 3, 11, 11, 8), datetime.datetime(2026, 6, 3, 11, 11, 8), 'salt', 7.6, 99.28, None, 34.05, 102.48, 0.1, 824.0, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:11:15.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:11:15.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:11:15.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:11:08, diff=7.961325s, valid=True
2026-06-03T11:11:15.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:11:15.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:11:15.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:11:12, diff=3.964827s, valid=True
2026-06-03T11:11:15.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:11:15.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:11:15.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:11:07, diff=8.972678s, valid=True
2026-06-03T11:11:15.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:11:15.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:11:15.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:11:15.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:11:15.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:11:15.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:11:15.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:11:12, diff=3.976046s, valid=True
2026-06-03T11:11:15.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:11:15.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:11:15.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:11:15.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52072.976785s, valid=False
2026-06-03T11:11:15.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:11:15.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:11:15.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:11:15.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:11:15.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:11:16.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:11:16.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:11:16.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:11:16.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:11:16.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:11:16.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:11:16.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:11:16.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:11:16.368 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:11:16.575 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:11:16.917 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:11:17.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:11:17.021 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:11:17.021 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:11:17.092 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:11:17.092 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:11:47.123 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:11:47.123 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:11:47.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:11:47.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:11:47.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:11:47.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:11:47.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:11:47.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:11:47.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:11:47.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:11:47.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:11:47.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:11:47.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:11:50.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:11:50.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:11:50.158 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:11:50.158 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:11:50.167 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:11:50.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:11:50.180 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:11:50.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:11:50.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:11:50.181 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:11:50.181 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:11:50.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:11:50.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:11:50.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:11:50.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:11:50.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:11:50.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:11:50.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:11:50.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:11:50.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:11:50.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:11:50.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:11:50.509 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:11:50.578 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:11:39
2026-06-03T11:11:50.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85873, datetime.datetime(2026, 6, 3, 11, 11, 39), datetime.datetime(2026, 6, 3, 11, 11, 38), 'salt', 7.6, 99.24, None, 36.69, 109.05, 0.1, 823.88, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:11:50.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:11:50.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:11:50.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:11:38, diff=12.585832s, valid=True
2026-06-03T11:11:50.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:11:50.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:11:50.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:12:12, diff=-21.410724s, valid=True
2026-06-03T11:11:50.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:11:50.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:11:50.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:11:37, diff=13.597461s, valid=True
2026-06-03T11:11:50.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:11:50.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:11:50.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:11:50.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:11:50.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:11:50.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:11:50.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:12:12, diff=-21.398852s, valid=True
2026-06-03T11:11:50.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:11:50.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:11:50.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:11:50.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52107.60195s, valid=False
2026-06-03T11:11:50.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:11:50.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:11:50.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:11:50.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:11:50.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:11:50.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:11:50.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:11:50.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:11:50.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:11:50.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:11:50.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:11:50.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:11:50.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:11:50.922 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:11:51.129 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:11:51.472 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:11:51.574 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:11:51.575 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:11:51.575 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:11:51.731 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:11:51.731 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:12:21.751 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:12:21.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:12:21.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:12:22.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:12:22.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:12:22.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:12:22.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:12:22.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:12:22.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:12:22.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:12:22.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:12:22.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:12:22.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:12:24.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:12:24.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:12:24.639 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:12:24.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:12:24.649 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:12:24.662 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:12:24.663 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:12:24.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:12:24.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:12:24.664 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:12:24.664 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:12:24.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:12:24.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:12:24.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:12:24.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:12:24.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:12:24.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:12:24.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:12:25.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:12:25.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:12:25.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:12:25.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:12:25.045 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:12:25.118 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:12:09
2026-06-03T11:12:25.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85874, datetime.datetime(2026, 6, 3, 11, 12, 9), datetime.datetime(2026, 6, 3, 11, 12, 8), 'salt', 7.6, 99.31, None, 32.21, 93.58, 0.09, 824.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:12:25.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:12:25.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:12:25.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:12:08, diff=17.126659s, valid=True
2026-06-03T11:12:25.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:12:25.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:12:25.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:12:12, diff=13.129889s, valid=True
2026-06-03T11:12:25.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:12:25.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:12:25.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:12:09, diff=16.137564s, valid=True
2026-06-03T11:12:25.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:12:25.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:12:25.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:12:25.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:12:25.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:12:25.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:12:25.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:12:12, diff=13.141048s, valid=True
2026-06-03T11:12:25.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:12:25.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:12:25.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:12:25.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52142.141816s, valid=False
2026-06-03T11:12:25.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:12:25.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:12:25.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:12:25.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:12:25.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:12:25.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:12:25.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:12:25.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:12:25.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:12:25.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:12:25.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:12:25.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:12:25.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:12:25.531 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:12:25.736 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:12:26.075 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:12:26.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:12:26.177 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:12:26.177 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:12:26.250 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:12:26.250 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:12:56.261 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:12:56.261 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:12:56.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:12:56.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:12:56.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:12:56.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:12:56.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:12:57.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:12:57.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:12:57.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:12:57.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:12:57.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:12:57.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:12:59.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:12:59.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:12:59.502 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:12:59.502 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:12:59.512 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:12:59.524 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:12:59.524 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:12:59.525 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:12:59.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:12:59.525 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:12:59.525 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:12:59.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:12:59.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:12:59.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:12:59.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:12:59.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:12:59.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:12:59.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:12:59.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:12:59.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:12:59.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:12:59.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:12:59.868 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:12:59.941 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:12:39
2026-06-03T11:12:59.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85875, datetime.datetime(2026, 6, 3, 11, 12, 39), datetime.datetime(2026, 6, 3, 11, 12, 38), 'salt', 7.6, 99.31, None, 36.77, 101.54, 0.09, 823.94, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:12:59.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:12:59.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:12:59.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:12:38, diff=21.947146s, valid=True
2026-06-03T11:12:59.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:12:59.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:12:59.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:13:12, diff=-12.049813s, valid=True
2026-06-03T11:12:59.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:12:59.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:12:59.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:12:37, diff=22.957042s, valid=True
2026-06-03T11:12:59.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:12:59.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:12:59.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:12:59.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:12:59.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:12:59.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:12:59.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:13:12, diff=-12.039892s, valid=True
2026-06-03T11:12:59.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:12:59.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:12:59.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:12:59.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52176.960773s, valid=False
2026-06-03T11:12:59.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:12:59.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:12:59.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:12:59.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:12:59.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:13:00.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:13:00.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:13:00.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:13:00.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:13:00.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:13:00.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:13:00.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:13:00.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:13:00.282 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:13:00.507 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:13:00.844 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:13:00.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:13:00.946 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:13:00.946 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:13:01.181 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:13:01.182 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:13:31.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:13:31.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:13:31.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:13:31.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:13:31.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:13:31.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:13:31.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:13:31.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:13:31.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:13:31.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:13:31.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:13:31.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:13:31.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:13:33.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:13:33.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:13:33.985 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:13:33.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:13:33.996 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:13:34.008 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:13:34.009 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:13:34.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:13:34.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:13:34.010 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:13:34.010 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:13:34.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:13:34.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:13:34.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:13:34.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:13:34.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:13:34.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:13:34.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:13:34.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:13:34.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:13:34.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:13:34.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:13:34.367 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:13:34.453 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:13:09
2026-06-03T11:13:34.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85876, datetime.datetime(2026, 6, 3, 11, 13, 9), datetime.datetime(2026, 6, 3, 11, 13, 9), 'salt', 7.54, 99.38, None, 38.32, 107.88, 0.09, 824.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:13:34.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:13:34.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:13:34.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:13:09, diff=25.460526s, valid=True
2026-06-03T11:13:34.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:13:34.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:13:34.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:13:12, diff=22.464014s, valid=True
2026-06-03T11:13:34.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:13:34.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:13:34.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:13:07, diff=27.472143s, valid=True
2026-06-03T11:13:34.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:13:34.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:13:34.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:13:34.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:13:34.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:13:34.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:13:34.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:13:12, diff=22.475818s, valid=True
2026-06-03T11:13:34.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:13:34.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:13:34.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:13:34.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52211.476601s, valid=False
2026-06-03T11:13:34.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:13:34.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:13:34.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:13:34.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:13:34.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:13:34.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:13:34.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:13:34.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:13:34.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:13:34.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:13:34.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:13:34.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:13:34.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:13:34.795 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:13:35.000 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:13:35.340 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:13:35.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:13:35.443 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:13:35.443 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:13:35.595 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:13:35.595 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:14:05.597 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:14:05.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:14:05.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:14:05.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:14:05.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:14:05.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:14:05.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:14:06.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:14:06.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:14:06.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:14:06.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:14:06.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:14:06.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:14:08.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:14:08.473 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:14:08.474 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:14:08.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:14:08.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:14:08.498 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:14:08.498 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:14:08.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:14:08.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:14:08.499 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:14:08.500 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:14:08.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:14:08.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:14:08.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:14:08.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:14:08.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:14:08.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:14:08.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:14:08.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:14:08.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:14:08.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:14:08.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:14:08.829 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:14:08.899 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:13:40
2026-06-03T11:14:08.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85877, datetime.datetime(2026, 6, 3, 11, 13, 40), datetime.datetime(2026, 6, 3, 11, 13, 39), 'salt', 7.47, 99.31, None, 35.42, 99.36, 0.09, 823.88, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:14:08.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:14:08.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:14:08.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:13:39, diff=29.906828s, valid=True
2026-06-03T11:14:08.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:14:08.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:14:08.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:14:12, diff=-3.089818s, valid=True
2026-06-03T11:14:08.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:14:08.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:14:08.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:13:38, diff=30.918113s, valid=True
2026-06-03T11:14:08.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:14:08.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:14:08.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:14:08.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:14:08.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:14:08.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:14:08.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:14:12, diff=-3.078214s, valid=True
2026-06-03T11:14:08.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:14:08.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:14:08.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:14:08.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52245.922574s, valid=False
2026-06-03T11:14:08.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:14:08.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:14:08.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:14:08.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:14:08.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:14:08.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:14:08.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:14:08.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:14:09.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:14:09.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:14:09.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:14:09.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:14:09.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:14:09.242 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:14:09.447 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:14:09.900 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:14:10.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:14:10.020 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:14:10.021 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:14:10.089 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:14:10.089 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:14:40.119 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:14:40.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:14:40.120 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:14:40.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:14:40.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:14:40.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:14:40.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:14:40.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:14:40.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:14:40.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:14:40.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:14:40.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:14:40.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:14:42.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:14:42.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:14:42.947 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:14:42.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:14:42.958 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:14:42.971 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:14:42.971 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:14:42.972 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:14:42.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:14:42.972 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:14:42.973 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:14:42.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:14:43.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:14:43.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:14:43.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:14:43.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:14:43.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:14:43.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:14:43.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:14:43.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:14:43.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:14:43.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:14:43.305 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:14:43.375 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:14:40
2026-06-03T11:14:43.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85879, datetime.datetime(2026, 6, 3, 11, 14, 40), datetime.datetime(2026, 6, 3, 11, 14, 40), 'salt', 7.34, 99.28, None, 39.62, 103.56, 0.1, 823.88, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:14:43.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:14:43.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:14:43.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:14:40, diff=3.383034s, valid=True
2026-06-03T11:14:43.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:14:43.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:14:43.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:15:12, diff=-28.613466s, valid=True
2026-06-03T11:14:43.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:14:43.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:14:43.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:14:38, diff=5.394744s, valid=True
2026-06-03T11:14:43.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:14:43.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:14:43.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:14:43.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:14:43.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:14:43.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:14:43.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:15:12, diff=-28.601558s, valid=True
2026-06-03T11:14:43.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:14:43.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:14:43.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:14:43.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52280.399258s, valid=False
2026-06-03T11:14:43.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:14:43.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:14:43.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:14:43.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:14:43.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:14:43.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:14:43.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:14:43.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:14:43.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:14:43.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:14:43.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:14:43.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:14:43.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:14:43.718 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:14:43.923 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:14:44.260 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:14:44.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:14:44.362 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:14:44.362 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:14:44.623 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:14:44.623 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:15:14.654 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:15:14.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:15:14.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:15:14.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:15:14.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:15:15.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:15:15.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:15:15.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:15:15.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:15:15.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:15:15.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:15:15.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:15:15.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:15:17.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:15:17.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:15:17.523 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:15:17.523 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:15:17.533 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:15:17.546 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:15:17.547 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:15:17.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:15:17.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:15:17.548 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:15:17.548 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:15:17.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:15:17.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:15:17.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:15:17.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:15:17.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:15:17.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:15:17.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:15:17.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:15:17.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:15:17.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:15:17.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:15:17.891 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:15:17.962 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:15:11
2026-06-03T11:15:17.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85880, datetime.datetime(2026, 6, 3, 11, 15, 11), datetime.datetime(2026, 6, 3, 11, 15, 10), 'salt', 7.4, 99.31, None, 33.38, 110.01, 0.09, 823.82, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:15:17.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:15:17.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:15:17.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:15:10, diff=7.969508s, valid=True
2026-06-03T11:15:17.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:15:17.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:15:17.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:15:12, diff=5.973024s, valid=True
2026-06-03T11:15:17.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:15:17.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:15:17.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:15:08, diff=9.98131s, valid=True
2026-06-03T11:15:17.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:15:17.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:15:17.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:15:17.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:15:17.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:15:17.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:15:17.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:15:12, diff=5.985031s, valid=True
2026-06-03T11:15:17.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:15:17.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:15:17.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:15:17.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52314.985845s, valid=False
2026-06-03T11:15:17.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:15:17.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:15:17.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:15:17.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:15:17.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:15:18.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:15:18.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:15:18.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:15:18.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:15:18.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:15:18.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:15:18.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:15:18.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:15:18.384 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:15:18.589 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:15:18.928 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:15:19.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:15:19.031 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:15:19.031 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:15:19.266 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:15:19.266 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:15:49.278 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:15:49.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:15:49.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:15:49.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:15:49.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:15:49.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:15:49.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:15:49.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:15:49.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:15:49.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:15:49.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:15:49.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:15:49.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:15:52.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:15:52.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:15:52.155 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:15:52.155 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:15:52.164 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:15:52.181 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:15:52.182 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:15:52.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:15:52.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:15:52.183 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:15:52.183 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:15:52.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:15:52.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:15:52.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:15:52.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:15:52.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:15:52.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:15:52.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:15:52.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:15:52.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:15:52.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:15:52.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:15:52.518 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:15:52.589 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:15:41
2026-06-03T11:15:52.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85881, datetime.datetime(2026, 6, 3, 11, 15, 41), datetime.datetime(2026, 6, 3, 11, 15, 40), 'salt', 7.4, 99.31, None, 36.17, 104.05, 0.09, 824.0, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:15:52.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:15:52.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:15:52.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:15:40, diff=12.596783s, valid=True
2026-06-03T11:15:52.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:15:52.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:15:52.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:16:12, diff=-19.399603s, valid=True
2026-06-03T11:15:52.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:15:52.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:15:52.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:15:39, diff=13.608848s, valid=True
2026-06-03T11:15:52.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:15:52.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:15:52.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:15:52.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:15:52.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:15:52.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:15:52.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:16:12, diff=-19.387302s, valid=True
2026-06-03T11:15:52.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:15:52.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:15:52.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:15:52.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52349.613497s, valid=False
2026-06-03T11:15:52.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:15:52.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:15:52.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:15:52.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:15:52.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:15:52.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:15:52.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:15:52.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:15:52.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:15:52.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:15:52.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:15:52.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:15:52.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:15:52.940 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:15:53.145 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:15:53.483 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:15:53.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:15:53.585 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:15:53.585 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:15:53.765 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:15:53.765 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:16:23.780 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:16:23.780 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:16:23.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:16:24.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:16:24.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:16:24.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:16:24.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:16:24.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:16:24.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:16:24.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:16:24.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:16:24.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:16:24.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:16:27.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:16:27.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:16:27.158 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:16:27.158 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:16:27.168 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:16:27.181 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:16:27.181 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:16:27.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:16:27.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:16:27.183 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:16:27.183 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:16:27.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:16:27.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:16:27.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:16:27.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:16:27.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:16:27.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:16:27.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:16:27.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:16:27.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:16:27.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:16:27.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:16:27.529 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:16:27.599 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:16:11
2026-06-03T11:16:27.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85882, datetime.datetime(2026, 6, 3, 11, 16, 11), datetime.datetime(2026, 6, 3, 11, 16, 10), 'salt', 7.5, 99.28, None, 39.09, 97.92, 0.1, 824.0, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:16:27.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:16:27.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:16:27.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:16:10, diff=17.607229s, valid=True
2026-06-03T11:16:27.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:16:27.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:16:27.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:16:12, diff=15.610702s, valid=True
2026-06-03T11:16:27.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:16:27.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:16:27.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:16:10, diff=17.61892s, valid=True
2026-06-03T11:16:27.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:16:27.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:16:27.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:16:27.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:16:27.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:16:27.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:16:27.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:16:12, diff=15.622659s, valid=True
2026-06-03T11:16:27.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:16:27.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:16:27.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:16:27.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52384.623463s, valid=False
2026-06-03T11:16:27.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:16:27.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:16:27.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:16:27.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:16:27.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:16:27.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:16:27.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:16:27.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:16:27.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:16:27.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:16:27.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:16:27.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:16:27.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:16:28.011 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:16:28.217 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:16:28.557 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:16:28.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:16:28.658 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:16:28.658 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:16:28.828 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:16:28.828 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:16:58.837 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:16:58.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:16:58.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:16:58.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:16:58.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:16:59.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:16:59.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:16:59.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:16:59.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:16:59.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:16:59.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:16:59.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:16:59.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:17:01.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:17:01.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:17:01.549 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:17:01.550 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:17:01.559 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:17:01.572 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:17:01.572 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:17:01.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:17:01.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:17:01.573 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:17:01.574 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:17:01.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:17:01.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:17:01.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:17:01.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:17:01.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:17:01.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:17:01.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:17:01.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:17:01.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:17:01.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:17:01.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:17:01.929 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:17:02.022 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:16:41
2026-06-03T11:17:02.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85883, datetime.datetime(2026, 6, 3, 11, 16, 41), datetime.datetime(2026, 6, 3, 11, 16, 41), 'salt', 7.3, 99.28, None, 41.32, 104.71, 0.1, 823.82, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:17:02.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:17:02.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:17:02.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:16:41, diff=21.029886s, valid=True
2026-06-03T11:17:02.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:17:02.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:17:02.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:17:12, diff=-9.966631s, valid=True
2026-06-03T11:17:02.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:17:02.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:17:02.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:16:39, diff=23.041497s, valid=True
2026-06-03T11:17:02.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:17:02.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:17:02.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:17:02.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:17:02.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:17:02.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:17:02.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:17:12, diff=-9.954702s, valid=True
2026-06-03T11:17:02.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:17:02.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:17:02.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:17:02.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52419.046127s, valid=False
2026-06-03T11:17:02.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:17:02.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:17:02.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:17:02.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:17:02.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:17:02.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:17:02.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:17:02.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:17:02.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:17:02.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:17:02.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:17:02.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:17:02.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:17:02.369 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:17:02.574 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:17:02.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:17:03.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:17:03.014 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:17:03.015 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:17:03.269 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:17:03.269 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:17:33.272 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:17:33.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:17:33.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:17:33.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:17:33.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:17:33.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:17:33.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:17:33.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:17:33.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:17:33.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:17:33.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:17:33.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:17:33.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:17:36.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:17:36.203 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:17:36.203 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:17:36.203 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:17:36.215 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:17:36.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:17:36.231 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:17:36.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:17:36.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:17:36.231 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:17:36.231 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:17:36.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:17:36.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:17:36.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:17:36.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:17:36.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:17:36.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:17:36.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:17:36.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:17:36.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:17:36.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:17:36.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:17:36.519 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:17:36.590 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:17:12
2026-06-03T11:17:36.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85884, datetime.datetime(2026, 6, 3, 11, 17, 12), datetime.datetime(2026, 6, 3, 11, 17, 11), 'salt', 7.3, 99.34, None, 33.8, 96.14, 0.09, 823.82, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:17:36.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:17:36.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:17:36.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:17:11, diff=25.598304s, valid=True
2026-06-03T11:17:36.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:17:36.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:17:36.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:17:12, diff=24.601613s, valid=True
2026-06-03T11:17:36.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:17:36.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:17:36.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:17:09, diff=27.609397s, valid=True
2026-06-03T11:17:36.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:17:36.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:17:36.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:17:36.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:17:36.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:17:36.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:17:36.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:17:12, diff=24.612907s, valid=True
2026-06-03T11:17:36.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:17:36.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:17:36.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:17:36.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52453.613666s, valid=False
2026-06-03T11:17:36.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:17:36.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:17:36.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:17:36.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:17:36.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:17:36.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:17:36.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:17:36.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:17:36.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:17:36.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:17:36.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:17:36.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:17:36.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:17:36.999 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:17:37.206 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:17:37.548 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:17:37.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:17:37.663 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:17:37.663 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:17:37.906 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:17:37.906 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:18:07.937 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:18:07.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:18:07.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:18:08.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:18:08.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:18:08.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:18:08.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:18:08.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:18:08.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:18:08.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:18:08.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:18:08.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:18:08.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:18:10.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:18:10.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:18:10.728 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:18:10.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:18:10.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:18:10.749 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:18:10.749 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:18:10.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:18:10.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:18:10.749 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:18:10.749 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:18:10.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:18:10.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:18:10.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:18:10.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:18:10.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:18:11.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:18:11.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:18:11.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:18:11.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:18:11.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:18:11.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:18:11.093 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:18:11.167 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:17:42
2026-06-03T11:18:11.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85885, datetime.datetime(2026, 6, 3, 11, 17, 42), datetime.datetime(2026, 6, 3, 11, 17, 41), 'salt', 7.27, 99.28, None, 36.69, 86.58, 0.1, 823.88, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:18:11.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:18:11.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:18:11.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:17:41, diff=30.173528s, valid=True
2026-06-03T11:18:11.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:18:11.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:18:11.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:18:12, diff=-0.823634s, valid=True
2026-06-03T11:18:11.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:18:11.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:18:11.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:17:40, diff=31.18312s, valid=True
2026-06-03T11:18:11.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:18:11.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:18:11.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:18:11.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:18:11.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:18:11.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:18:11.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:18:12, diff=-0.8139s, valid=True
2026-06-03T11:18:11.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:18:11.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:18:11.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:18:11.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52488.186754s, valid=False
2026-06-03T11:18:11.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:18:11.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:18:11.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:18:11.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:18:11.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:18:11.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:18:11.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:18:11.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:18:11.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:18:11.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:18:11.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:18:11.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:18:11.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:18:11.501 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:18:11.708 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:18:12.051 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:18:12.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:18:12.155 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:18:12.155 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:18:12.226 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:18:12.227 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:18:42.256 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:18:42.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:18:42.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:18:42.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:18:42.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:18:42.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:18:42.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:18:42.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:18:42.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:18:42.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:18:42.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:18:42.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:18:42.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:18:45.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:18:45.281 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:18:45.282 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:18:45.282 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:18:45.293 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:18:45.307 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:18:45.307 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:18:45.308 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:18:45.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:18:45.308 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:18:45.309 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:18:45.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:18:45.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:18:45.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:18:45.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:18:45.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:18:45.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:18:45.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:18:45.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:18:45.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:18:45.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:18:45.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:18:45.647 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:18:45.716 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:18:42
2026-06-03T11:18:45.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85887, datetime.datetime(2026, 6, 3, 11, 18, 42), datetime.datetime(2026, 6, 3, 11, 18, 42), 'salt', 7.27, 99.28, None, 38.04, 100.51, 0.1, 824.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:18:45.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:18:45.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:18:45.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:18:42, diff=3.724156s, valid=True
2026-06-03T11:18:45.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:18:45.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:18:45.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:19:12, diff=-26.272342s, valid=True
2026-06-03T11:18:45.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:18:45.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:18:45.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:18:40, diff=5.735743s, valid=True
2026-06-03T11:18:45.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:18:45.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:18:45.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:18:45.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:18:45.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:18:45.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:18:45.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:19:12, diff=-26.260514s, valid=True
2026-06-03T11:18:45.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:18:45.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:18:45.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:18:45.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52522.740305s, valid=False
2026-06-03T11:18:45.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:18:45.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:18:45.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:18:45.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:18:45.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:18:45.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:18:45.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:18:45.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:18:45.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:18:45.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:18:45.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:18:45.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:18:46.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:18:46.061 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:18:46.271 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:18:46.615 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:18:46.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:18:46.719 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:18:46.719 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:18:46.791 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:18:46.791 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:19:16.813 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:19:16.813 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:19:16.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:19:16.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:19:16.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:19:17.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:19:17.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:19:17.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:19:17.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:19:17.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:19:17.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:19:17.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:19:17.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:19:19.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:19:19.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:19:19.637 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:19:19.637 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:19:19.647 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:19:19.661 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:19:19.662 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:19:19.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:19:19.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:19:19.663 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:19:19.663 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:19:19.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:19:19.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:19:19.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:19:19.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:19:19.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:19:19.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:19:19.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:19:19.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:19:19.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:19:19.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:19:19.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:19:19.986 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:19:20.055 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:19:12
2026-06-03T11:19:20.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85888, datetime.datetime(2026, 6, 3, 11, 19, 12), datetime.datetime(2026, 6, 3, 11, 19, 12), 'salt', 7.14, 99.28, None, 33.66, 98.34, 0.1, 824.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:19:20.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:19:20.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:19:20.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:19:12, diff=8.062592s, valid=True
2026-06-03T11:19:20.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:19:20.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:19:20.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:19:12, diff=8.066204s, valid=True
2026-06-03T11:19:20.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:19:20.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:19:20.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:19:10, diff=10.074368s, valid=True
2026-06-03T11:19:20.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:19:20.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:19:20.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:19:20.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:19:20.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:19:20.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:19:20.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:19:12, diff=8.078077s, valid=True
2026-06-03T11:19:20.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:19:20.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:19:20.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:19:20.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52557.078851s, valid=False
2026-06-03T11:19:20.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:19:20.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:19:20.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:19:20.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:19:20.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:19:20.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:19:20.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:19:20.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:19:20.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:19:20.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:19:20.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:19:20.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:19:20.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:19:20.401 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:19:20.608 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:19:21.007 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:19:21.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:19:21.109 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:19:21.110 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:19:21.284 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:19:21.284 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:19:51.314 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:19:51.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:19:51.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:19:51.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:19:51.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:19:52.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:19:52.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:19:52.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:19:52.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:19:52.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:19:52.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:19:52.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:19:52.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:19:54.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:19:54.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:19:54.513 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:19:54.513 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:19:54.523 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:19:54.536 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:19:54.536 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:19:54.537 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:19:54.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:19:54.538 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:19:54.538 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:19:54.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:19:54.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:19:54.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:19:54.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:19:54.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:19:54.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:19:54.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:19:54.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:19:54.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:19:54.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:19:54.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:19:54.878 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:19:54.948 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:19:43
2026-06-03T11:19:54.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85889, datetime.datetime(2026, 6, 3, 11, 19, 43), datetime.datetime(2026, 6, 3, 11, 19, 42), 'salt', 7.34, 99.41, None, 35.5, 97.48, 0.08, 823.94, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:19:54.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:19:54.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:19:54.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:19:42, diff=12.955685s, valid=True
2026-06-03T11:19:54.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:19:54.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:19:54.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:20:12, diff=-17.04079s, valid=True
2026-06-03T11:19:54.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:19:54.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:19:54.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:19:40, diff=14.967453s, valid=True
2026-06-03T11:19:54.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:19:54.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:19:54.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:19:54.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:19:54.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:19:54.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:19:54.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:20:12, diff=-17.028735s, valid=True
2026-06-03T11:19:54.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:19:54.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:19:54.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:19:54.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52591.972076s, valid=False
2026-06-03T11:19:54.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:19:54.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:19:54.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:19:54.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:19:54.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:19:55.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:19:55.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:19:55.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:19:55.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:19:55.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:19:55.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:19:55.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:19:55.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:19:55.329 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:19:55.550 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:19:55.889 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:19:55.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:19:55.991 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:19:55.991 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:19:56.064 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:19:56.064 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:20:26.077 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:20:26.077 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:20:26.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:20:26.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:20:26.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:20:26.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:20:26.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:20:26.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:20:26.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:20:26.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:20:26.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:20:26.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:20:26.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:20:28.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:20:28.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:20:28.838 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:20:28.838 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:20:28.850 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:20:28.863 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:20:28.864 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:20:28.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:20:28.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:20:28.865 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:20:28.865 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:20:28.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:20:29.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:20:29.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:20:29.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:20:29.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:20:29.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:20:29.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:20:29.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:20:29.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:20:29.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:20:29.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:20:29.204 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:20:29.274 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:20:13
2026-06-03T11:20:29.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85890, datetime.datetime(2026, 6, 3, 11, 20, 13), datetime.datetime(2026, 6, 3, 11, 20, 12), 'salt', 7.34, 99.31, None, 36.62, 95.13, 0.1, 823.82, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:20:29.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:20:29.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:20:29.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:20:12, diff=17.282345s, valid=True
2026-06-03T11:20:29.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:20:29.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:20:29.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:20:12, diff=17.285951s, valid=True
2026-06-03T11:20:29.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:20:29.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:20:29.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:20:12, diff=17.294463s, valid=True
2026-06-03T11:20:29.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:20:29.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:20:29.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:20:29.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:20:29.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:20:29.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:20:29.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:20:12, diff=17.298379s, valid=True
2026-06-03T11:20:29.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:20:29.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:20:29.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:20:29.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52626.299218s, valid=False
2026-06-03T11:20:29.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:20:29.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:20:29.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:20:29.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:20:29.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:20:29.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:20:29.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:20:29.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:20:29.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:20:29.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:20:29.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:20:29.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:20:29.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:20:29.620 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:20:29.903 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:20:30.252 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:20:30.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:20:30.354 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:20:30.354 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:20:30.570 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:20:30.570 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:21:00.593 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:21:00.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:21:00.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:21:00.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:21:00.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:21:00.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:21:00.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:21:01.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:21:01.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:21:01.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:21:01.012 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:21:01.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:21:01.019 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:21:03.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:21:03.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:21:03.490 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:21:03.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:21:03.501 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:21:03.515 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:21:03.515 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:21:03.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:21:03.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:21:03.516 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:21:03.517 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:21:03.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:21:03.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:21:03.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:21:03.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:21:03.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:21:03.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:21:03.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:21:03.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:21:03.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:21:03.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:21:03.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:21:03.858 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:21:03.928 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:20:43
2026-06-03T11:21:03.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85891, datetime.datetime(2026, 6, 3, 11, 20, 43), datetime.datetime(2026, 6, 3, 11, 20, 43), 'salt', 7.27, 99.25, None, 37.01, 89.17, 0.1, 823.82, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:21:03.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:21:03.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:21:03.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:20:43, diff=20.934981s, valid=True
2026-06-03T11:21:03.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:21:03.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:21:03.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:21:12, diff=-8.061827s, valid=True
2026-06-03T11:21:03.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:21:03.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:21:03.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:20:43, diff=20.945665s, valid=True
2026-06-03T11:21:03.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:21:03.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:21:03.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:21:03.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:21:03.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:21:03.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:21:03.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:21:12, diff=-8.050968s, valid=True
2026-06-03T11:21:03.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:21:03.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:21:03.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:21:03.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52660.949785s, valid=False
2026-06-03T11:21:03.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:21:03.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:21:03.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:21:03.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:21:03.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:21:04.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:21:04.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:21:04.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:21:04.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:21:04.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:21:04.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:21:04.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:21:04.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:21:04.266 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:21:04.471 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:21:04.809 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:21:04.911 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:21:04.911 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:21:04.911 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:21:05.067 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:21:05.067 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:21:35.097 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:21:35.097 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:21:35.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:21:35.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:21:35.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:21:35.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:21:35.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:21:35.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:21:35.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:21:35.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:21:35.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:21:35.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:21:35.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:21:38.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:21:38.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:21:38.048 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:21:38.048 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:21:38.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:21:38.069 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:21:38.069 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:21:38.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:21:38.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:21:38.071 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:21:38.071 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:21:38.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:21:38.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:21:38.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:21:38.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:21:38.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:21:38.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:21:38.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:21:38.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:21:38.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:21:38.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:21:38.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:21:38.417 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:21:38.488 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:21:14
2026-06-03T11:21:38.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85892, datetime.datetime(2026, 6, 3, 11, 21, 14), datetime.datetime(2026, 6, 3, 11, 21, 13), 'salt', 7.27, 99.34, None, 42.06, 95.83, 0.09, 823.82, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:21:38.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:21:38.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:21:38.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:21:13, diff=25.495157s, valid=True
2026-06-03T11:21:38.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:21:38.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:21:38.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:21:12, diff=26.49848s, valid=True
2026-06-03T11:21:38.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:21:38.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:21:38.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:21:11, diff=27.507512s, valid=True
2026-06-03T11:21:38.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:21:38.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:21:38.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:21:38.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:21:38.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:21:38.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:21:38.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:21:12, diff=26.511228s, valid=True
2026-06-03T11:21:38.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:21:38.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:21:38.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:21:38.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52695.512036s, valid=False
2026-06-03T11:21:38.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:21:38.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:21:38.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:21:38.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:21:38.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:21:38.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:21:38.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:21:38.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:21:38.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:21:38.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:21:38.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:21:38.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:21:38.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:21:38.919 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:21:39.143 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:21:39.484 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:21:39.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:21:39.586 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:21:39.586 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:21:39.738 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:21:39.738 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:22:09.758 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:22:09.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:22:09.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:22:10.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:22:10.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:22:10.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:22:10.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:22:10.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:22:10.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:22:10.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:22:10.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:22:10.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:22:10.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:22:12.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:22:12.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:22:12.712 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:22:12.713 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:22:12.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:22:12.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:22:12.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:22:12.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:22:12.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:22:12.737 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:22:12.737 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:22:12.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:22:12.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:22:12.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:22:12.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:22:12.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:22:13.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:22:13.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:22:13.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:22:13.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:22:13.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:22:13.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:22:13.081 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:22:13.151 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:21:44
2026-06-03T11:22:13.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85893, datetime.datetime(2026, 6, 3, 11, 21, 44), datetime.datetime(2026, 6, 3, 11, 21, 43), 'salt', 7.24, 99.38, None, 42.69, 92.97, 0.09, 824.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:22:13.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:22:13.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:22:13.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:21:43, diff=30.159095s, valid=True
2026-06-03T11:22:13.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:22:13.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:22:13.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:22:12, diff=1.162554s, valid=True
2026-06-03T11:22:13.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:22:13.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:22:13.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:21:41, diff=32.170585s, valid=True
2026-06-03T11:22:13.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:22:13.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:22:13.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:22:13.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:22:13.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:22:13.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:22:13.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:22:12, diff=1.174309s, valid=True
2026-06-03T11:22:13.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:22:13.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:22:13.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:22:13.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52730.175126s, valid=False
2026-06-03T11:22:13.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:22:13.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:22:13.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:22:13.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:22:13.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:22:13.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:22:13.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:22:13.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:22:13.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:22:13.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:22:13.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:22:13.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:22:13.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:22:13.494 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:22:13.700 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:22:14.063 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:22:14.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:22:14.166 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:22:14.166 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:22:14.339 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:22:14.339 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:22:44.346 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:22:44.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:22:44.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:22:44.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:22:44.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:22:45.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:22:45.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:22:45.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:22:45.120 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:22:45.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:22:45.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:22:45.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:22:45.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:22:47.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:22:47.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:22:47.569 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:22:47.569 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:22:47.578 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:22:47.591 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:22:47.591 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:22:47.592 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:22:47.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:22:47.593 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:22:47.593 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:22:47.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:22:47.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:22:47.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:22:47.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:22:47.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:22:47.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:22:47.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:22:47.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:22:47.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:22:47.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:22:47.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:22:47.928 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:22:47.997 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:22:44
2026-06-03T11:22:47.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85895, datetime.datetime(2026, 6, 3, 11, 22, 44), datetime.datetime(2026, 6, 3, 11, 22, 44), 'salt', 7.2, 99.41, None, 41.03, 93.23, 0.08, 823.82, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:22:47.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:22:47.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:22:48.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:22:44, diff=4.004772s, valid=True
2026-06-03T11:22:48.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:22:48.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:22:48.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:23:12, diff=-23.99174s, valid=True
2026-06-03T11:22:48.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:22:48.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:22:48.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:22:42, diff=6.016282s, valid=True
2026-06-03T11:22:48.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:22:48.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:22:48.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:22:48.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:22:48.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:22:48.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:22:48.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:23:12, diff=-23.980044s, valid=True
2026-06-03T11:22:48.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:22:48.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:22:48.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:22:48.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52765.020738s, valid=False
2026-06-03T11:22:48.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:22:48.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:22:48.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:22:48.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:22:48.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:22:48.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:22:48.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:22:48.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:22:48.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:22:48.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:22:48.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:22:48.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:22:48.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:22:48.417 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:22:48.624 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:22:48.967 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:22:49.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:22:49.072 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:22:49.072 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:22:49.144 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:22:49.144 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:23:19.170 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:23:19.170 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:23:19.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:23:19.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:23:19.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:23:19.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:23:19.726 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:23:19.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:23:19.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:23:19.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:23:19.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:23:19.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:23:19.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:23:22.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:23:22.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:23:22.107 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:23:22.107 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:23:22.117 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:23:22.130 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:23:22.131 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:23:22.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:23:22.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:23:22.132 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:23:22.132 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:23:22.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:23:22.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:23:22.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:23:22.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:23:22.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:23:22.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:23:22.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:23:22.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:23:22.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:23:22.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:23:22.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:23:22.489 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:23:22.573 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:23:15
2026-06-03T11:23:22.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85896, datetime.datetime(2026, 6, 3, 11, 23, 15), datetime.datetime(2026, 6, 3, 11, 23, 14), 'salt', 7.17, 99.34, None, 43.4, 92.66, 0.09, 823.82, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:23:22.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:23:22.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:23:22.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:23:14, diff=8.581278s, valid=True
2026-06-03T11:23:22.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:23:22.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:23:22.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:23:12, diff=10.58475s, valid=True
2026-06-03T11:23:22.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:23:22.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:23:22.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:23:12, diff=10.593143s, valid=True
2026-06-03T11:23:22.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:23:22.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:23:22.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:23:22.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:23:22.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:23:22.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:23:22.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:23:12, diff=10.596867s, valid=True
2026-06-03T11:23:22.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:23:22.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:23:22.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:23:22.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52799.597699s, valid=False
2026-06-03T11:23:22.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:23:22.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:23:22.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:23:22.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:23:22.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:23:22.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:23:22.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:23:22.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:23:22.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:23:22.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:23:22.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:23:22.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:23:22.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:23:22.919 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:23:23.124 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:23:23.462 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:23:23.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:23:23.564 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:23:23.564 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:23:23.770 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:23:23.770 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:23:53.775 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:23:53.776 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:23:53.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:23:54.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:23:54.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:23:54.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:23:54.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:23:54.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:23:54.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:23:54.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:23:54.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:23:54.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:23:54.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:23:57.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:23:57.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:23:57.095 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:23:57.095 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:23:57.105 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:23:57.118 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:23:57.118 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:23:57.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:23:57.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:23:57.120 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:23:57.120 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:23:57.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:23:57.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:23:57.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:23:57.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:23:57.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:23:57.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:23:57.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:23:57.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:23:57.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:23:57.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:23:57.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:23:57.464 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:23:57.537 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:23:45
2026-06-03T11:23:57.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85897, datetime.datetime(2026, 6, 3, 11, 23, 45), datetime.datetime(2026, 6, 3, 11, 23, 44), 'salt', 7.17, 99.38, None, 38.88, 99.28, 0.08, 823.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:23:57.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:23:57.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:23:57.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:23:44, diff=13.545986s, valid=True
2026-06-03T11:23:57.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:23:57.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:23:57.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:24:12, diff=-14.450425s, valid=True
2026-06-03T11:23:57.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:23:57.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:23:57.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:23:43, diff=14.557819s, valid=True
2026-06-03T11:23:57.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:23:57.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:23:57.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:23:57.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:23:57.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:23:57.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:23:57.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:24:12, diff=-14.4385s, valid=True
2026-06-03T11:23:57.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:23:57.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:23:57.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:23:57.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52834.562314s, valid=False
2026-06-03T11:23:57.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:23:57.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:23:57.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:23:57.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:23:57.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:23:57.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:23:57.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:23:57.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:23:57.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:23:57.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:23:57.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:23:57.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:23:57.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:23:57.971 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:23:58.181 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:23:58.522 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:23:58.628 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:23:58.628 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:23:58.628 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:23:58.699 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:23:58.699 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:24:28.719 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:24:28.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:24:28.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:24:29.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:24:29.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:24:29.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:24:29.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:24:29.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:24:29.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:24:29.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:24:29.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:24:29.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:24:29.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:24:31.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:24:31.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:24:31.680 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:24:31.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:24:31.691 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:24:31.703 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:24:31.704 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:24:31.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:24:31.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:24:31.705 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:24:31.705 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:24:31.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:24:31.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:24:31.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:24:31.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:24:31.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:24:31.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:24:31.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:24:32.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:24:32.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:24:32.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:24:32.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:24:32.040 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:24:32.108 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:24:15
2026-06-03T11:24:32.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85898, datetime.datetime(2026, 6, 3, 11, 24, 15), datetime.datetime(2026, 6, 3, 11, 24, 14), 'salt', 7.1, 99.34, None, 37.01, 88.3, 0.08, 823.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:24:32.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:24:32.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:24:32.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:24:14, diff=18.11434s, valid=True
2026-06-03T11:24:32.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:24:32.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:24:32.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:24:12, diff=20.117229s, valid=True
2026-06-03T11:24:32.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:24:32.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:24:32.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:24:13, diff=19.123825s, valid=True
2026-06-03T11:24:32.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:24:32.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:24:32.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:24:32.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:24:32.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:24:32.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:24:32.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:24:12, diff=20.126837s, valid=True
2026-06-03T11:24:32.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:24:32.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:24:32.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:24:32.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52869.127483s, valid=False
2026-06-03T11:24:32.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:24:32.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:24:32.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:24:32.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:24:32.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:24:32.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:24:32.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:24:32.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:24:32.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:24:32.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:24:32.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:24:32.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:24:32.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:24:32.442 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:24:32.646 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:24:32.984 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:24:33.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:24:33.086 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:24:33.086 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:24:33.815 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:24:33.815 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:25:03.839 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:25:03.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:25:03.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:25:04.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:25:04.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:25:04.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:25:04.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:25:04.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:25:04.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:25:04.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:25:04.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:25:04.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:25:04.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:25:07.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:25:07.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:25:07.051 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:25:07.051 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:25:07.061 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:25:07.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:25:07.074 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:25:07.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:25:07.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:25:07.075 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:25:07.075 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:25:07.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:25:07.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:25:07.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:25:07.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:25:07.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:25:07.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:25:07.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:25:07.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:25:07.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:25:07.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:25:07.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:25:07.394 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:25:07.463 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:24:45
2026-06-03T11:25:07.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85899, datetime.datetime(2026, 6, 3, 11, 24, 45), datetime.datetime(2026, 6, 3, 11, 24, 45), 'salt', 7.24, 99.41, None, 32.57, 89.19, 0.08, 823.76, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:25:07.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:25:07.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:25:07.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:24:45, diff=22.469407s, valid=True
2026-06-03T11:25:07.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:25:07.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:25:07.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:25:12, diff=-4.527671s, valid=True
2026-06-03T11:25:07.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:25:07.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:25:07.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:24:44, diff=23.478972s, valid=True
2026-06-03T11:25:07.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:25:07.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:25:07.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:25:07.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:25:07.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:25:07.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:25:07.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:25:12, diff=-4.517959s, valid=True
2026-06-03T11:25:07.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:25:07.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:25:07.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:25:07.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52904.482696s, valid=False
2026-06-03T11:25:07.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:25:07.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:25:07.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:25:07.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:25:07.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:25:07.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:25:07.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:25:07.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:25:07.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:25:07.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:25:07.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:25:07.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:25:07.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:25:07.796 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:25:08.001 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:25:08.339 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:25:08.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:25:08.441 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:25:08.441 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:25:08.619 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:25:08.619 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:25:38.649 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:25:38.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:25:38.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:25:38.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:25:38.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:25:39.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:25:39.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:25:39.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:25:39.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:25:39.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:25:39.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:25:39.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:25:39.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:25:41.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:25:41.778 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:25:41.779 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:25:41.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:25:41.788 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:25:41.801 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:25:41.802 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:25:41.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:25:41.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:25:41.803 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:25:41.803 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:25:41.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:25:41.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:25:41.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:25:42.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:25:42.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:25:42.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:25:42.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:25:42.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:25:42.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:25:42.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:25:42.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:25:42.141 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:25:42.216 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:25:16
2026-06-03T11:25:42.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85900, datetime.datetime(2026, 6, 3, 11, 25, 16), datetime.datetime(2026, 6, 3, 11, 25, 15), 'salt', 7.24, 99.38, None, 41.35, 99.33, 0.09, 823.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:25:42.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:25:42.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:25:42.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:25:15, diff=27.224186s, valid=True
2026-06-03T11:25:42.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:25:42.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:25:42.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:25:12, diff=30.227712s, valid=True
2026-06-03T11:25:42.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:25:42.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:25:42.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:25:13, diff=29.235892s, valid=True
2026-06-03T11:25:42.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:25:42.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:25:42.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:25:42.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:25:42.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:25:42.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:25:42.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:25:12, diff=30.239672s, valid=True
2026-06-03T11:25:42.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:25:42.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:25:42.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:25:42.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52939.24048s, valid=False
2026-06-03T11:25:42.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:25:42.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:25:42.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:25:42.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:25:42.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:25:42.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:25:42.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:25:42.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:25:42.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:25:42.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:25:42.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:25:42.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:25:42.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:25:42.561 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:25:42.766 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:25:43.162 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:25:43.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:25:43.265 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:25:43.265 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:25:43.419 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:25:43.419 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:26:13.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:26:13.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:26:13.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:26:13.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:26:13.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:26:14.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:26:14.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:26:14.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:26:14.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:26:14.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:26:14.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:26:14.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:26:14.034 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:26:16.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:26:16.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:26:16.788 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:26:16.788 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:26:16.799 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:26:16.812 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:26:16.813 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:26:16.813 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:26:16.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:26:16.814 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:26:16.814 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:26:16.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:26:16.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:26:16.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:26:17.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:26:17.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:26:17.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:26:17.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:26:17.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:26:17.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:26:17.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:26:17.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:26:17.154 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:26:17.235 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:26:16
2026-06-03T11:26:17.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85902, datetime.datetime(2026, 6, 3, 11, 26, 16), datetime.datetime(2026, 6, 3, 11, 26, 15), 'salt', 7.14, 99.31, None, 35.71, 91.23, 0.1, 823.88, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:26:17.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:26:17.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:26:17.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:26:15, diff=2.242851s, valid=True
2026-06-03T11:26:17.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:26:17.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:26:17.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:26:12, diff=5.246323s, valid=True
2026-06-03T11:26:17.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:26:17.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:26:17.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:26:14, diff=3.254465s, valid=True
2026-06-03T11:26:17.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:26:17.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:26:17.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:26:17.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:26:17.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:26:17.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:26:17.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:26:12, diff=5.258229s, valid=True
2026-06-03T11:26:17.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:26:17.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:26:17.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:26:17.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=52974.259054s, valid=False
2026-06-03T11:26:17.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:26:17.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:26:17.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:26:17.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:26:17.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:26:17.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:26:17.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:26:17.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:26:17.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:26:17.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:26:17.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:26:17.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:26:17.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:26:17.579 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:26:17.783 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:26:18.120 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:26:18.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:26:18.222 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:26:18.222 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:26:18.444 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:26:18.444 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:26:48.453 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:26:48.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:26:48.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:26:48.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:26:48.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:26:48.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:26:48.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:26:48.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:26:48.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:26:48.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:26:48.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:26:48.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:26:48.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:26:51.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:26:51.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:26:51.478 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:26:51.478 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:26:51.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:26:51.500 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:26:51.501 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:26:51.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:26:51.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:26:51.502 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:26:51.502 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:26:51.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:26:51.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:26:51.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:26:51.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:26:51.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:26:51.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:26:51.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:26:51.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:26:51.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:26:51.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:26:51.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:26:51.853 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:26:51.935 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:26:46
2026-06-03T11:26:51.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85903, datetime.datetime(2026, 6, 3, 11, 26, 46), datetime.datetime(2026, 6, 3, 11, 26, 46), 'salt', 7.17, 99.34, None, 42.8, 98.58, 0.09, 823.58, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:26:51.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:26:51.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:26:51.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:26:46, diff=5.94334s, valid=True
2026-06-03T11:26:51.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:26:51.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:26:51.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:27:12, diff=-20.053099s, valid=True
2026-06-03T11:26:51.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:26:51.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:26:51.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:26:44, diff=7.955452s, valid=True
2026-06-03T11:26:51.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:26:51.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:26:51.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:26:51.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:26:51.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:26:51.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:26:51.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:27:12, diff=-20.040705s, valid=True
2026-06-03T11:26:51.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:26:51.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:26:51.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:26:51.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53008.960116s, valid=False
2026-06-03T11:26:51.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:26:51.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:26:51.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:26:51.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:26:51.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:26:52.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:26:52.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:26:52.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:26:52.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:26:52.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:26:52.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:26:52.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:26:52.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:26:52.353 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:26:52.557 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:26:52.916 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:26:53.017 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:26:53.017 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:26:53.018 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:26:53.188 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:26:53.188 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:27:23.210 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:27:23.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:27:23.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:27:23.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:27:23.545 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:27:23.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:27:23.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:27:23.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:27:23.806 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:27:23.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:27:23.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:27:23.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:27:23.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:27:26.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:27:26.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:27:26.724 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:27:26.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:27:26.734 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:27:26.747 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:27:26.747 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:27:26.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:27:26.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:27:26.748 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:27:26.749 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:27:26.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:27:26.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:27:26.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:27:26.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:27:26.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:27:27.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:27:27.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:27:27.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:27:27.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:27:27.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:27:27.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:27:27.088 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:27:27.158 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:27:17
2026-06-03T11:27:27.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85904, datetime.datetime(2026, 6, 3, 11, 27, 17), datetime.datetime(2026, 6, 3, 11, 27, 16), 'salt', 7.14, 99.31, None, 44.46, 105.55, 0.1, 823.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:27:27.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:27:27.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:27:27.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:27:16, diff=11.165958s, valid=True
2026-06-03T11:27:27.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:27:27.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:27:27.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:27:12, diff=15.169281s, valid=True
2026-06-03T11:27:27.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:27:27.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:27:27.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:27:14, diff=13.177217s, valid=True
2026-06-03T11:27:27.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:27:27.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:27:27.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:27:27.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:27:27.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:27:27.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:27:27.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:27:12, diff=15.180788s, valid=True
2026-06-03T11:27:27.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:27:27.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:27:27.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:27:27.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53044.181553s, valid=False
2026-06-03T11:27:27.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:27:27.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:27:27.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:27:27.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:27:27.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:27:27.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:27:27.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:27:27.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:27:27.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:27:27.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:27:27.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:27:27.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:27:27.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:27:27.500 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:27:27.706 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:27:28.044 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:27:28.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:27:28.147 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:27:28.147 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:27:28.373 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:27:28.373 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:27:58.381 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:27:58.381 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:27:58.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:27:58.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:27:58.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:27:58.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:27:58.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:27:58.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:27:58.792 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:27:58.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:27:58.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:27:58.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:27:58.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:28:01.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:28:01.551 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:28:01.552 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:28:01.552 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:28:01.562 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:28:01.574 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:28:01.575 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:28:01.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:28:01.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:28:01.576 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:28:01.576 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:28:01.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:28:01.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:28:01.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:28:01.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:28:01.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:28:01.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:28:01.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:28:01.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:28:01.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:28:01.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:28:01.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:28:01.904 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:28:01.982 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:27:47
2026-06-03T11:28:01.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85905, datetime.datetime(2026, 6, 3, 11, 27, 47), datetime.datetime(2026, 6, 3, 11, 27, 46), 'salt', 7.1, 99.31, None, 37.26, 100.41, 0.09, 823.76, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:28:01.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:28:01.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:28:01.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:27:46, diff=15.989348s, valid=True
2026-06-03T11:28:01.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:28:01.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:28:01.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:28:12, diff=-10.007475s, valid=True
2026-06-03T11:28:01.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:28:01.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:28:02.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:27:44, diff=18.000028s, valid=True
2026-06-03T11:28:02.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:28:02.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:28:02.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:28:02.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:28:02.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:28:02.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:28:02.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:28:12, diff=-9.996565s, valid=True
2026-06-03T11:28:02.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:28:02.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:28:02.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:28:02.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53079.004179s, valid=False
2026-06-03T11:28:02.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:28:02.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:28:02.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:28:02.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:28:02.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:28:02.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:28:02.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:28:02.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:28:02.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:28:02.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:28:02.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:28:02.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:28:02.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:28:02.396 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:28:02.628 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:28:02.981 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:28:03.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:28:03.085 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:28:03.085 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:28:03.255 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:28:03.255 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:28:33.271 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:28:33.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:28:33.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:28:33.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:28:33.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:28:33.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:28:33.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:28:33.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:28:33.666 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:28:33.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:28:33.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:28:33.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:28:33.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:28:36.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:28:36.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:28:36.418 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:28:36.419 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:28:36.428 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:28:36.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:28:36.441 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:28:36.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:28:36.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:28:36.442 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:28:36.442 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:28:36.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:28:36.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:28:36.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:28:36.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:28:36.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:28:36.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:28:36.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:28:36.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:28:36.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:28:36.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:28:36.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:28:36.750 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:28:36.824 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:28:17
2026-06-03T11:28:36.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85906, datetime.datetime(2026, 6, 3, 11, 28, 17), datetime.datetime(2026, 6, 3, 11, 28, 16), 'salt', 7.17, 99.41, None, 36.38, 84.92, 0.08, 823.88, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:28:36.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:28:36.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:28:36.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:28:16, diff=20.831716s, valid=True
2026-06-03T11:28:36.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:28:36.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:28:36.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:28:12, diff=24.835029s, valid=True
2026-06-03T11:28:36.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:28:36.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:28:36.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:28:14, diff=22.842559s, valid=True
2026-06-03T11:28:36.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:28:36.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:28:36.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:28:36.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:28:36.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:28:36.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:28:36.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:28:12, diff=24.846053s, valid=True
2026-06-03T11:28:36.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:28:36.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:28:36.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:28:36.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53113.846807s, valid=False
2026-06-03T11:28:36.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:28:36.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:28:36.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:28:36.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:28:36.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:28:36.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:28:36.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:28:36.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:28:36.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:28:36.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:28:37.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:28:37.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:28:37.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:28:37.167 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:28:37.376 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:28:37.751 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:28:37.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:28:37.853 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:28:37.853 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:28:38.010 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:28:38.011 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:29:08.041 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:29:08.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:29:08.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:29:08.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:29:08.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:29:08.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:29:08.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:29:08.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:29:08.806 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:29:08.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:29:08.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:29:08.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:29:08.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:29:11.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:29:11.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:29:11.275 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:29:11.275 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:29:11.286 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:29:11.298 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:29:11.299 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:29:11.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:29:11.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:29:11.300 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:29:11.300 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:29:11.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:29:11.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:29:11.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:29:11.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:29:11.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:29:11.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:29:11.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:29:11.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:29:11.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:29:11.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:29:11.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:29:11.651 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:29:11.735 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:28:47
2026-06-03T11:29:11.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85907, datetime.datetime(2026, 6, 3, 11, 28, 47), datetime.datetime(2026, 6, 3, 11, 28, 47), 'salt', 7.24, 99.41, None, 44.63, 99.99, 0.08, 823.76, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:29:11.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:29:11.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:29:11.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:28:47, diff=24.742413s, valid=True
2026-06-03T11:29:11.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:29:11.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:29:11.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:29:12, diff=-0.254082s, valid=True
2026-06-03T11:29:11.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:29:11.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:29:11.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:28:46, diff=25.754204s, valid=True
2026-06-03T11:29:11.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:29:11.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:29:11.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:29:11.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:29:11.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:29:11.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:29:11.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:29:12, diff=-0.242014s, valid=True
2026-06-03T11:29:11.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:29:11.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:29:11.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:29:11.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53148.758806s, valid=False
2026-06-03T11:29:11.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:29:11.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:29:11.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:29:11.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:29:11.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:29:11.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:29:11.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:29:11.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:29:11.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:29:11.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:29:12.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:29:12.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:29:12.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:29:12.158 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:29:12.366 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:29:12.712 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:29:12.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:29:12.815 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:29:12.815 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:29:12.885 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:29:12.885 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:29:42.915 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:29:42.916 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:29:42.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:29:43.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:29:43.461 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:29:43.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:29:43.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:29:43.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:29:43.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:29:43.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:29:43.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:29:43.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:29:43.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:29:46.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:29:46.079 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:29:46.079 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:29:46.080 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:29:46.089 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:29:46.101 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:29:46.102 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:29:46.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:29:46.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:29:46.103 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:29:46.103 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:29:46.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:29:46.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:29:46.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:29:46.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:29:46.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:29:46.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:29:46.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:29:46.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:29:46.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:29:46.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:29:46.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:29:46.463 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:29:46.536 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:29:17
2026-06-03T11:29:46.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85908, datetime.datetime(2026, 6, 3, 11, 29, 17), datetime.datetime(2026, 6, 3, 11, 29, 17), 'salt', 7.07, 99.28, None, 42.09, 89.4, 0.1, 823.88, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:29:46.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:29:46.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:29:46.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:29:17, diff=29.544366s, valid=True
2026-06-03T11:29:46.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:29:46.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:29:46.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:29:12, diff=34.547986s, valid=True
2026-06-03T11:29:46.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:29:46.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:29:46.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:29:17, diff=29.556371s, valid=True
2026-06-03T11:29:46.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:29:46.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:29:46.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:29:46.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:29:46.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:29:46.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:29:46.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:29:12, diff=34.560226s, valid=True
2026-06-03T11:29:46.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:29:46.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:29:46.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:29:46.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53183.561074s, valid=False
2026-06-03T11:29:46.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:29:46.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:29:46.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:29:46.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:29:46.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:29:46.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:29:46.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:29:46.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:29:46.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:29:46.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:29:46.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:29:46.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:29:46.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:29:46.882 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:29:47.089 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:29:47.430 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:29:47.533 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:29:47.533 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:29:47.533 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:29:47.725 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:29:47.726 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:30:17.755 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:30:17.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:30:17.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:30:18.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:30:18.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:30:18.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:30:18.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:30:18.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:30:18.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:30:18.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:30:18.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:30:18.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:30:18.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:30:20.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:30:20.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:30:20.703 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:30:20.703 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:30:20.714 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:30:20.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:30:20.727 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:30:20.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:30:20.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:30:20.728 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:30:20.728 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:30:20.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:30:20.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:30:20.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:30:20.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:30:20.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:30:21.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:30:21.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:30:21.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:30:21.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:30:21.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:30:21.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:30:21.081 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:30:21.161 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:30:18
2026-06-03T11:30:21.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85910, datetime.datetime(2026, 6, 3, 11, 30, 18), datetime.datetime(2026, 6, 3, 11, 30, 17), 'salt', 7.14, 99.34, None, 38.46, 97.99, 0.09, 823.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:30:21.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:30:21.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:30:21.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:30:17, diff=4.168404s, valid=True
2026-06-03T11:30:21.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:30:21.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:30:21.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:30:12, diff=9.171893s, valid=True
2026-06-03T11:30:21.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:30:21.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:30:21.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:30:16, diff=5.180565s, valid=True
2026-06-03T11:30:21.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:30:21.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:30:21.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:30:21.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:30:21.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:30:21.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:30:21.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:30:12, diff=9.18787s, valid=True
2026-06-03T11:30:21.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:30:21.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:30:21.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:30:21.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53218.188726s, valid=False
2026-06-03T11:30:21.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:30:21.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:30:21.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:30:21.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:30:21.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:30:21.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:30:21.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:30:21.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:30:21.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:30:21.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:30:21.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:30:21.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:30:21.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:30:21.508 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:30:21.716 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:30:22.061 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:30:22.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:30:22.163 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:30:22.163 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:30:22.411 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:30:22.411 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:30:52.441 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:30:52.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:30:52.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:30:52.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:30:52.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:30:52.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:30:52.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:30:52.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:30:52.939 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:30:52.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:30:52.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:30:52.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:30:52.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:30:55.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:30:55.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:30:55.454 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:30:55.454 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:30:55.464 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:30:55.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:30:55.477 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:30:55.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:30:55.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:30:55.478 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:30:55.478 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:30:55.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:30:55.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:30:55.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:30:55.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:30:55.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:30:55.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:30:55.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:30:55.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:30:55.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:30:55.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:30:55.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:30:55.810 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:30:55.879 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:30:48
2026-06-03T11:30:55.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85911, datetime.datetime(2026, 6, 3, 11, 30, 48), datetime.datetime(2026, 6, 3, 11, 30, 47), 'salt', 7.14, 99.41, None, 39.98, 94.12, 0.08, 823.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:30:55.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:30:55.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:30:55.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:30:47, diff=8.887016s, valid=True
2026-06-03T11:30:55.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:30:55.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:30:55.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:31:12, diff=-16.10947s, valid=True
2026-06-03T11:30:55.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:30:55.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:30:55.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:30:46, diff=9.898861s, valid=True
2026-06-03T11:30:55.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:30:55.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:30:55.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:30:55.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:30:55.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:30:55.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:30:55.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:31:12, diff=-16.097439s, valid=True
2026-06-03T11:30:55.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:30:55.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:30:55.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:30:55.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53252.903376s, valid=False
2026-06-03T11:30:55.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:30:55.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:30:55.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:30:55.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:30:55.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:30:55.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:30:55.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:30:55.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:30:55.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:30:56.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:30:56.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:30:56.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:30:56.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:30:56.225 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:30:56.448 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:30:56.843 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:30:56.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:30:56.946 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:30:56.946 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:30:57.158 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:30:57.158 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:31:27.177 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:31:27.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:31:27.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:31:27.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:31:27.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:31:27.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:31:27.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:31:27.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:31:27.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:31:27.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:31:27.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:31:27.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:31:27.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:31:30.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:31:30.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:31:30.284 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:31:30.284 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:31:30.293 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:31:30.306 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:31:30.306 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:31:30.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:31:30.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:31:30.308 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:31:30.308 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:31:30.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:31:30.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:31:30.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:31:30.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:31:30.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:31:30.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:31:30.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:31:30.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:31:30.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:31:30.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:31:30.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:31:30.666 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:31:30.752 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:31:18
2026-06-03T11:31:30.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85912, datetime.datetime(2026, 6, 3, 11, 31, 18), datetime.datetime(2026, 6, 3, 11, 31, 18), 'salt', 7.17, 99.34, None, 41.18, 97.34, 0.09, 823.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:31:30.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:31:30.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:31:30.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:31:18, diff=12.759765s, valid=True
2026-06-03T11:31:30.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:31:30.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:31:30.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:31:12, diff=18.763254s, valid=True
2026-06-03T11:31:30.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:31:30.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:31:30.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:31:16, diff=14.771457s, valid=True
2026-06-03T11:31:30.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:31:30.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:31:30.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:31:30.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:31:30.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:31:30.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:31:30.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:31:12, diff=18.775192s, valid=True
2026-06-03T11:31:30.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:31:30.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:31:30.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:31:30.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53287.776014s, valid=False
2026-06-03T11:31:30.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:31:30.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:31:30.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:31:30.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:31:30.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:31:30.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:31:30.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:31:30.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:31:30.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:31:30.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:31:30.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:31:31.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:31:31.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:31:31.097 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:31:31.302 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:31:31.640 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:31:31.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:31:31.743 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:31:31.743 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:31:31.924 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:31:31.925 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:32:01.954 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:32:01.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:32:01.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:32:02.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:32:02.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:32:02.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:32:02.525 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:32:02.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:32:02.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:32:02.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:32:02.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:32:02.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:32:02.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:32:04.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:32:04.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:32:04.871 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:32:04.872 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:32:04.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:32:04.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:32:04.895 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:32:04.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:32:04.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:32:04.896 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:32:04.896 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:32:04.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:32:05.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:32:05.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:32:05.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:32:05.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:32:05.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:32:05.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:32:05.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:32:05.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:32:05.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:32:05.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:32:05.235 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:32:05.312 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:31:49
2026-06-03T11:32:05.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85913, datetime.datetime(2026, 6, 3, 11, 31, 49), datetime.datetime(2026, 6, 3, 11, 31, 48), 'salt', 7.17, 99.41, None, 40.22, 96.09, 0.08, 823.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:32:05.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:32:05.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:32:05.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:31:48, diff=17.320283s, valid=True
2026-06-03T11:32:05.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:32:05.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:32:05.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:32:12, diff=-6.67622s, valid=True
2026-06-03T11:32:05.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:32:05.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:32:05.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:31:46, diff=19.331962s, valid=True
2026-06-03T11:32:05.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:32:05.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:32:05.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:32:05.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:32:05.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:32:05.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:32:05.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:32:12, diff=-6.664327s, valid=True
2026-06-03T11:32:05.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:32:05.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:32:05.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:32:05.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53322.336473s, valid=False
2026-06-03T11:32:05.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:32:05.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:32:05.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:32:05.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:32:05.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:32:05.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:32:05.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:32:05.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:32:05.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:32:05.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:32:05.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:32:05.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:32:05.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:32:05.750 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:32:05.976 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:32:06.324 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:32:06.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:32:06.427 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:32:06.427 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:32:06.587 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:32:06.587 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:32:36.598 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:32:36.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:32:36.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:32:36.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:32:36.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:32:37.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:32:37.212 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:32:37.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:32:37.221 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:32:37.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:32:37.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:32:37.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:32:37.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:32:39.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:32:39.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:32:39.637 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:32:39.637 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:32:39.646 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:32:39.659 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:32:39.659 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:32:39.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:32:39.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:32:39.661 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:32:39.661 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:32:39.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:32:39.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:32:39.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:32:39.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:32:39.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:32:39.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:32:39.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:32:39.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:32:39.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:32:39.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:32:39.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:32:39.983 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:32:40.054 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:32:19
2026-06-03T11:32:40.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85914, datetime.datetime(2026, 6, 3, 11, 32, 19), datetime.datetime(2026, 6, 3, 11, 32, 18), 'salt', 7.07, 99.38, None, 40.19, 93.25, 0.08, 823.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:32:40.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:32:40.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:32:40.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:32:18, diff=22.061816s, valid=True
2026-06-03T11:32:40.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:32:40.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:32:40.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:32:12, diff=28.065295s, valid=True
2026-06-03T11:32:40.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:32:40.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:32:40.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:32:17, diff=23.073497s, valid=True
2026-06-03T11:32:40.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:32:40.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:32:40.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:32:40.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:32:40.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:32:40.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:32:40.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:32:12, diff=28.077252s, valid=True
2026-06-03T11:32:40.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:32:40.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:32:40.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:32:40.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53357.078068s, valid=False
2026-06-03T11:32:40.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:32:40.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:32:40.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:32:40.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:32:40.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:32:40.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:32:40.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:32:40.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:32:40.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:32:40.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:32:40.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:32:40.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:32:40.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:32:40.401 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:32:40.606 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:32:40.945 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:32:41.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:32:41.048 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:32:41.048 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:32:41.265 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:32:41.265 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:33:11.291 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:33:11.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:33:11.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:33:11.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:33:11.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:33:11.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:33:11.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:33:11.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:33:11.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:33:11.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:33:11.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:33:11.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:33:11.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:33:14.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:33:14.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:33:14.566 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:33:14.566 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:33:14.576 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:33:14.589 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:33:14.590 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:33:14.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:33:14.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:33:14.591 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:33:14.591 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:33:14.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:33:14.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:33:14.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:33:14.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:33:14.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:33:14.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:33:14.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:33:14.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:33:14.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:33:14.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:33:14.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:33:14.924 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:33:14.994 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:32:49
2026-06-03T11:33:14.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85915, datetime.datetime(2026, 6, 3, 11, 32, 49), datetime.datetime(2026, 6, 3, 11, 32, 48), 'salt', 7.04, 99.31, None, 41.53, 97.64, 0.1, 823.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:33:14.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:33:14.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:33:15.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:32:48, diff=27.001848s, valid=True
2026-06-03T11:33:15.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:33:15.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:33:15.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:33:12, diff=3.005335s, valid=True
2026-06-03T11:33:15.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:33:15.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:33:15.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:32:47, diff=28.013446s, valid=True
2026-06-03T11:33:15.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:33:15.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:33:15.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:33:15.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:33:15.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:33:15.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:33:15.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:33:12, diff=3.01719s, valid=True
2026-06-03T11:33:15.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:33:15.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:33:15.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:33:15.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53392.018011s, valid=False
2026-06-03T11:33:15.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:33:15.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:33:15.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:33:15.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:33:15.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:33:15.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:33:15.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:33:15.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:33:15.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:33:15.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:33:15.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:33:15.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:33:15.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:33:15.408 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:33:15.615 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:33:15.957 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:33:16.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:33:16.060 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:33:16.060 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:33:16.130 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:33:16.130 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:33:46.160 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:33:46.160 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:33:46.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:33:46.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:33:46.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:33:46.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:33:46.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:33:46.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:33:46.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:33:46.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:33:46.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:33:46.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:33:46.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:33:49.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:33:49.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:33:49.235 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:33:49.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:33:49.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:33:49.257 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:33:49.257 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:33:49.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:33:49.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:33:49.258 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:33:49.259 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:33:49.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:33:49.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:33:49.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:33:49.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:33:49.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:33:49.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:33:49.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:33:49.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:33:49.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:33:49.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:33:49.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:33:49.590 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:33:49.656 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:33:20
2026-06-03T11:33:49.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85916, datetime.datetime(2026, 6, 3, 11, 33, 20), datetime.datetime(2026, 6, 3, 11, 33, 19), 'salt', 7.14, 99.44, None, 34.61, 97.05, 0.08, 823.58, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:33:49.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:33:49.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:33:49.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:33:19, diff=30.664151s, valid=True
2026-06-03T11:33:49.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:33:49.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:33:49.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:33:12, diff=37.667807s, valid=True
2026-06-03T11:33:49.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:33:49.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:33:49.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:33:18, diff=31.676326s, valid=True
2026-06-03T11:33:49.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:33:49.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:33:49.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:33:49.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:33:49.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:33:49.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:33:49.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:33:12, diff=37.680095s, valid=True
2026-06-03T11:33:49.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:33:49.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:33:49.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:33:49.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53426.680922s, valid=False
2026-06-03T11:33:49.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:33:49.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:33:49.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:33:49.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:33:49.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:33:49.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:33:49.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:33:49.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:33:49.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:33:49.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:33:49.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:33:49.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:33:49.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:33:50.018 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:33:50.247 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:33:50.586 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:33:50.689 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:33:50.689 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:33:50.689 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:33:50.843 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:33:50.843 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:34:20.932 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:34:20.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:34:20.933 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:34:21.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:34:21.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:34:21.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:34:21.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:34:21.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:34:21.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:34:21.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:34:21.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:34:21.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:34:21.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:34:24.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:34:24.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:34:24.177 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:34:24.178 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:34:24.187 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:34:24.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:34:24.201 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:34:24.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:34:24.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:34:24.202 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:34:24.203 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:34:24.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:34:24.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:34:24.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:34:24.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:34:24.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:34:24.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:34:24.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:34:24.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:34:24.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:34:24.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:34:24.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:34:24.530 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:34:24.602 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:34:20
2026-06-03T11:34:24.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85918, datetime.datetime(2026, 6, 3, 11, 34, 20), datetime.datetime(2026, 6, 3, 11, 34, 19), 'salt', 7.17, 99.41, None, 38.14, 93.84, 0.08, 823.58, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:34:24.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:34:24.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:34:24.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:34:19, diff=5.609579s, valid=True
2026-06-03T11:34:24.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:34:24.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:34:24.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:34:12, diff=12.61296s, valid=True
2026-06-03T11:34:24.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:34:24.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:34:24.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:34:18, diff=6.620874s, valid=True
2026-06-03T11:34:24.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:34:24.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:34:24.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:34:24.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:34:24.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:34:24.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:34:24.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:34:12, diff=12.624471s, valid=True
2026-06-03T11:34:24.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:34:24.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:34:24.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:34:24.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53461.625282s, valid=False
2026-06-03T11:34:24.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:34:24.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:34:24.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:34:24.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:34:24.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:34:24.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:34:24.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:34:24.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:34:24.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:34:24.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:34:24.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:34:24.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:34:24.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:34:25.012 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:34:25.219 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:34:25.563 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:34:25.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:34:25.666 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:34:25.666 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:34:25.868 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:34:25.868 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:34:55.897 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:34:55.897 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:34:55.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:34:56.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:34:56.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:34:56.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:34:56.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:34:56.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:34:56.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:34:56.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:34:56.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:34:56.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:34:56.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:34:58.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:34:58.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:34:58.923 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:34:58.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:34:58.934 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:34:58.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:34:58.948 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:34:58.948 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:34:58.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:34:58.949 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:34:58.949 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:34:58.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:34:59.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:34:59.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:34:59.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:34:59.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:34:59.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:34:59.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:34:59.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:34:59.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:34:59.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:34:59.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:34:59.291 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:34:59.363 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:34:50
2026-06-03T11:34:59.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85919, datetime.datetime(2026, 6, 3, 11, 34, 50), datetime.datetime(2026, 6, 3, 11, 34, 49), 'salt', 7.14, 99.41, None, 42.48, 98.72, 0.08, 823.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:34:59.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:34:59.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:34:59.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:34:49, diff=10.371147s, valid=True
2026-06-03T11:34:59.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:34:59.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:34:59.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:35:12, diff=-12.62525s, valid=True
2026-06-03T11:34:59.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:34:59.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:34:59.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:34:48, diff=11.383605s, valid=True
2026-06-03T11:34:59.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:34:59.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:34:59.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:34:59.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:34:59.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:34:59.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:34:59.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:35:12, diff=-12.612509s, valid=True
2026-06-03T11:34:59.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:34:59.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:34:59.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:34:59.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53496.388357s, valid=False
2026-06-03T11:34:59.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:34:59.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:34:59.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:34:59.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:34:59.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:34:59.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:34:59.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:34:59.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:34:59.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:34:59.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:34:59.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:34:59.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:34:59.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:34:59.712 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:34:59.924 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:35:00.274 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:35:00.377 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:35:00.378 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:35:00.378 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:35:00.576 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:35:00.577 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:35:30.607 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:35:30.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:35:30.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:35:30.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:35:30.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:35:31.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:35:31.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:35:31.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:35:31.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:35:31.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:35:31.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:35:31.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:35:31.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:35:33.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:35:33.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:35:33.645 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:35:33.645 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:35:33.654 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:35:33.667 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:35:33.667 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:35:33.668 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:35:33.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:35:33.668 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:35:33.669 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:35:33.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:35:33.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:35:33.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:35:33.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:35:33.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:35:33.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:35:33.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:35:34.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:35:34.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:35:34.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:35:34.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:35:34.008 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:35:34.081 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:35:20
2026-06-03T11:35:34.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85920, datetime.datetime(2026, 6, 3, 11, 35, 20), datetime.datetime(2026, 6, 3, 11, 35, 20), 'salt', 7.07, 99.31, None, 42.27, 96.94, 0.09, 823.76, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:35:34.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:35:34.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:35:34.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:35:20, diff=14.088809s, valid=True
2026-06-03T11:35:34.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:35:34.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:35:34.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:35:12, diff=22.092294s, valid=True
2026-06-03T11:35:34.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:35:34.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:35:34.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:35:18, diff=16.100501s, valid=True
2026-06-03T11:35:34.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:35:34.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:35:34.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:35:34.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:35:34.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:35:34.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:35:34.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:35:12, diff=22.104245s, valid=True
2026-06-03T11:35:34.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:35:34.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:35:34.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:35:34.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53531.10507s, valid=False
2026-06-03T11:35:34.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:35:34.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:35:34.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:35:34.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:35:34.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:35:34.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:35:34.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:35:34.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:35:34.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:35:34.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:35:34.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:35:34.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:35:34.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:35:34.426 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:35:34.639 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:35:34.983 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:35:35.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:35:35.086 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:35:35.086 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:35:35.326 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:35:35.326 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:36:05.327 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:36:05.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:36:05.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:36:05.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:36:05.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:36:05.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:36:05.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:36:05.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:36:05.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:36:05.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:36:05.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:36:05.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:36:05.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:36:08.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:36:08.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:36:08.481 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:36:08.481 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:36:08.491 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:36:08.504 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:36:08.504 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:36:08.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:36:08.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:36:08.506 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:36:08.506 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:36:08.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:36:08.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:36:08.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:36:08.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:36:08.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:36:08.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:36:08.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:36:08.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:36:08.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:36:08.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:36:08.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:36:08.837 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:36:08.909 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:35:51
2026-06-03T11:36:08.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85921, datetime.datetime(2026, 6, 3, 11, 35, 51), datetime.datetime(2026, 6, 3, 11, 35, 50), 'salt', 7.14, 99.38, None, 33.17, 102.19, 0.09, 823.82, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:36:08.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:36:08.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:36:08.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:35:50, diff=18.916448s, valid=True
2026-06-03T11:36:08.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:36:08.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:36:08.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:36:12, diff=-3.080085s, valid=True
2026-06-03T11:36:08.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:36:08.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:36:08.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:35:48, diff=20.928115s, valid=True
2026-06-03T11:36:08.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:36:08.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:36:08.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:36:08.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:36:08.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:36:08.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:36:08.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:36:12, diff=-3.068153s, valid=True
2026-06-03T11:36:08.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:36:08.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:36:08.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:36:08.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53565.932699s, valid=False
2026-06-03T11:36:08.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:36:08.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:36:08.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:36:08.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:36:08.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:36:08.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:36:09.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:36:09.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:36:09.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:36:09.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:36:09.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:36:09.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:36:09.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:36:09.254 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:36:09.462 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:36:09.801 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:36:09.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:36:09.909 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:36:09.909 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:36:10.077 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:36:10.077 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:36:40.106 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:36:40.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:36:40.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:36:40.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:36:40.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:36:40.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:36:40.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:36:40.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:36:40.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:36:40.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:36:40.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:36:40.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:36:40.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:36:43.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:36:43.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:36:43.200 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:36:43.200 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:36:43.209 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:36:43.222 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:36:43.223 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:36:43.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:36:43.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:36:43.224 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:36:43.224 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:36:43.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:36:43.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:36:43.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:36:43.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:36:43.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:36:43.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:36:43.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:36:43.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:36:43.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:36:43.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:36:43.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:36:43.570 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:36:43.643 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:36:21
2026-06-03T11:36:43.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85922, datetime.datetime(2026, 6, 3, 11, 36, 21), datetime.datetime(2026, 6, 3, 11, 36, 20), 'salt', 7.17, 99.38, None, 42.69, 99.02, 0.08, 823.58, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:36:43.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:36:43.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:36:43.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:36:20, diff=23.656324s, valid=True
2026-06-03T11:36:43.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:36:43.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:36:43.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:36:12, diff=31.663897s, valid=True
2026-06-03T11:36:43.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:36:43.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:36:43.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:36:19, diff=24.674928s, valid=True
2026-06-03T11:36:43.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:36:43.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:36:43.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:36:43.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:36:43.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:36:43.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:36:43.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:36:12, diff=31.678731s, valid=True
2026-06-03T11:36:43.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:36:43.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:36:43.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:36:43.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53600.679517s, valid=False
2026-06-03T11:36:43.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:36:43.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:36:43.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:36:43.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:36:43.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:36:43.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:36:43.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:36:43.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:36:43.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:36:43.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:36:43.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:36:44.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:36:44.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:36:44.095 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:36:44.303 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:36:44.644 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:36:44.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:36:44.748 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:36:44.748 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:36:44.952 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:36:44.952 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:37:14.983 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:37:14.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:37:14.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:37:15.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:37:15.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:37:15.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:37:15.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:37:15.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:37:15.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:37:15.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:37:15.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:37:15.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:37:15.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:37:17.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:37:17.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:37:17.701 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:37:17.701 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:37:17.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:37:17.725 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:37:17.725 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:37:17.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:37:17.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:37:17.726 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:37:17.727 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:37:17.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:37:17.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:37:17.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:37:17.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:37:17.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:37:18.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:37:18.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:37:18.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:37:18.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:37:18.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:37:18.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:37:18.059 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:37:18.128 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:36:51
2026-06-03T11:37:18.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85923, datetime.datetime(2026, 6, 3, 11, 36, 51), datetime.datetime(2026, 6, 3, 11, 36, 50), 'salt', 6.97, 99.41, None, 36.84, 103.58, 0.08, 823.58, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:37:18.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:37:18.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:37:18.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:36:50, diff=28.13461s, valid=True
2026-06-03T11:37:18.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:37:18.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:37:18.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:37:12, diff=6.137425s, valid=True
2026-06-03T11:37:18.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:37:18.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:37:18.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:36:49, diff=29.143964s, valid=True
2026-06-03T11:37:18.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:37:18.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:37:18.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:37:18.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:37:18.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:37:18.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:37:18.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:37:12, diff=6.146944s, valid=True
2026-06-03T11:37:18.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:37:18.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:37:18.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:37:18.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53635.147592s, valid=False
2026-06-03T11:37:18.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:37:18.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:37:18.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:37:18.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:37:18.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:37:18.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:37:18.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:37:18.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:37:18.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:37:18.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:37:18.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:37:18.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:37:18.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:37:18.463 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:37:18.720 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:37:19.054 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:37:19.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:37:19.155 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:37:19.155 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:37:20.297 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:37:20.297 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:37:50.302 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:37:50.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:37:50.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:37:50.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:37:50.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:37:50.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:37:50.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:37:50.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:37:50.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:37:50.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:37:50.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:37:50.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:37:50.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:37:53.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:37:53.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:37:53.373 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:37:53.373 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:37:53.381 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:37:53.393 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:37:53.394 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:37:53.395 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:37:53.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:37:53.395 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:37:53.396 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:37:53.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:37:53.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:37:53.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:37:53.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:37:53.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:37:53.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:37:53.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:37:53.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:37:53.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:37:53.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:37:53.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:37:53.735 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:37:53.806 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:37:52
2026-06-03T11:37:53.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85925, datetime.datetime(2026, 6, 3, 11, 37, 52), datetime.datetime(2026, 6, 3, 11, 37, 51), 'salt', 7.1, 99.44, None, 35.39, 99.52, 0.07, 823.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:37:53.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:37:53.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:37:53.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:37:51, diff=2.813936s, valid=True
2026-06-03T11:37:53.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:37:53.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:37:53.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:38:12, diff=-18.182591s, valid=True
2026-06-03T11:37:53.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:37:53.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:37:53.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:37:50, diff=3.825647s, valid=True
2026-06-03T11:37:53.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:37:53.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:37:53.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:37:53.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:37:53.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:37:53.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:37:53.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:38:12, diff=-18.170661s, valid=True
2026-06-03T11:37:53.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:37:53.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:37:53.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:37:53.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53670.830152s, valid=False
2026-06-03T11:37:53.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:37:53.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:37:53.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:37:53.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:37:53.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:37:53.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:37:53.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:37:53.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:37:53.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:37:53.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:37:54.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:37:54.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:37:54.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:37:54.149 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:37:54.349 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:37:54.681 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:37:54.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:37:54.782 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:37:54.782 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:37:54.974 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:37:54.974 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:38:24.990 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:38:24.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:38:24.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:38:25.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:38:25.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:38:25.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:38:25.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:38:25.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:38:25.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:38:25.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:38:25.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:38:25.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:38:25.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:38:27.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:38:27.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:38:27.999 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:38:28.000 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:38:28.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:38:28.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:38:28.023 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:38:28.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:38:28.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:38:28.024 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:38:28.024 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:38:28.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:38:28.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:38:28.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:38:28.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:38:28.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:38:28.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:38:28.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:38:28.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:38:28.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:38:28.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:38:28.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:38:28.357 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:38:28.427 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:38:22
2026-06-03T11:38:28.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85926, datetime.datetime(2026, 6, 3, 11, 38, 22), datetime.datetime(2026, 6, 3, 11, 38, 21), 'salt', 7.1, 99.44, None, 40.96, 111.72, 0.07, 823.58, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:38:28.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:38:28.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:38:28.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:38:21, diff=7.435104s, valid=True
2026-06-03T11:38:28.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:38:28.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:38:28.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:38:12, diff=16.438632s, valid=True
2026-06-03T11:38:28.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:38:28.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:38:28.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:38:22, diff=6.446817s, valid=True
2026-06-03T11:38:28.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:38:28.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:38:28.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:38:28.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:38:28.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:38:28.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:38:28.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:38:12, diff=16.45059s, valid=True
2026-06-03T11:38:28.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:38:28.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:38:28.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:38:28.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53705.4514s, valid=False
2026-06-03T11:38:28.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:38:28.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:38:28.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:38:28.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:38:28.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:38:28.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:38:28.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:38:28.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:38:28.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:38:28.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:38:28.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:38:28.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:38:28.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:38:28.844 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:38:29.042 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:38:29.373 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:38:29.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:38:29.471 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:38:29.471 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:38:29.636 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:38:29.637 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:38:59.667 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:38:59.667 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:38:59.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:38:59.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:38:59.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:39:00.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:39:00.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:39:00.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:39:00.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:39:00.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:39:00.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:39:00.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:39:00.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:39:02.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:39:02.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:39:02.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:39:02.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:39:02.746 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:39:02.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:39:02.762 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:39:02.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:39:02.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:39:02.763 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:39:02.763 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:39:02.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:39:02.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:39:02.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:39:02.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:39:02.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:39:03.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:39:03.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:39:03.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:39:03.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:39:03.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:39:03.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:39:03.090 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:39:03.163 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:38:52
2026-06-03T11:39:03.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85927, datetime.datetime(2026, 6, 3, 11, 38, 52), datetime.datetime(2026, 6, 3, 11, 38, 51), 'salt', 7.14, 99.41, None, 36.98, 94.92, 0.08, 823.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:39:03.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:39:03.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:39:03.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:38:51, diff=12.170746s, valid=True
2026-06-03T11:39:03.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:39:03.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:39:03.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:39:12, diff=-8.825651s, valid=True
2026-06-03T11:39:03.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:39:03.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:39:03.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:38:50, diff=13.182571s, valid=True
2026-06-03T11:39:03.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:39:03.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:39:03.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:39:03.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:39:03.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:39:03.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:39:03.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:39:12, diff=-8.813642s, valid=True
2026-06-03T11:39:03.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:39:03.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:39:03.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:39:03.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53740.187177s, valid=False
2026-06-03T11:39:03.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:39:03.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:39:03.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:39:03.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:39:03.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:39:03.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:39:03.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:39:03.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:39:03.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:39:03.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:39:03.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:39:03.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:39:03.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:39:03.507 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:39:03.705 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:39:04.034 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:39:04.134 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:39:04.134 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:39:04.134 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:39:04.206 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:39:04.206 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:39:34.231 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:39:34.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:39:34.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:39:34.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:39:34.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:39:34.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:39:34.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:39:34.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:39:34.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:39:34.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:39:34.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:39:34.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:39:34.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:39:36.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:39:36.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:39:36.904 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:39:36.905 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:39:36.914 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:39:36.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:39:36.927 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:39:36.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:39:36.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:39:36.928 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:39:36.928 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:39:36.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:39:37.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:39:37.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:39:37.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:39:37.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:39:37.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:39:37.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:39:37.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:39:37.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:39:37.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:39:37.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:39:37.207 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:39:37.275 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:39:22
2026-06-03T11:39:37.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85928, datetime.datetime(2026, 6, 3, 11, 39, 22), datetime.datetime(2026, 6, 3, 11, 39, 22), 'salt', 7.2, 99.48, None, 36.73, 106.49, 0.07, 823.76, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:39:37.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:39:37.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:39:37.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:39:22, diff=15.281745s, valid=True
2026-06-03T11:39:37.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:39:37.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:39:37.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:39:12, diff=25.28456s, valid=True
2026-06-03T11:39:37.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:39:37.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:39:37.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:39:20, diff=17.29136s, valid=True
2026-06-03T11:39:37.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:39:37.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:39:37.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:39:37.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:39:37.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:39:37.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:39:37.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:39:12, diff=25.294449s, valid=True
2026-06-03T11:39:37.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:39:37.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:39:37.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:39:37.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53774.295122s, valid=False
2026-06-03T11:39:37.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:39:37.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:39:37.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:39:37.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:39:37.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:39:37.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:39:37.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:39:37.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:39:37.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:39:37.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:39:37.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:39:37.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:39:37.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:39:37.696 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:39:37.894 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:39:38.229 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:39:38.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:39:38.331 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:39:38.331 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:39:38.506 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:39:38.506 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:40:08.524 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:40:08.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:40:08.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:40:08.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:40:08.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:40:09.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:40:09.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:40:09.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:40:09.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:40:09.117 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:40:09.117 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:40:09.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:40:09.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:40:11.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:40:11.552 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:40:11.553 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:40:11.553 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:40:11.563 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:40:11.575 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:40:11.576 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:40:11.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:40:11.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:40:11.577 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:40:11.578 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:40:11.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:40:11.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:40:11.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:40:11.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:40:11.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:40:11.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:40:11.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:40:11.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:40:11.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:40:11.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:40:11.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:40:11.913 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:40:11.987 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:39:53
2026-06-03T11:40:11.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85929, datetime.datetime(2026, 6, 3, 11, 39, 53), datetime.datetime(2026, 6, 3, 11, 39, 52), 'salt', 7.04, 99.41, None, 36.48, 95.76, 0.08, 823.57, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:40:11.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:40:11.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:40:11.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:39:52, diff=19.993651s, valid=True
2026-06-03T11:40:11.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:40:11.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:40:11.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:40:12, diff=-0.003578s, valid=True
2026-06-03T11:40:11.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:40:11.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:40:12.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:39:50, diff=22.004154s, valid=True
2026-06-03T11:40:12.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:40:12.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:40:12.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:40:12.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:40:12.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:40:12.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:40:12.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:40:12, diff=0.007895s, valid=True
2026-06-03T11:40:12.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:40:12.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:40:12.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:40:12.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53809.008725s, valid=False
2026-06-03T11:40:12.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:40:12.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:40:12.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:40:12.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:40:12.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:40:12.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:40:12.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:40:12.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:40:12.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:40:12.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:40:12.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:40:12.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:40:12.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:40:12.334 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:40:12.534 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:40:12.867 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:40:12.969 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:40:12.969 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:40:12.969 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:40:13.215 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:40:13.215 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:40:43.230 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:40:43.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:40:43.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:40:43.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:40:43.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:40:43.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:40:43.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:40:43.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:40:43.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:40:43.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:40:43.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:40:43.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:40:43.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:40:46.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:40:46.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:40:46.269 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:40:46.269 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:40:46.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:40:46.291 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:40:46.291 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:40:46.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:40:46.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:40:46.292 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:40:46.293 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:40:46.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:40:46.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:40:46.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:40:46.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:40:46.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:40:46.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:40:46.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:40:46.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:40:46.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:40:46.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:40:46.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:40:46.624 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:40:46.693 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:40:23
2026-06-03T11:40:46.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85930, datetime.datetime(2026, 6, 3, 11, 40, 23), datetime.datetime(2026, 6, 3, 11, 40, 22), 'salt', 7.2, 99.44, None, 34.3, 99.0, 0.07, 823.57, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:40:46.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:40:46.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:40:46.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:40:22, diff=24.701342s, valid=True
2026-06-03T11:40:46.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:40:46.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:40:46.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:40:12, diff=34.704855s, valid=True
2026-06-03T11:40:46.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:40:46.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:40:46.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:40:20, diff=26.713101s, valid=True
2026-06-03T11:40:46.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:40:46.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:40:46.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:40:46.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:40:46.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:40:46.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:40:46.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:40:12, diff=34.716839s, valid=True
2026-06-03T11:40:46.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:40:46.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:40:46.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:40:46.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53843.717671s, valid=False
2026-06-03T11:40:46.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:40:46.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:40:46.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:40:46.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:40:46.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:40:46.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:40:46.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:40:46.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:40:46.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:40:46.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:40:46.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:40:47.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:40:47.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:40:47.107 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:40:47.308 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:40:47.644 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:40:47.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:40:47.747 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:40:47.747 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:40:47.818 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:40:47.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:41:17.833 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:41:17.833 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:41:17.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:41:17.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:41:17.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:41:18.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:41:18.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:41:18.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:41:18.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:41:18.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:41:18.244 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:41:18.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:41:18.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:41:20.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:41:20.901 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:41:20.902 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:41:20.902 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:41:20.912 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:41:20.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:41:20.925 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:41:20.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:41:20.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:41:20.926 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:41:20.926 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:41:20.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:41:21.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:41:21.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:41:21.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:41:21.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:41:21.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:41:21.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:41:21.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:41:21.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:41:21.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:41:21.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:41:21.258 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:41:21.329 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:40:53
2026-06-03T11:41:21.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85931, datetime.datetime(2026, 6, 3, 11, 40, 53), datetime.datetime(2026, 6, 3, 11, 40, 52), 'salt', 7.2, 99.44, None, 33.31, 102.45, 0.07, 823.58, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:41:21.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:41:21.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:41:21.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:40:52, diff=29.336936s, valid=True
2026-06-03T11:41:21.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:41:21.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:41:21.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:41:12, diff=9.340413s, valid=True
2026-06-03T11:41:21.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:41:21.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:41:21.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:40:51, diff=30.348482s, valid=True
2026-06-03T11:41:21.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:41:21.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:41:21.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:41:21.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:41:21.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:41:21.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:41:21.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:41:12, diff=9.352242s, valid=True
2026-06-03T11:41:21.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:41:21.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:41:21.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:41:21.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53878.353077s, valid=False
2026-06-03T11:41:21.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:41:21.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:41:21.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:41:21.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:41:21.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:41:21.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:41:21.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:41:21.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:41:21.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:41:21.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:41:21.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:41:21.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:41:21.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:41:21.676 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:41:21.874 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:41:22.208 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:41:22.310 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:41:22.310 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:41:22.310 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:41:22.381 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:41:22.381 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:41:52.395 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:41:52.395 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:41:52.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:41:52.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:41:52.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:41:52.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:41:52.849 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:41:52.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:41:52.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:41:52.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:41:52.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:41:52.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:41:52.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:41:55.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:41:55.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:41:55.674 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:41:55.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:41:55.684 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:41:55.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:41:55.698 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:41:55.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:41:55.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:41:55.699 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:41:55.699 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:41:55.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:41:55.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:41:55.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:41:55.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:41:55.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:41:55.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:41:55.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:41:56.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:41:56.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:41:56.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:41:56.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:41:56.019 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:41:56.088 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:41:54
2026-06-03T11:41:56.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85933, datetime.datetime(2026, 6, 3, 11, 41, 54), datetime.datetime(2026, 6, 3, 11, 41, 53), 'salt', 7.17, 99.48, None, 37.05, 102.52, 0.07, 823.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:41:56.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:41:56.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:41:56.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:41:53, diff=3.096054s, valid=True
2026-06-03T11:41:56.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:41:56.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:41:56.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:42:12, diff=-15.900628s, valid=True
2026-06-03T11:41:56.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:41:56.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:41:56.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:41:51, diff=5.107364s, valid=True
2026-06-03T11:41:56.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:41:56.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:41:56.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:41:56.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:41:56.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:41:56.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:41:56.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:42:12, diff=-15.889068s, valid=True
2026-06-03T11:41:56.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:41:56.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:41:56.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:41:56.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53913.111713s, valid=False
2026-06-03T11:41:56.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:41:56.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:41:56.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:41:56.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:41:56.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:41:56.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:41:56.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:41:56.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:41:56.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:41:56.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:41:56.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:41:56.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:41:56.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:41:56.432 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:41:56.631 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:41:56.965 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:41:57.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:41:57.073 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:41:57.073 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:41:57.238 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:41:57.238 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:42:27.268 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:42:27.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:42:27.268 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:42:27.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:42:27.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:42:27.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:42:27.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:42:27.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:42:27.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:42:27.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:42:27.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:42:27.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:42:27.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:42:30.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:42:30.686 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:42:30.686 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:42:30.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:42:30.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:42:30.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:42:30.710 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:42:30.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:42:30.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:42:30.711 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:42:30.711 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:42:30.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:42:30.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:42:30.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:42:30.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:42:30.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:42:31.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:42:31.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:42:31.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:42:31.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:42:31.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:42:31.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:42:31.048 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:42:31.118 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:42:24
2026-06-03T11:42:31.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85934, datetime.datetime(2026, 6, 3, 11, 42, 24), datetime.datetime(2026, 6, 3, 11, 42, 23), 'salt', 7.17, 99.44, None, 32.96, 98.6, 0.08, 823.76, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:42:31.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:42:31.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:42:31.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:42:23, diff=8.125804s, valid=True
2026-06-03T11:42:31.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:42:31.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:42:31.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:42:12, diff=19.129271s, valid=True
2026-06-03T11:42:31.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:42:31.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:42:31.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:42:23, diff=8.137517s, valid=True
2026-06-03T11:42:31.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:42:31.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:42:31.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:42:31.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:42:31.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:42:31.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:42:31.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:42:12, diff=19.141256s, valid=True
2026-06-03T11:42:31.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:42:31.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:42:31.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:42:31.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53948.14207s, valid=False
2026-06-03T11:42:31.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:42:31.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:42:31.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:42:31.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:42:31.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:42:31.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:42:31.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:42:31.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:42:31.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:42:31.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:42:31.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:42:31.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:42:31.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:42:31.469 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:42:31.667 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:42:32.000 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:42:32.160 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:42:32.160 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:42:32.160 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:42:32.409 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:42:32.410 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:43:02.439 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:43:02.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:43:02.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:43:02.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:43:02.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:43:02.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:43:02.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:43:02.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:43:02.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:43:02.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:43:02.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:43:02.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:43:02.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:43:05.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:43:05.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:43:05.415 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:43:05.415 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:43:05.426 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:43:05.438 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:43:05.439 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:43:05.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:43:05.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:43:05.440 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:43:05.440 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:43:05.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:43:05.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:43:05.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:43:05.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:43:05.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:43:05.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:43:05.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:43:05.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:43:05.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:43:05.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:43:05.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:43:05.788 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:43:05.875 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:42:54
2026-06-03T11:43:05.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85935, datetime.datetime(2026, 6, 3, 11, 42, 54), datetime.datetime(2026, 6, 3, 11, 42, 53), 'salt', 7.2, 99.51, None, 37.89, 94.87, 0.06, 823.76, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:43:05.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:43:05.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:43:05.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:42:53, diff=12.882821s, valid=True
2026-06-03T11:43:05.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:43:05.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:43:05.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:43:12, diff=-6.113663s, valid=True
2026-06-03T11:43:05.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:43:05.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:43:05.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:42:51, diff=14.894583s, valid=True
2026-06-03T11:43:05.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:43:05.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:43:05.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:43:05.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:43:05.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:43:05.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:43:05.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:43:12, diff=-6.101687s, valid=True
2026-06-03T11:43:05.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:43:05.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:43:05.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:43:05.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=53982.899144s, valid=False
2026-06-03T11:43:05.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:43:05.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:43:05.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:43:05.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:43:05.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:43:05.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:43:05.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:43:05.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:43:05.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:43:06.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:43:06.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:43:06.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:43:06.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:43:06.222 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:43:06.423 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:43:06.758 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:43:06.860 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:43:06.860 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:43:06.860 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:43:07.011 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:43:07.011 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:43:37.041 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:43:37.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:43:37.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:43:37.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:43:37.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:43:37.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:43:37.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:43:37.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:43:37.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:43:37.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:43:37.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:43:37.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:43:37.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:43:40.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:43:40.058 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:43:40.059 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:43:40.059 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:43:40.067 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:43:40.078 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:43:40.079 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:43:40.079 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:43:40.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:43:40.079 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:43:40.079 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:43:40.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:43:40.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:43:40.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:43:40.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:43:40.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:43:40.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:43:40.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:43:40.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:43:40.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:43:40.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:43:40.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:43:40.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:43:40.457 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:43:24
2026-06-03T11:43:40.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85936, datetime.datetime(2026, 6, 3, 11, 43, 24), datetime.datetime(2026, 6, 3, 11, 43, 24), 'salt', 7.1, 99.41, None, 37.33, 104.8, 0.08, 823.76, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:43:40.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:43:40.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:43:40.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:43:24, diff=16.46494s, valid=True
2026-06-03T11:43:40.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:43:40.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:43:40.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:43:12, diff=28.468336s, valid=True
2026-06-03T11:43:40.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:43:40.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:43:40.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:43:22, diff=18.476199s, valid=True
2026-06-03T11:43:40.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:43:40.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:43:40.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:43:40.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:43:40.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:43:40.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:43:40.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:43:12, diff=28.479803s, valid=True
2026-06-03T11:43:40.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:43:40.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:43:40.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:43:40.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54017.480568s, valid=False
2026-06-03T11:43:40.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:43:40.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:43:40.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:43:40.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:43:40.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:43:40.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:43:40.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:43:40.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:43:40.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:43:40.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:43:40.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:43:40.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:43:40.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:43:40.798 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:43:41.067 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:43:41.396 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:43:41.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:43:41.495 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:43:41.495 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:43:41.664 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:43:41.664 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:44:11.694 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:44:11.694 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:44:11.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:44:11.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:44:12.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:44:12.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:44:12.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:44:12.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:44:12.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:44:12.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:44:12.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:44:12.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:44:12.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:44:14.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:44:14.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:44:14.904 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:44:14.905 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:44:14.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:44:14.928 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:44:14.928 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:44:14.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:44:14.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:44:14.929 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:44:14.930 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:44:14.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:44:15.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:44:15.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:44:15.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:44:15.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:44:15.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:44:15.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:44:15.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:44:15.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:44:15.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:44:15.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:44:15.263 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:44:15.338 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:43:55
2026-06-03T11:44:15.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85937, datetime.datetime(2026, 6, 3, 11, 43, 55), datetime.datetime(2026, 6, 3, 11, 43, 54), 'salt', 7.07, 99.51, None, 32.43, 110.18, 0.06, 823.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:44:15.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:44:15.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:44:15.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:43:54, diff=21.345445s, valid=True
2026-06-03T11:44:15.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:44:15.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:44:15.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:44:12, diff=3.348945s, valid=True
2026-06-03T11:44:15.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:44:15.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:44:15.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:43:52, diff=23.357144s, valid=True
2026-06-03T11:44:15.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:44:15.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:44:15.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:44:15.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:44:15.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:44:15.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:44:15.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:44:12, diff=3.360881s, valid=True
2026-06-03T11:44:15.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:44:15.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:44:15.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:44:15.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54052.361691s, valid=False
2026-06-03T11:44:15.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:44:15.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:44:15.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:44:15.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:44:15.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:44:15.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:44:15.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:44:15.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:44:15.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:44:15.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:44:15.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:44:15.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:44:15.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:44:15.682 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:44:15.878 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:44:16.205 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:44:16.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:44:16.302 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:44:16.302 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:44:16.571 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:44:16.571 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:44:46.573 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:44:46.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:44:46.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:44:46.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:44:46.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:44:47.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:44:47.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:44:47.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:44:47.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:44:47.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:44:47.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:44:47.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:44:47.163 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:44:49.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:44:49.780 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:44:49.781 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:44:49.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:44:49.790 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:44:49.803 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:44:49.803 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:44:49.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:44:49.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:44:49.804 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:44:49.805 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:44:49.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:44:49.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:44:49.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:44:50.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:44:50.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:44:50.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:44:50.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:44:50.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:44:50.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:44:50.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:44:50.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:44:50.098 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:44:50.171 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:44:25
2026-06-03T11:44:50.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85938, datetime.datetime(2026, 6, 3, 11, 44, 25), datetime.datetime(2026, 6, 3, 11, 44, 24), 'salt', 7.07, 99.41, None, 39.76, 107.08, 0.08, 823.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:44:50.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:44:50.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:44:50.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:44:24, diff=26.177999s, valid=True
2026-06-03T11:44:50.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:44:50.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:44:50.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:44:12, diff=38.181236s, valid=True
2026-06-03T11:44:50.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:44:50.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:44:50.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:44:22, diff=28.188629s, valid=True
2026-06-03T11:44:50.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:44:50.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:44:50.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:44:50.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:44:50.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:44:50.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:44:50.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:44:12, diff=38.192075s, valid=True
2026-06-03T11:44:50.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:44:50.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:44:50.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:44:50.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54087.19282s, valid=False
2026-06-03T11:44:50.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:44:50.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:44:50.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:44:50.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:44:50.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:44:50.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:44:50.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:44:50.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:44:50.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:44:50.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:44:50.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:44:50.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:44:50.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:44:50.581 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:44:50.776 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:44:51.106 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:44:51.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:44:51.206 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:44:51.206 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:44:51.407 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:44:51.408 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:45:21.413 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:45:21.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:45:21.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:45:21.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:45:21.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:45:21.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:45:21.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:45:21.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:45:21.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:45:21.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:45:21.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:45:21.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:45:21.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:45:24.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:45:24.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:45:24.517 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:45:24.517 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:45:24.527 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:45:24.540 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:45:24.541 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:45:24.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:45:24.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:45:24.542 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:45:24.542 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:45:24.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:45:24.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:45:24.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:45:24.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:45:24.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:45:24.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:45:24.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:45:24.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:45:24.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:45:24.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:45:24.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:45:24.886 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:45:24.960 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:44:55
2026-06-03T11:45:24.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85939, datetime.datetime(2026, 6, 3, 11, 44, 55), datetime.datetime(2026, 6, 3, 11, 44, 55), 'salt', 7.04, 99.48, None, 39.27, 113.51, 0.07, 823.45, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:45:24.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:45:24.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:45:24.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:44:55, diff=29.967008s, valid=True
2026-06-03T11:45:24.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:45:24.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:45:24.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:45:12, diff=12.970289s, valid=True
2026-06-03T11:45:24.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:45:24.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:45:24.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:44:52, diff=32.978083s, valid=True
2026-06-03T11:45:24.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:45:24.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:45:24.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:45:24.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:45:24.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:45:24.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:45:24.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:45:12, diff=12.981698s, valid=True
2026-06-03T11:45:24.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:45:24.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:45:24.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:45:24.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54121.982474s, valid=False
2026-06-03T11:45:24.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:45:24.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:45:24.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:45:24.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:45:24.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:45:25.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:45:25.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:45:25.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:45:25.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:45:25.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:45:25.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:45:25.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:45:25.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:45:25.301 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:45:25.500 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:45:25.832 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:45:25.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:45:25.932 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:45:25.932 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:45:26.106 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:45:26.106 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:45:56.121 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:45:56.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:45:56.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:45:56.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:45:56.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:45:56.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:45:56.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:45:56.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:45:56.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:45:56.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:45:56.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:45:56.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:45:56.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:45:59.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:45:59.165 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:45:59.166 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:45:59.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:45:59.176 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:45:59.189 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:45:59.189 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:45:59.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:45:59.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:45:59.191 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:45:59.191 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:45:59.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:45:59.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:45:59.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:45:59.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:45:59.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:45:59.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:45:59.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:45:59.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:45:59.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:45:59.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:45:59.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:45:59.536 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:45:59.605 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:45:56
2026-06-03T11:45:59.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85941, datetime.datetime(2026, 6, 3, 11, 45, 56), datetime.datetime(2026, 6, 3, 11, 45, 55), 'salt', 7.04, 99.44, None, 45.23, 105.64, 0.08, 823.58, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T11:45:59.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:45:59.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:45:59.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:45:55, diff=4.612799s, valid=True
2026-06-03T11:45:59.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:45:59.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:45:59.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:46:12, diff=-12.383722s, valid=True
2026-06-03T11:45:59.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:45:59.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:45:59.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:45:53, diff=6.624317s, valid=True
2026-06-03T11:45:59.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:45:59.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:45:59.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:45:59.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:45:59.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:45:59.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:45:59.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:46:12, diff=-12.371944s, valid=True
2026-06-03T11:45:59.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:45:59.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:45:59.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:45:59.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54156.628876s, valid=False
2026-06-03T11:45:59.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:45:59.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:45:59.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:45:59.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:45:59.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:45:59.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:45:59.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:45:59.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:45:59.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:45:59.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:45:59.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:45:59.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:45:59.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:46:00.041 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:46:00.247 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:46:00.582 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:46:00.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:46:00.684 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:46:00.684 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:46:00.966 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:46:00.967 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:46:30.997 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:46:30.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:46:30.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:46:31.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:46:31.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:46:31.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:46:31.387 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:46:31.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:46:31.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:46:31.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:46:31.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:46:31.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:46:31.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:46:34.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:46:34.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:46:34.054 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:46:34.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:46:34.064 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:46:34.077 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:46:34.077 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:46:34.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:46:34.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:46:34.079 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:46:34.079 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:46:34.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:46:34.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:46:34.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:46:34.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:46:34.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:46:34.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:46:34.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:46:34.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:46:34.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:46:34.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:46:34.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:46:34.417 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:46:34.486 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:46:26
2026-06-03T11:46:34.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85942, datetime.datetime(2026, 6, 3, 11, 46, 26), datetime.datetime(2026, 6, 3, 11, 46, 25), 'salt', 6.94, 99.38, None, 37.86, 101.65, 0.09, 823.58, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:46:34.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:46:34.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:46:34.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:46:25, diff=9.493257s, valid=True
2026-06-03T11:46:34.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:46:34.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:46:34.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:46:12, diff=22.496598s, valid=True
2026-06-03T11:46:34.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:46:34.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:46:34.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:46:24, diff=10.504546s, valid=True
2026-06-03T11:46:34.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:46:34.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:46:34.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:46:34.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:46:34.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:46:34.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:46:34.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:46:12, diff=22.508137s, valid=True
2026-06-03T11:46:34.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:46:34.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:46:34.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:46:34.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54191.508922s, valid=False
2026-06-03T11:46:34.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:46:34.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:46:34.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:46:34.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:46:34.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:46:34.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:46:34.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:46:34.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:46:34.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:46:34.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:46:34.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:46:34.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:46:34.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:46:34.837 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:46:35.035 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:46:35.375 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:46:35.476 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:46:35.476 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:46:35.476 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:46:35.549 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:46:35.549 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:47:05.567 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:47:05.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:47:05.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:47:05.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:47:05.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:47:06.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:47:06.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:47:06.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:47:06.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:47:06.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:47:06.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:47:06.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:47:06.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:47:08.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:47:08.671 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:47:08.672 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:47:08.672 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:47:08.682 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:47:08.695 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:47:08.696 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:47:08.696 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:47:08.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:47:08.697 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:47:08.697 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:47:08.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:47:08.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:47:08.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:47:08.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:47:08.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:47:08.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T11:47:08.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:47:09.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T11:47:09.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:47:09.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:47:09.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:47:09.102 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:47:09.174 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:46:56
2026-06-03T11:47:09.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85943, datetime.datetime(2026, 6, 3, 11, 46, 56), datetime.datetime(2026, 6, 3, 11, 46, 56), 'salt', 7.04, 99.48, None, 41.56, 113.37, 0.07, 823.57, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:47:09.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:47:09.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:47:09.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:46:56, diff=13.180846s, valid=True
2026-06-03T11:47:09.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:47:09.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T11:47:09.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:47:12, diff=-2.81629s, valid=True
2026-06-03T11:47:09.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:47:09.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:47:09.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:46:55, diff=14.190343s, valid=True
2026-06-03T11:47:09.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:47:09.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:47:09.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:47:09.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:47:09.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:47:09.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T11:47:09.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:47:12, diff=-2.806658s, valid=True
2026-06-03T11:47:09.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:47:09.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:47:09.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:47:09.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54226.194006s, valid=False
2026-06-03T11:47:09.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:47:09.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:47:09.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:47:09.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:47:09.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:47:09.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:47:09.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:47:09.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:47:09.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:47:09.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:47:09.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:47:09.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:47:09.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:47:09.509 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:47:09.708 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:47:10.059 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:47:10.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:47:10.164 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:47:10.164 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:47:10.232 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:47:10.232 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:47:40.248 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:47:40.248 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:47:40.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:47:40.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:47:40.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:47:40.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:47:40.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:47:40.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:47:40.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:47:40.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:47:40.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:47:40.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:47:40.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:47:43.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:47:43.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:47:43.495 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:47:43.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:47:43.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:47:43.518 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:47:43.519 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:47:43.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:47:43.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:47:43.520 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:47:43.520 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:47:43.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:47:43.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:47:43.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:47:43.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:47:43.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:47:43.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T11:47:43.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:47:43.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T11:47:43.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:47:43.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:47:43.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:47:43.870 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:47:43.939 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:47:27
2026-06-03T11:47:43.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85944, datetime.datetime(2026, 6, 3, 11, 47, 27), datetime.datetime(2026, 6, 3, 11, 47, 26), 'salt', 7.07, 99.48, None, 36.34, 105.9, 0.07, 823.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:47:43.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:47:43.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:47:43.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:47:26, diff=17.947315s, valid=True
2026-06-03T11:47:43.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:47:43.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T11:47:43.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:47:12, diff=31.95094s, valid=True
2026-06-03T11:47:43.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:47:43.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:47:43.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:47:23, diff=20.959289s, valid=True
2026-06-03T11:47:43.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:47:43.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:47:43.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:47:43.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:47:43.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:47:43.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T11:47:43.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:47:12, diff=31.963193s, valid=True
2026-06-03T11:47:43.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:47:43.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:47:43.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:47:43.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54260.964041s, valid=False
2026-06-03T11:47:43.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:47:43.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:47:43.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:47:43.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:47:43.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:47:44.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:47:44.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:47:44.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:47:44.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:47:44.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:47:44.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:47:44.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:47:44.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:47:44.288 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:47:44.486 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:47:44.818 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:47:44.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:47:44.919 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:47:44.919 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:47:45.087 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:47:45.087 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:48:15.097 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:48:15.098 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:48:15.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:48:15.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:48:15.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:48:15.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:48:15.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:48:15.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:48:15.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:48:15.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:48:15.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:48:15.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:48:15.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:48:18.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:48:18.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:48:18.262 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:48:18.262 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:48:18.272 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:48:18.284 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:48:18.285 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:48:18.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:48:18.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:48:18.286 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:48:18.287 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:48:18.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:48:18.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:48:18.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:48:18.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:48:18.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:48:18.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T11:48:18.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:48:18.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T11:48:18.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:48:18.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:48:18.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:48:18.657 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:48:18.728 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:47:57
2026-06-03T11:48:18.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85945, datetime.datetime(2026, 6, 3, 11, 47, 57), datetime.datetime(2026, 6, 3, 11, 47, 56), 'salt', 7.07, 99.44, None, 40.79, 103.67, 0.07, 823.63, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:48:18.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:48:18.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:48:18.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:47:56, diff=22.735077s, valid=True
2026-06-03T11:48:18.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:48:18.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T11:48:18.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:48:12, diff=6.738065s, valid=True
2026-06-03T11:48:18.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:48:18.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:48:18.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:47:54, diff=24.745774s, valid=True
2026-06-03T11:48:18.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:48:18.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:48:18.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:48:18.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:48:18.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:48:18.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T11:48:18.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:48:12, diff=6.749511s, valid=True
2026-06-03T11:48:18.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:48:18.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:48:18.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:48:18.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54295.750302s, valid=False
2026-06-03T11:48:18.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:48:18.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:48:18.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:48:18.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:48:18.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:48:18.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:48:18.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:48:18.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:48:18.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:48:18.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:48:18.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:48:18.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:48:19.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:48:19.098 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:48:19.295 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:48:19.631 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:48:19.731 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:48:19.731 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:48:19.731 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:48:19.961 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:48:19.961 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:48:49.991 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:48:49.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:48:49.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:48:50.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:48:50.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:48:50.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:48:50.353 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:48:50.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:48:50.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:48:50.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:48:50.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:48:50.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:48:50.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:48:53.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:48:53.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:48:53.021 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:48:53.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:48:53.031 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:48:53.044 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:48:53.044 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:48:53.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:48:53.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:48:53.045 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:48:53.045 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:48:53.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:48:53.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:48:53.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:48:53.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:48:53.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:48:53.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T11:48:53.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:48:53.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T11:48:53.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:48:53.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:48:53.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:48:53.351 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:48:53.421 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:48:27
2026-06-03T11:48:53.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85946, datetime.datetime(2026, 6, 3, 11, 48, 27), datetime.datetime(2026, 6, 3, 11, 48, 26), 'salt', 6.94, 99.44, None, 35.67, 105.72, 0.08, 823.57, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:48:53.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:48:53.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:48:53.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:48:26, diff=27.428305s, valid=True
2026-06-03T11:48:53.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:48:53.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T11:48:53.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:48:12, diff=41.431583s, valid=True
2026-06-03T11:48:53.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:48:53.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:48:53.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:48:24, diff=29.439198s, valid=True
2026-06-03T11:48:53.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:48:53.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:48:53.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:48:53.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:48:53.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:48:53.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T11:48:53.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:48:12, diff=41.442682s, valid=True
2026-06-03T11:48:53.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:48:53.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:48:53.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:48:53.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54330.443434s, valid=False
2026-06-03T11:48:53.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:48:53.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:48:53.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:48:53.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:48:53.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:48:53.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:48:53.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:48:53.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:48:53.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:48:53.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:48:53.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:48:53.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:48:53.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:48:53.769 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:48:53.967 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:48:54.296 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:48:54.457 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:48:54.457 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:48:54.457 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:48:54.621 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:48:54.622 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:49:24.641 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:49:24.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:49:24.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:49:24.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:49:24.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:49:25.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:49:25.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:49:25.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:49:25.221 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:49:25.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:49:25.230 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:49:25.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:49:25.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:49:27.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:49:27.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:49:27.955 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:49:27.955 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:49:27.966 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:49:27.978 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:49:27.979 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:49:27.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:49:27.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:49:27.980 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:49:27.980 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:49:27.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:49:28.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:49:28.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:49:28.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:49:28.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:49:28.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T11:49:28.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:49:28.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T11:49:28.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:49:28.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:49:28.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:49:28.357 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:49:28.427 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:49:28
2026-06-03T11:49:28.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85948, datetime.datetime(2026, 6, 3, 11, 49, 28), datetime.datetime(2026, 6, 3, 11, 49, 27), 'salt', 7.0, 99.48, None, 37.65, 104.99, 0.07, 823.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:49:28.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:49:28.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:49:28.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:49:27, diff=1.436291s, valid=True
2026-06-03T11:49:28.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:49:28.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T11:49:28.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:49:12, diff=16.439825s, valid=True
2026-06-03T11:49:28.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:49:28.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:49:28.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:49:24, diff=4.447987s, valid=True
2026-06-03T11:49:28.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:49:28.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:49:28.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:49:28.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:49:28.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:49:28.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T11:49:28.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:49:12, diff=16.453717s, valid=True
2026-06-03T11:49:28.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:49:28.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:49:28.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:49:28.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54365.454545s, valid=False
2026-06-03T11:49:28.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:49:28.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:49:28.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:49:28.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:49:28.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:49:28.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:49:28.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:49:28.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:49:28.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:49:28.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:49:28.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:49:28.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:49:28.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:49:28.789 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:49:28.992 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:49:29.331 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:49:29.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:49:29.433 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:49:29.433 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:49:29.671 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:49:29.671 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:49:59.696 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:49:59.696 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:49:59.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:49:59.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:49:59.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:50:00.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:50:00.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:50:00.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:50:00.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:50:00.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:50:00.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:50:00.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:50:00.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:50:02.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:50:02.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:50:02.819 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:50:02.819 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:50:02.830 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:50:02.843 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:50:02.844 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:50:02.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:50:02.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:50:02.845 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:50:02.845 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:50:02.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:50:02.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:50:02.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:50:03.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:50:03.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:50:03.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T11:50:03.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:50:03.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T11:50:03.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:50:03.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:50:03.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:50:03.183 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:50:03.253 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:49:58
2026-06-03T11:50:03.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85949, datetime.datetime(2026, 6, 3, 11, 49, 58), datetime.datetime(2026, 6, 3, 11, 49, 57), 'salt', 6.97, 99.38, None, 36.84, 105.01, 0.08, 823.57, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:50:03.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:50:03.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:50:03.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:49:57, diff=6.261031s, valid=True
2026-06-03T11:50:03.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:50:03.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T11:50:03.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:50:12, diff=-8.735436s, valid=True
2026-06-03T11:50:03.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:50:03.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:50:03.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:49:54, diff=9.272684s, valid=True
2026-06-03T11:50:03.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:50:03.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:50:03.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:50:03.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:50:03.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:50:03.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T11:50:03.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:50:12, diff=-8.723606s, valid=True
2026-06-03T11:50:03.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:50:03.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:50:03.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:50:03.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54400.277215s, valid=False
2026-06-03T11:50:03.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:50:03.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:50:03.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:50:03.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:50:03.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:50:03.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:50:03.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:50:03.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:50:03.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:50:03.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:50:03.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:50:03.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:50:03.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:50:03.613 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:50:03.884 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:50:04.214 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:50:04.314 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:50:04.314 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:50:04.314 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:50:04.507 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:50:04.507 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:50:34.537 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:50:34.537 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:50:34.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:50:34.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:50:34.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:50:35.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:50:35.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:50:35.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:50:35.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:50:35.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:50:35.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:50:35.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:50:35.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:50:37.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:50:37.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:50:37.879 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:50:37.879 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:50:37.889 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:50:37.902 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:50:37.902 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:50:37.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:50:37.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:50:37.903 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:50:37.904 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:50:37.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:50:38.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:50:38.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:50:38.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:50:38.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:50:38.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T11:50:38.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:50:38.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T11:50:38.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:50:38.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:50:38.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:50:38.232 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:50:38.305 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:50:28
2026-06-03T11:50:38.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85950, datetime.datetime(2026, 6, 3, 11, 50, 28), datetime.datetime(2026, 6, 3, 11, 50, 27), 'salt', 7.0, 99.48, None, 40.08, 95.97, 0.07, 823.45, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:50:38.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:50:38.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:50:38.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:50:27, diff=11.312944s, valid=True
2026-06-03T11:50:38.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:50:38.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T11:50:38.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:50:12, diff=26.316414s, valid=True
2026-06-03T11:50:38.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:50:38.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:50:38.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:50:25, diff=13.324447s, valid=True
2026-06-03T11:50:38.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:50:38.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:50:38.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:50:38.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:50:38.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:50:38.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T11:50:38.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:50:12, diff=26.3282s, valid=True
2026-06-03T11:50:38.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:50:38.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:50:38.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:50:38.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54435.329025s, valid=False
2026-06-03T11:50:38.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:50:38.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:50:38.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:50:38.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:50:38.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:50:38.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:50:38.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:50:38.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:50:38.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:50:38.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:50:38.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:50:38.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:50:38.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:50:38.649 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:50:38.854 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:50:39.193 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:50:39.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:50:39.294 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:50:39.295 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:50:39.450 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:50:39.451 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:51:09.458 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:51:09.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:51:09.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:51:09.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:51:09.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:51:09.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:51:09.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:51:09.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:51:09.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:51:09.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:51:09.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:51:09.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:51:09.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:51:12.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:51:12.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:51:12.868 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:51:12.868 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:51:12.879 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:51:12.892 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:51:12.892 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:51:12.893 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:51:12.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:51:12.894 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:51:12.894 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:51:12.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:51:13.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:51:13.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:51:13.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:51:13.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:51:13.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T11:51:13.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:51:13.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T11:51:13.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:51:13.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:51:13.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:51:13.227 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:51:13.298 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:50:58
2026-06-03T11:51:13.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85951, datetime.datetime(2026, 6, 3, 11, 50, 58), datetime.datetime(2026, 6, 3, 11, 50, 58), 'salt', 6.97, 99.41, None, 40.26, 100.03, 0.08, 823.51, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:51:13.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:51:13.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:51:13.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:50:58, diff=15.30563s, valid=True
2026-06-03T11:51:13.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:51:13.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T11:51:13.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:51:12, diff=1.309109s, valid=True
2026-06-03T11:51:13.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:51:13.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:51:13.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:50:56, diff=17.317364s, valid=True
2026-06-03T11:51:13.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:51:13.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:51:13.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:51:13.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:51:13.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:51:13.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T11:51:13.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:51:12, diff=1.321281s, valid=True
2026-06-03T11:51:13.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:51:13.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:51:13.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:51:13.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54470.322129s, valid=False
2026-06-03T11:51:13.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:51:13.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:51:13.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:51:13.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:51:13.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:51:13.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:51:13.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:51:13.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:51:13.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:51:13.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:51:13.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:51:13.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:51:13.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:51:13.711 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:51:13.915 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:51:14.256 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:51:14.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:51:14.360 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:51:14.360 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:51:14.526 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:51:14.526 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:51:44.556 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:51:44.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:51:44.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:51:45.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:51:45.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:51:45.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:51:45.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:51:45.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:51:45.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:51:45.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:51:45.310 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:51:45.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:51:45.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:51:47.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:51:47.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:51:47.989 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:51:47.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:51:48.000 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:51:48.012 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:51:48.013 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:51:48.013 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:51:48.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:51:48.014 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:51:48.014 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:51:48.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:51:48.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:51:48.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:51:48.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:51:48.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:51:48.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T11:51:48.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:51:48.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T11:51:48.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:51:48.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:51:48.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:51:48.354 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:51:48.425 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:51:29
2026-06-03T11:51:48.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85952, datetime.datetime(2026, 6, 3, 11, 51, 29), datetime.datetime(2026, 6, 3, 11, 51, 28), 'salt', 6.97, 99.48, None, 41.32, 90.27, 0.07, 823.39, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:51:48.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:51:48.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:51:48.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:51:28, diff=20.432982s, valid=True
2026-06-03T11:51:48.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:51:48.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T11:51:48.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:51:12, diff=36.436489s, valid=True
2026-06-03T11:51:48.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:51:48.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:51:48.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:51:27, diff=21.444663s, valid=True
2026-06-03T11:51:48.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:51:48.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:51:48.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:51:48.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:51:48.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:51:48.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T11:51:48.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:51:12, diff=36.448404s, valid=True
2026-06-03T11:51:48.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:51:48.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:51:48.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:51:48.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54505.449231s, valid=False
2026-06-03T11:51:48.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:51:48.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:51:48.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:51:48.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:51:48.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:51:48.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:51:48.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:51:48.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:51:48.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:51:48.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:51:48.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:51:48.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:51:48.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:51:48.773 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:51:48.980 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:51:49.320 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:51:49.425 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:51:49.425 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:51:49.425 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:51:49.665 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:51:49.665 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:52:19.676 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:52:19.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:52:19.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:52:19.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:52:19.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:52:20.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:52:20.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:52:20.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:52:20.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:52:20.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:52:20.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:52:20.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:52:20.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:52:22.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:52:22.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:52:22.770 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:52:22.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:52:22.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:52:22.794 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:52:22.795 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:52:22.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:52:22.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:52:22.796 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:52:22.796 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:52:22.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:52:22.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:52:22.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:52:23.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:52:23.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:52:23.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T11:52:23.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:52:23.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T11:52:23.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:52:23.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:52:23.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:52:23.138 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:52:23.208 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:51:59
2026-06-03T11:52:23.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85953, datetime.datetime(2026, 6, 3, 11, 51, 59), datetime.datetime(2026, 6, 3, 11, 51, 58), 'salt', 7.04, 99.51, None, 38.11, 100.69, 0.07, 823.45, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:52:23.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:52:23.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:52:23.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:51:58, diff=25.214437s, valid=True
2026-06-03T11:52:23.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:52:23.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T11:52:23.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:52:12, diff=11.217286s, valid=True
2026-06-03T11:52:23.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:52:23.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:52:23.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:51:55, diff=28.223995s, valid=True
2026-06-03T11:52:23.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:52:23.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:52:23.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:52:23.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:52:23.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:52:23.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T11:52:23.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:52:12, diff=11.22705s, valid=True
2026-06-03T11:52:23.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:52:23.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:52:23.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:52:23.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54540.22771s, valid=False
2026-06-03T11:52:23.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:52:23.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:52:23.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:52:23.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:52:23.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:52:23.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:52:23.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:52:23.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:52:23.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:52:23.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:52:23.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:52:23.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:52:23.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:52:23.613 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:52:23.817 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:52:24.158 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:52:24.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:52:24.260 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:52:24.260 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:52:24.435 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:52:24.435 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:52:54.465 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:52:54.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:52:54.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:52:54.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:52:54.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:52:55.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:52:55.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:52:55.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:52:55.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:52:55.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:52:55.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:52:55.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:52:55.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:52:57.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:52:57.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:52:57.773 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:52:57.774 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:52:57.784 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:52:57.796 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:52:57.797 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:52:57.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:52:57.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:52:57.798 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:52:57.798 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:52:57.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:52:57.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:52:57.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:52:58.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:52:58.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:52:58.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T11:52:58.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:52:58.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T11:52:58.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:52:58.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:52:58.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:52:58.144 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:52:58.212 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:52:29
2026-06-03T11:52:58.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85954, datetime.datetime(2026, 6, 3, 11, 52, 29), datetime.datetime(2026, 6, 3, 11, 52, 28), 'salt', 6.94, 99.48, None, 35.78, 94.05, 0.07, 823.63, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:52:58.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:52:58.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:52:58.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:52:28, diff=30.218214s, valid=True
2026-06-03T11:52:58.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:52:58.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T11:52:58.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:52:12, diff=46.221159s, valid=True
2026-06-03T11:52:58.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:52:58.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:52:58.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:52:26, diff=32.227928s, valid=True
2026-06-03T11:52:58.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:52:58.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:52:58.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:52:58.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:52:58.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:52:58.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T11:52:58.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:52:12, diff=46.230899s, valid=True
2026-06-03T11:52:58.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:52:58.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:52:58.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:52:58.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54575.231545s, valid=False
2026-06-03T11:52:58.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:52:58.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:52:58.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:52:58.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:52:58.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:52:58.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:52:58.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:52:58.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:52:58.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:52:58.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:52:58.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:52:58.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:52:58.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:52:58.544 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:52:58.749 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:52:59.087 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:52:59.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:52:59.189 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:52:59.189 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:52:59.323 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:52:59.323 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:53:29.345 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:53:29.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:53:29.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:53:29.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:53:29.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:53:29.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:53:29.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:53:29.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:53:29.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:53:29.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:53:29.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:53:29.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:53:29.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:53:32.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:53:32.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:53:32.409 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:53:32.409 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:53:32.419 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:53:32.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:53:32.433 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:53:32.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:53:32.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:53:32.434 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:53:32.435 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:53:32.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:53:32.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:53:32.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:53:32.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:53:32.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:53:32.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T11:53:32.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:53:32.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T11:53:32.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:53:32.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:53:32.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:53:32.775 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:53:32.847 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:53:30
2026-06-03T11:53:32.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85956, datetime.datetime(2026, 6, 3, 11, 53, 30), datetime.datetime(2026, 6, 3, 11, 53, 29), 'salt', 6.94, 99.41, None, 39.48, 107.45, 0.08, 823.45, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:53:32.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:53:32.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:53:32.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:53:29, diff=3.8543s, valid=True
2026-06-03T11:53:32.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:53:32.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T11:53:32.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:53:12, diff=20.857694s, valid=True
2026-06-03T11:53:32.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:53:32.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:53:32.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:53:26, diff=6.86559s, valid=True
2026-06-03T11:53:32.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:53:32.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:53:32.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:53:32.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:53:32.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:53:32.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T11:53:32.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:53:12, diff=20.869197s, valid=True
2026-06-03T11:53:32.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:53:32.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:53:32.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:53:32.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54609.870024s, valid=False
2026-06-03T11:53:32.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:53:32.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:53:32.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:53:32.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:53:32.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:53:32.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:53:32.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:53:32.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:53:33.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:53:33.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:53:33.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:53:33.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:53:33.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:53:33.258 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:53:33.465 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:53:33.805 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:53:33.908 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:53:33.908 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:53:33.908 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:53:34.160 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:53:34.160 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:54:04.163 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:54:04.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:54:04.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:54:04.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:54:04.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:54:04.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:54:04.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:54:04.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:54:04.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:54:04.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:54:04.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:54:04.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:54:04.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:54:07.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:54:07.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:54:07.343 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:54:07.343 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:54:07.352 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:54:07.364 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:54:07.365 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:54:07.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:54:07.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:54:07.365 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:54:07.365 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:54:07.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:54:07.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:54:07.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:54:07.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:54:07.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:54:07.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T11:54:07.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:54:07.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T11:54:07.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:54:07.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:54:07.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:54:07.648 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:54:07.717 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:54:00
2026-06-03T11:54:07.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85957, datetime.datetime(2026, 6, 3, 11, 54), datetime.datetime(2026, 6, 3, 11, 53, 59), 'salt', 7.07, 99.47, None, 34.54, 94.28, 0.07, 823.39, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:54:07.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:54:07.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:54:07.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:53:59, diff=8.724463s, valid=True
2026-06-03T11:54:07.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:54:07.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T11:54:07.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:54:12, diff=-4.272358s, valid=True
2026-06-03T11:54:07.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:54:07.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:54:07.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:53:56, diff=11.735162s, valid=True
2026-06-03T11:54:07.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:54:07.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:54:07.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:54:07.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:54:07.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:54:07.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T11:54:07.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:54:12, diff=-4.261431s, valid=True
2026-06-03T11:54:07.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:54:07.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:54:07.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:54:07.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54644.739308s, valid=False
2026-06-03T11:54:07.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:54:07.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:54:07.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:54:07.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:54:07.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:54:07.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:54:07.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:54:07.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:54:07.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:54:07.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:54:07.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:54:07.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:54:08.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:54:08.063 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:54:08.273 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:54:08.619 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:54:08.722 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:54:08.722 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:54:08.723 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:54:08.794 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:54:08.794 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:54:38.824 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:54:38.825 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:54:38.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:54:39.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:54:39.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:54:39.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:54:39.606 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:54:39.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:54:39.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:54:39.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:54:39.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:54:39.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:54:39.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:54:42.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:54:42.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:54:42.134 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:54:42.135 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:54:42.144 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:54:42.156 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:54:42.157 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:54:42.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:54:42.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:54:42.158 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:54:42.158 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:54:42.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:54:42.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:54:42.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:54:42.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:54:42.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:54:42.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T11:54:42.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:54:42.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T11:54:42.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:54:42.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:54:42.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:54:42.500 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:54:42.570 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:54:31
2026-06-03T11:54:42.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85958, datetime.datetime(2026, 6, 3, 11, 54, 31), datetime.datetime(2026, 6, 3, 11, 54, 30), 'salt', 7.04, 99.48, None, 38.35, 99.52, 0.07, 823.39, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:54:42.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:54:42.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:54:42.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:54:30, diff=12.578851s, valid=True
2026-06-03T11:54:42.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:54:42.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T11:54:42.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:54:12, diff=30.582333s, valid=True
2026-06-03T11:54:42.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:54:42.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:54:42.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:54:27, diff=15.59048s, valid=True
2026-06-03T11:54:42.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:54:42.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:54:42.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:54:42.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:54:42.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:54:42.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T11:54:42.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:54:12, diff=30.594189s, valid=True
2026-06-03T11:54:42.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:54:42.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:54:42.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:54:42.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54679.595004s, valid=False
2026-06-03T11:54:42.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:54:42.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:54:42.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:54:42.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:54:42.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:54:42.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:54:42.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:54:42.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:54:42.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:54:42.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:54:42.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:54:42.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:54:42.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:54:42.915 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:54:43.120 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:54:43.459 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:54:43.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:54:43.561 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:54:43.561 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:54:43.777 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:54:43.777 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:55:13.781 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:55:13.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:55:13.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:55:14.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:55:14.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:55:14.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:55:14.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:55:14.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:55:14.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:55:14.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:55:14.355 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:55:14.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:55:14.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:55:17.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:55:17.051 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:55:17.052 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:55:17.052 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:55:17.062 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:55:17.075 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:55:17.076 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:55:17.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:55:17.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:55:17.077 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:55:17.077 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:55:17.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:55:17.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:55:17.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:55:17.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:55:17.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:55:17.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T11:55:17.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:55:17.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T11:55:17.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:55:17.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:55:17.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:55:17.418 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:55:17.501 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:55:01
2026-06-03T11:55:17.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85959, datetime.datetime(2026, 6, 3, 11, 55, 1), datetime.datetime(2026, 6, 3, 11, 55, 1), 'salt', 7.07, 99.54, None, 41.39, 103.41, 0.06, 823.57, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:55:17.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:55:17.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:55:17.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:55:01, diff=16.508966s, valid=True
2026-06-03T11:55:17.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:55:17.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T11:55:17.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:55:12, diff=5.512475s, valid=True
2026-06-03T11:55:17.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:55:17.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:55:17.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:54:57, diff=20.52052s, valid=True
2026-06-03T11:55:17.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:55:17.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:55:17.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:55:17.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:55:17.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:55:17.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T11:55:17.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:55:12, diff=5.524468s, valid=True
2026-06-03T11:55:17.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:55:17.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:55:17.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:55:17.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54714.525304s, valid=False
2026-06-03T11:55:17.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:55:17.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:55:17.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:55:17.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:55:17.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:55:17.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:55:17.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:55:17.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:55:17.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:55:17.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:55:17.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:55:17.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:55:17.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:55:17.846 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:55:18.049 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:55:18.447 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:55:18.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:55:18.550 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:55:18.551 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:55:18.622 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:55:18.622 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:55:48.652 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:55:48.653 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:55:48.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:55:48.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:55:48.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:55:49.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:55:49.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:55:49.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:55:49.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:55:49.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:55:49.212 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:55:49.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:55:49.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:55:51.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:55:51.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:55:51.872 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:55:51.873 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:55:51.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:55:51.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:55:51.895 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:55:51.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:55:51.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:55:51.896 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:55:51.896 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:55:51.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:55:52.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:55:52.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:55:52.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:55:52.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:55:52.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T11:55:52.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:55:52.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T11:55:52.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:55:52.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:55:52.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:55:52.231 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:55:52.312 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:55:32
2026-06-03T11:55:52.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85960, datetime.datetime(2026, 6, 3, 11, 55, 32), datetime.datetime(2026, 6, 3, 11, 55, 31), 'salt', 7.0, 99.54, None, 37.51, 99.84, 0.06, 823.51, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:55:52.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:55:52.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:55:52.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:55:31, diff=21.320011s, valid=True
2026-06-03T11:55:52.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:55:52.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T11:55:52.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:55:12, diff=40.323506s, valid=True
2026-06-03T11:55:52.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:55:52.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:55:52.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:55:29, diff=23.331878s, valid=True
2026-06-03T11:55:52.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:55:52.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:55:52.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:55:52.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:55:52.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:55:52.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T11:55:52.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:55:12, diff=40.335631s, valid=True
2026-06-03T11:55:52.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:55:52.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:55:52.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:55:52.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54749.336427s, valid=False
2026-06-03T11:55:52.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:55:52.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:55:52.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:55:52.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:55:52.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:55:52.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:55:52.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:55:52.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:55:52.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:55:52.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:55:52.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:55:52.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:55:52.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:55:52.657 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:55:52.864 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:55:53.205 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:55:53.308 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:55:53.309 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:55:53.309 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:55:53.526 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:55:53.527 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:56:23.540 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:56:23.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:56:23.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:56:23.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:56:23.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:56:23.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:56:23.952 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:56:23.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:56:23.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:56:23.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:56:23.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:56:23.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:56:23.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:56:26.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:56:26.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:56:26.685 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:56:26.685 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:56:26.695 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:56:26.708 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:56:26.708 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:56:26.709 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:56:26.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:56:26.710 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:56:26.710 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:56:26.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:56:26.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:56:26.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:56:26.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:56:26.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:56:26.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T11:56:26.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:56:27.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T11:56:27.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:56:27.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:56:27.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:56:27.039 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:56:27.108 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:56:02
2026-06-03T11:56:27.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85961, datetime.datetime(2026, 6, 3, 11, 56, 2), datetime.datetime(2026, 6, 3, 11, 56, 1), 'salt', 7.0, 99.48, None, 41.35, 93.76, 0.07, 823.45, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:56:27.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:56:27.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:56:27.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:56:01, diff=26.11491s, valid=True
2026-06-03T11:56:27.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:56:27.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T11:56:27.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:56:12, diff=15.118117s, valid=True
2026-06-03T11:56:27.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:56:27.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:56:27.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:56:00, diff=27.125634s, valid=True
2026-06-03T11:56:27.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:56:27.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:56:27.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:56:27.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:56:27.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:56:27.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T11:56:27.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:56:12, diff=15.129106s, valid=True
2026-06-03T11:56:27.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:56:27.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:56:27.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:56:27.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54784.129857s, valid=False
2026-06-03T11:56:27.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:56:27.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:56:27.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:56:27.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:56:27.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:56:27.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:56:27.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:56:27.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:56:27.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:56:27.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:56:27.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:56:27.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:56:27.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:56:27.519 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:56:27.725 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:56:28.064 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:56:28.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:56:28.166 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:56:28.166 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:56:28.402 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:56:28.402 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:56:58.416 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:56:58.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:56:58.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:56:58.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:56:58.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:56:58.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:56:58.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:56:58.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:56:58.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:56:59.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:56:59.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:56:59.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:56:59.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:57:01.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:57:01.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:57:01.722 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:57:01.722 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:57:01.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:57:01.762 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:57:01.762 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:57:01.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:57:01.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:57:01.763 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:57:01.763 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:57:01.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:57:01.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:57:01.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:57:01.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:57:01.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:57:01.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T11:57:01.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:57:02.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T11:57:02.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:57:02.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:57:02.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:57:02.039 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:57:02.108 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:56:32
2026-06-03T11:57:02.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85962, datetime.datetime(2026, 6, 3, 11, 56, 32), datetime.datetime(2026, 6, 3, 11, 56, 31), 'salt', 6.97, 99.54, None, 37.15, 90.24, 0.06, 823.39, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:57:02.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:57:02.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:57:02.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:56:31, diff=31.115046s, valid=True
2026-06-03T11:57:02.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:57:02.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T11:57:02.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:56:12, diff=50.118291s, valid=True
2026-06-03T11:57:02.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:57:02.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:57:02.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:56:32, diff=30.125863s, valid=True
2026-06-03T11:57:02.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:57:02.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:57:02.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:57:02.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:57:02.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:57:02.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T11:57:02.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:56:12, diff=50.129321s, valid=True
2026-06-03T11:57:02.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:57:02.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:57:02.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:57:02.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54819.130064s, valid=False
2026-06-03T11:57:02.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:57:02.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:57:02.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:57:02.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:57:02.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:57:02.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:57:02.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:57:02.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:57:02.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:57:02.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:57:02.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:57:02.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:57:02.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:57:02.449 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:57:02.654 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:57:02.995 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:57:03.097 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:57:03.097 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:57:03.097 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:57:03.317 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:57:03.317 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:57:33.347 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:57:33.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:57:33.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:57:33.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:57:33.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:57:33.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:57:33.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:57:33.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:57:33.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:57:33.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:57:33.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:57:33.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:57:33.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:57:36.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:57:36.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:57:36.444 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:57:36.445 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:57:36.452 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:57:36.464 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:57:36.464 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:57:36.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:57:36.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:57:36.464 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:57:36.465 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:57:36.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:57:36.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:57:36.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:57:36.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:57:36.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:57:36.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T11:57:36.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:57:36.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T11:57:36.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:57:36.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:57:36.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:57:36.744 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:57:36.813 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:57:32
2026-06-03T11:57:36.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85964, datetime.datetime(2026, 6, 3, 11, 57, 32), datetime.datetime(2026, 6, 3, 11, 57, 32), 'salt', 7.0, 99.54, None, 34.86, 101.21, 0.06, 823.45, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:57:36.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:57:36.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:57:36.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:57:32, diff=4.820515s, valid=True
2026-06-03T11:57:36.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:57:36.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T11:57:36.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:56:12, diff=84.823761s, valid=True
2026-06-03T11:57:36.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:57:36.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:57:36.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:57:29, diff=7.831336s, valid=True
2026-06-03T11:57:36.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:57:36.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:57:36.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:57:36.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:57:36.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:57:36.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T11:57:36.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:56:12, diff=84.834832s, valid=True
2026-06-03T11:57:36.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:57:36.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:57:36.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:57:36.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54853.835574s, valid=False
2026-06-03T11:57:36.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:57:36.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:57:36.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:57:36.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:57:36.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:57:36.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:57:36.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:57:36.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:57:36.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:57:36.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:57:37.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:57:37.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:57:37.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:57:37.226 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:57:37.436 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:57:37.898 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:57:38.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:57:38.004 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:57:38.004 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:57:38.080 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:57:38.080 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:58:08.094 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:58:08.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:58:08.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:58:08.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:58:08.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:58:08.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:58:08.477 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:58:08.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:58:08.485 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:58:08.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:58:08.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:58:08.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:58:08.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:58:11.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:58:11.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:58:11.148 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:58:11.149 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:58:11.161 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:58:11.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:58:11.175 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:58:11.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:58:11.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:58:11.176 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:58:11.176 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:58:11.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:58:11.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:58:11.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:58:11.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:58:11.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:58:11.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:58:11.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:58:11.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:58:11.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:58:11.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:58:11.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:58:11.510 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:58:11.579 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:58:03
2026-06-03T11:58:11.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85965, datetime.datetime(2026, 6, 3, 11, 58, 3), datetime.datetime(2026, 6, 3, 11, 58, 2), 'salt', 7.04, 99.54, None, 39.69, 97.33, 0.06, 823.33, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:58:11.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:58:11.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:58:11.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:58:02, diff=9.58718s, valid=True
2026-06-03T11:58:11.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:58:11.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:58:11.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:56:12, diff=119.590747s, valid=True
2026-06-03T11:58:11.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:58:11.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:58:11.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:57:59, diff=12.599043s, valid=True
2026-06-03T11:58:11.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:58:11.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:58:11.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:58:11.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:58:11.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:58:11.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:58:11.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:56:12, diff=119.602779s, valid=True
2026-06-03T11:58:11.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:58:11.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:58:11.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:58:11.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54888.603598s, valid=False
2026-06-03T11:58:11.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:58:11.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:58:11.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:58:11.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:58:11.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:58:11.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:58:11.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:58:11.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:58:11.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:58:11.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:58:12.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:58:12.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:58:12.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:58:12.345 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:58:12.550 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:58:12.888 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:58:12.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:58:12.992 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:58:12.992 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:58:14.059 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:58:14.059 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:58:44.089 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:58:44.089 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:58:44.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:58:44.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:58:44.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:58:44.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:58:44.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:58:44.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:58:44.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:58:44.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:58:44.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:58:44.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:58:44.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:58:47.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:58:47.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:58:47.191 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:58:47.191 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:58:47.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:58:47.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:58:47.214 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:58:47.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:58:47.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:58:47.215 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:58:47.215 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:58:47.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:58:47.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T11:58:47.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:58:47.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T11:58:47.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:58:47.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:58:47.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:58:47.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T11:58:47.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:58:47.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:58:47.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:58:47.549 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:58:47.618 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:58:33
2026-06-03T11:58:47.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85966, datetime.datetime(2026, 6, 3, 11, 58, 33), datetime.datetime(2026, 6, 3, 11, 58, 32), 'salt', 6.97, 99.71, None, 41.03, 98.74, 0.03, 823.45, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:58:47.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:58:47.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T11:58:47.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:58:32, diff=15.625755s, valid=True
2026-06-03T11:58:47.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:58:47.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:58:47.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:56:12, diff=155.629242s, valid=True
2026-06-03T11:58:47.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:58:47.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T11:58:47.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:58:29, diff=18.637356s, valid=True
2026-06-03T11:58:47.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:58:47.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:58:47.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:58:47.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:58:47.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:58:47.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T11:58:47.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:56:12, diff=155.641201s, valid=True
2026-06-03T11:58:47.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:58:47.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:58:47.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:58:47.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54924.642014s, valid=False
2026-06-03T11:58:47.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:58:47.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:58:47.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:58:47.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:58:47.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:58:47.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:58:47.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:58:47.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:58:47.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:58:47.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:58:47.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:58:47.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:58:47.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:58:48.028 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:58:48.236 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:58:48.577 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:58:48.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:58:48.680 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:58:48.680 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:58:48.751 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:58:48.751 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:59:18.782 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:59:18.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:59:18.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:59:19.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:59:19.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:59:19.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:59:19.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:59:19.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:59:19.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:59:19.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:59:19.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:59:19.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:59:19.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:59:22.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:59:22.027 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:59:22.027 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:59:22.028 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:59:22.038 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:59:22.051 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:59:22.051 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:59:22.052 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:59:22.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:59:22.053 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:59:22.053 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:59:22.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:59:22.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:59:22.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:59:22.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:59:22.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:59:22.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:59:22.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:59:22.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T11:59:22.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:59:22.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:59:22.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:59:22.389 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:59:22.458 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:59:03
2026-06-03T11:59:22.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85967, datetime.datetime(2026, 6, 3, 11, 59, 3), datetime.datetime(2026, 6, 3, 11, 59, 2), 'salt', 6.97, 99.68, None, 37.54, 104.94, 0.04, 823.39, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:59:22.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:59:22.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:59:22.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:59:02, diff=20.466354s, valid=True
2026-06-03T11:59:22.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:59:22.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:59:22.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:56:12, diff=190.469842s, valid=True
2026-06-03T11:59:22.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:59:22.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:59:22.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:59:00, diff=22.478035s, valid=True
2026-06-03T11:59:22.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:59:22.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:59:22.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:59:22.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:59:22.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:59:22.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T11:59:22.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:56:12, diff=190.481761s, valid=True
2026-06-03T11:59:22.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:59:22.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:59:22.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:59:22.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54959.482599s, valid=False
2026-06-03T11:59:22.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:59:22.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:59:22.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:59:22.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:59:22.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:59:22.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:59:22.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:59:22.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:59:22.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:59:22.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:59:22.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:59:22.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:59:22.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:59:22.803 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:59:23.009 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:59:23.349 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:59:23.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:59:23.453 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:59:23.453 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:59:23.619 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:59:23.619 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T11:59:53.630 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T11:59:53.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T11:59:53.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T11:59:53.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T11:59:53.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T11:59:54.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T11:59:54.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T11:59:54.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T11:59:54.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T11:59:54.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T11:59:54.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T11:59:54.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T11:59:54.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T11:59:57.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T11:59:57.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T11:59:57.065 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T11:59:57.066 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T11:59:57.076 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T11:59:57.090 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T11:59:57.091 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T11:59:57.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T11:59:57.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T11:59:57.092 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T11:59:57.092 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T11:59:57.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T11:59:57.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T11:59:57.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T11:59:57.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T11:59:57.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:59:57.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T11:59:57.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T11:59:57.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T11:59:57.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T11:59:57.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T11:59:57.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T11:59:57.422 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T11:59:57.490 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 11:59:33
2026-06-03T11:59:57.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85968, datetime.datetime(2026, 6, 3, 11, 59, 33), datetime.datetime(2026, 6, 3, 11, 59, 32), 'salt', 7.0, 99.48, None, 32.28, 101.58, 0.07, 823.39, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T11:59:57.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T11:59:57.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T11:59:57.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:59:32, diff=25.497003s, valid=True
2026-06-03T11:59:57.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T11:59:57.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T11:59:57.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:56:12, diff=225.499833s, valid=True
2026-06-03T11:59:57.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T11:59:57.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T11:59:57.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:59:30, diff=27.506501s, valid=True
2026-06-03T11:59:57.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T11:59:57.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:59:57.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T11:59:57.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T11:59:57.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T11:59:57.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T11:59:57.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:56:12, diff=225.509505s, valid=True
2026-06-03T11:59:57.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T11:59:57.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T11:59:57.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T11:59:57.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=54994.510179s, valid=False
2026-06-03T11:59:57.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T11:59:57.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T11:59:57.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T11:59:57.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T11:59:57.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T11:59:57.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T11:59:57.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T11:59:57.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T11:59:57.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T11:59:57.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T11:59:57.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T11:59:57.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T11:59:57.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T11:59:57.824 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T11:59:58.031 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:59:58.375 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T11:59:58.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T11:59:58.478 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T11:59:58.478 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T11:59:58.547 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T11:59:58.547 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:00:28.553 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:00:28.553 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:00:28.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:00:28.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:00:28.674 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:00:28.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:00:28.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:00:28.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:00:28.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:00:28.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:00:28.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:00:28.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:00:28.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:00:31.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:00:31.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:00:31.909 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:00:31.909 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:00:31.917 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:00:31.922 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:00:31.923 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:00:31.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:00:31.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:00:31.923 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:00:31.923 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:00:31.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:00:32.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:00:32.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:00:32.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:00:32.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:00:32.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:00:32.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:00:32.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:00:32.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:00:32.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:00:32.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:00:32.219 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:00:32.289 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:00:04
2026-06-03T12:00:32.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85969, datetime.datetime(2026, 6, 3, 12, 0, 4), datetime.datetime(2026, 6, 3, 12, 0, 2), 'salt', 7.0, 99.61, None, 27.45, 104.12, 0.05, 823.39, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:00:32.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:00:32.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:00:32.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:00:02, diff=30.295906s, valid=True
2026-06-03T12:00:32.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:00:32.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:00:32.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:56:12, diff=260.299123s, valid=True
2026-06-03T12:00:32.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:00:32.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:00:32.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:00:01, diff=31.306801s, valid=True
2026-06-03T12:00:32.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:00:32.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:00:32.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:00:32.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:00:32.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:00:32.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:00:32.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 11:56:12, diff=260.310254s, valid=True
2026-06-03T12:00:32.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:00:32.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:00:32.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:00:32.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55029.311025s, valid=False
2026-06-03T12:00:32.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:00:32.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:00:32.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:00:32.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:00:32.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:00:32.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:00:32.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:00:32.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:00:32.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:00:32.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:00:32.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:00:32.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:00:32.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:00:32.631 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:00:32.838 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:00:33.180 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:00:33.285 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:00:33.285 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:00:33.285 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:00:33.453 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:00:33.454 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:01:03.466 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:01:03.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:01:03.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:01:03.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:01:03.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:01:03.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:01:03.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:01:03.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:01:03.939 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:01:03.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:01:03.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:01:03.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:01:03.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:01:06.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:01:06.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:01:06.633 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:01:06.633 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:01:06.644 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:01:06.657 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:01:06.658 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:01:06.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:01:06.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:01:06.659 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:01:06.659 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:01:06.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:01:06.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:01:06.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:01:06.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:01:06.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:01:06.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:01:06.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:01:06.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:01:06.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:01:06.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:01:06.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:01:06.993 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:01:07.070 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:01:04
2026-06-03T12:01:07.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85971, datetime.datetime(2026, 6, 3, 12, 1, 4), datetime.datetime(2026, 6, 3, 12, 1, 3), 'salt', 7.14, 99.58, None, 37.01, 104.16, 0.06, 823.33, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:01:07.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:01:07.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:01:07.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:01:03, diff=4.078452s, valid=True
2026-06-03T12:01:07.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:01:07.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:01:07.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:01:12, diff=-4.918034s, valid=True
2026-06-03T12:01:07.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:01:07.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:01:07.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:01:04, diff=3.090184s, valid=True
2026-06-03T12:01:07.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:01:07.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:01:07.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:01:07.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:01:07.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:01:07.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:01:07.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:01:12, diff=-4.9061s, valid=True
2026-06-03T12:01:07.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:01:07.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:01:07.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:01:07.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55064.094719s, valid=False
2026-06-03T12:01:07.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:01:07.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:01:07.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:01:07.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:01:07.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:01:07.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:01:07.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:01:07.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:01:07.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:01:07.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:01:07.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:01:07.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:01:07.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:01:07.417 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:01:07.625 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:01:07.967 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:01:08.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:01:08.073 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:01:08.073 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:01:08.241 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:01:08.241 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:01:38.244 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:01:38.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:01:38.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:01:38.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:01:38.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:01:38.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:01:38.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:01:38.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:01:38.661 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:01:38.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:01:38.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:01:38.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:01:38.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:01:41.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:01:41.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:01:41.578 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:01:41.578 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:01:41.589 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:01:41.602 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:01:41.602 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:01:41.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:01:41.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:01:41.604 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:01:41.604 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:01:41.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:01:41.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:01:41.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:01:41.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:01:41.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:01:41.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:01:41.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:01:41.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:01:41.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:01:41.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:01:41.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:01:41.961 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:01:42.033 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:01:35
2026-06-03T12:01:42.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85972, datetime.datetime(2026, 6, 3, 12, 1, 35), datetime.datetime(2026, 6, 3, 12, 1, 34), 'salt', 7.1, 99.58, None, 33.94, 101.16, 0.05, 823.39, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:01:42.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:01:42.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:01:42.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:01:34, diff=8.04063s, valid=True
2026-06-03T12:01:42.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:01:42.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:01:42.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:02:12, diff=-29.95615s, valid=True
2026-06-03T12:01:42.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:01:42.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:01:42.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:01:31, diff=11.051429s, valid=True
2026-06-03T12:01:42.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:01:42.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:01:42.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:01:42.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:01:42.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:01:42.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:01:42.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:02:12, diff=-29.945119s, valid=True
2026-06-03T12:01:42.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:01:42.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:01:42.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:01:42.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55099.055648s, valid=False
2026-06-03T12:01:42.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:01:42.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:01:42.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:01:42.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:01:42.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:01:42.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:01:42.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:01:42.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:01:42.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:01:42.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:01:42.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:01:42.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:01:42.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:01:42.376 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:01:42.641 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:01:42.982 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:01:43.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:01:43.086 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:01:43.087 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:01:43.257 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:01:43.257 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:02:13.278 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:02:13.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:02:13.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:02:13.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:02:13.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:02:13.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:02:13.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:02:13.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:02:13.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:02:13.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:02:13.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:02:13.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:02:13.715 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:02:16.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:02:16.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:02:16.976 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:02:16.976 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:02:16.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:02:16.999 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:02:17.000 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:02:17.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:02:17.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:02:17.002 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:02:17.002 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:02:17.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:02:17.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:02:17.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:02:17.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:02:17.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:02:17.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:02:17.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:02:17.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:02:17.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:02:17.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:02:17.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:02:17.337 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:02:17.406 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:02:05
2026-06-03T12:02:17.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85973, datetime.datetime(2026, 6, 3, 12, 2, 5), datetime.datetime(2026, 6, 3, 12, 2, 4), 'salt', 7.07, 99.58, None, 34.65, 98.23, 0.05, 823.33, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:02:17.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:02:17.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:02:17.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:02:04, diff=13.414085s, valid=True
2026-06-03T12:02:17.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:02:17.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:02:17.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:02:12, diff=5.417437s, valid=True
2026-06-03T12:02:17.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:02:17.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:02:17.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:02:01, diff=16.425367s, valid=True
2026-06-03T12:02:17.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:02:17.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:02:17.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:02:17.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:02:17.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:02:17.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:02:17.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:02:12, diff=5.428957s, valid=True
2026-06-03T12:02:17.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:02:17.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:02:17.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:02:17.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55134.429741s, valid=False
2026-06-03T12:02:17.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:02:17.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:02:17.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:02:17.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:02:17.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:02:17.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:02:17.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:02:17.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:02:17.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:02:17.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:02:17.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:02:17.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:02:17.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:02:17.754 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:02:17.965 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:02:18.315 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:02:18.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:02:18.419 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:02:18.419 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:02:18.487 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:02:18.488 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:02:48.488 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:02:48.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:02:48.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:02:48.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:02:48.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:02:48.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:02:48.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:02:48.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:02:48.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:02:48.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:02:48.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:02:48.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:02:48.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:02:51.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:02:51.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:02:51.660 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:02:51.660 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:02:51.671 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:02:51.683 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:02:51.684 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:02:51.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:02:51.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:02:51.685 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:02:51.685 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:02:51.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:02:51.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:02:51.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:02:51.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:02:51.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:02:51.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:02:51.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:02:52.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:02:52.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:02:52.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:02:52.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:02:52.043 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:02:52.126 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:02:35
2026-06-03T12:02:52.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85974, datetime.datetime(2026, 6, 3, 12, 2, 35), datetime.datetime(2026, 6, 3, 12, 2, 34), 'salt', 7.1, 99.48, None, 31.05, 109.0, 0.07, 823.21, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:02:52.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:02:52.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:02:52.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:02:34, diff=18.134436s, valid=True
2026-06-03T12:02:52.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:02:52.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:02:52.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:03:12, diff=-19.86212s, valid=True
2026-06-03T12:02:52.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:02:52.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:02:52.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:02:31, diff=21.145928s, valid=True
2026-06-03T12:02:52.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:02:52.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:02:52.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:02:52.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:02:52.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:02:52.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:02:52.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:03:12, diff=-19.850355s, valid=True
2026-06-03T12:02:52.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:02:52.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:02:52.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:02:52.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55169.150409s, valid=False
2026-06-03T12:02:52.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:02:52.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:02:52.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:02:52.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:02:52.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:02:52.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:02:52.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:02:52.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:02:52.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:02:52.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:02:52.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:02:52.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:02:52.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:02:52.540 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:02:52.743 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:02:53.084 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:02:53.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:02:53.186 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:02:53.186 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:02:53.357 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:02:53.358 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:03:23.360 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:03:23.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:03:23.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:03:23.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:03:23.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:03:23.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:03:23.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:03:23.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:03:23.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:03:23.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:03:23.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:03:23.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:03:23.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:03:26.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:03:26.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:03:26.641 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:03:26.642 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:03:26.652 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:03:26.665 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:03:26.666 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:03:26.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:03:26.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:03:26.667 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:03:26.667 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:03:26.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:03:26.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:03:26.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:03:26.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:03:26.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:03:26.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:03:26.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:03:27.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:03:27.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:03:27.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:03:27.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:03:27.011 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:03:27.081 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:03:05
2026-06-03T12:03:27.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85975, datetime.datetime(2026, 6, 3, 12, 3, 5), datetime.datetime(2026, 6, 3, 12, 3, 5), 'salt', 7.17, 99.58, None, 32.74, 106.63, 0.05, 823.33, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:03:27.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:03:27.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:03:27.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:03:05, diff=22.088978s, valid=True
2026-06-03T12:03:27.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:03:27.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:03:27.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:03:12, diff=15.092434s, valid=True
2026-06-03T12:03:27.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:03:27.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:03:27.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:03:01, diff=26.100536s, valid=True
2026-06-03T12:03:27.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:03:27.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:03:27.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:03:27.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:03:27.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:03:27.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:03:27.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:03:12, diff=15.104278s, valid=True
2026-06-03T12:03:27.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:03:27.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:03:27.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:03:27.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55204.105084s, valid=False
2026-06-03T12:03:27.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:03:27.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:03:27.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:03:27.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:03:27.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:03:27.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:03:27.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:03:27.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:03:27.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:03:27.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:03:27.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:03:27.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:03:27.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:03:27.436 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:03:27.641 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:03:27.980 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:03:28.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:03:28.083 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:03:28.083 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:03:28.252 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:03:28.252 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:03:58.283 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:03:58.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:03:58.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:03:58.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:03:58.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:03:58.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:03:58.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:03:58.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:03:58.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:03:58.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:03:58.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:03:58.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:03:58.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:04:01.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:04:01.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:04:01.421 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:04:01.421 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:04:01.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:04:01.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:04:01.446 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:04:01.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:04:01.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:04:01.447 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:04:01.448 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:04:01.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:04:01.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:04:01.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:04:01.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:04:01.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:04:01.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:04:01.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:04:01.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:04:01.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:04:01.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:04:01.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:04:01.778 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:04:01.847 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:03:36
2026-06-03T12:04:01.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85976, datetime.datetime(2026, 6, 3, 12, 3, 36), datetime.datetime(2026, 6, 3, 12, 3, 35), 'salt', 7.07, 99.51, None, 36.06, 100.76, 0.06, 823.33, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:04:01.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:04:01.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:04:01.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:03:35, diff=26.854213s, valid=True
2026-06-03T12:04:01.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:04:01.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:04:01.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:04:12, diff=-10.14291s, valid=True
2026-06-03T12:04:01.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:04:01.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:04:01.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:03:32, diff=29.863713s, valid=True
2026-06-03T12:04:01.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:04:01.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:04:01.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:04:01.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:04:01.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:04:01.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:04:01.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:04:12, diff=-10.133224s, valid=True
2026-06-03T12:04:01.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:04:01.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:04:01.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:04:01.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55238.867456s, valid=False
2026-06-03T12:04:01.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:04:01.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:04:01.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:04:01.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:04:01.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:04:01.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:04:01.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:04:01.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:04:01.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:04:02.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:04:02.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:04:02.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:04:02.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:04:02.250 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:04:02.457 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:04:02.796 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:04:02.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:04:02.899 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:04:02.899 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:04:03.068 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:04:03.068 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:04:33.098 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:04:33.098 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:04:33.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:04:33.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:04:33.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:04:33.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:04:33.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:04:33.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:04:33.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:04:33.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:04:33.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:04:33.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:04:33.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:04:36.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:04:36.151 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:04:36.152 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:04:36.152 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:04:36.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:04:36.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:04:36.175 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:04:36.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:04:36.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:04:36.176 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:04:36.176 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:04:36.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:04:36.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:04:36.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:04:36.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:04:36.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:04:36.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:04:36.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:04:36.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:04:36.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:04:36.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:04:36.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:04:36.482 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:04:36.551 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:04:36
2026-06-03T12:04:36.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85978, datetime.datetime(2026, 6, 3, 12, 4, 36), datetime.datetime(2026, 6, 3, 12, 4, 35), 'salt', 7.14, 99.61, None, 37.75, 90.69, 0.05, 823.27, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:04:36.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:04:36.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:04:36.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:04:35, diff=1.55824s, valid=True
2026-06-03T12:04:36.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:04:36.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:04:36.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:05:12, diff=-35.438476s, valid=True
2026-06-03T12:04:36.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:04:36.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:04:36.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:04:33, diff=3.569237s, valid=True
2026-06-03T12:04:36.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:04:36.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:04:36.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:04:36.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:04:36.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:04:36.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:04:36.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:05:12, diff=-35.427305s, valid=True
2026-06-03T12:04:36.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:04:36.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:04:36.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:04:36.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55273.573447s, valid=False
2026-06-03T12:04:36.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:04:36.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:04:36.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:04:36.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:04:36.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:04:36.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:04:36.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:04:36.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:04:36.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:04:36.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:04:36.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:04:36.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:04:36.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:04:36.890 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:04:37.100 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:04:37.440 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:04:37.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:04:37.543 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:04:37.543 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:04:37.779 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:04:37.779 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:05:07.809 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:05:07.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:05:07.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:05:07.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:05:07.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:05:08.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:05:08.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:05:08.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:05:08.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:05:08.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:05:08.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:05:08.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:05:08.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:05:10.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:05:10.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:05:10.951 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:05:10.951 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:05:10.963 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:05:10.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:05:10.976 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:05:10.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:05:10.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:05:10.976 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:05:10.976 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:05:10.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:05:11.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:05:11.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:05:11.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:05:11.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:05:11.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:05:11.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:05:11.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:05:11.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:05:11.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:05:11.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:05:11.300 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:05:11.368 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:05:06
2026-06-03T12:05:11.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85979, datetime.datetime(2026, 6, 3, 12, 5, 6), datetime.datetime(2026, 6, 3, 12, 5, 6), 'salt', 7.04, 99.58, None, 40.22, 100.31, 0.06, 823.33, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:05:11.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:05:11.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:05:11.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:05:06, diff=5.375247s, valid=True
2026-06-03T12:05:11.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:05:11.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:05:11.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:05:12, diff=-0.621358s, valid=True
2026-06-03T12:05:11.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:05:11.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:05:11.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:05:04, diff=7.386417s, valid=True
2026-06-03T12:05:11.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:05:11.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:05:11.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:05:11.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:05:11.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:05:11.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:05:11.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:05:12, diff=-0.609988s, valid=True
2026-06-03T12:05:11.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:05:11.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:05:11.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:05:11.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55308.3908s, valid=False
2026-06-03T12:05:11.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:05:11.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:05:11.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:05:11.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:05:11.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:05:11.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:05:11.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:05:11.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:05:11.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:05:11.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:05:11.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:05:11.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:05:11.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:05:11.779 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:05:11.985 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:05:12.325 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:05:12.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:05:12.428 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:05:12.428 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:05:12.556 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:05:12.556 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:05:42.572 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:05:42.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:05:42.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:05:42.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:05:42.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:05:42.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:05:42.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:05:42.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:05:42.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:05:42.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:05:42.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:05:42.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:05:42.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:05:45.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:05:45.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:05:45.753 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:05:45.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:05:45.762 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:05:45.774 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:05:45.775 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:05:45.776 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:05:45.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:05:45.776 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:05:45.776 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:05:45.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:05:45.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:05:45.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:05:46.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:05:46.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:05:46.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:05:46.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:05:46.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:05:46.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:05:46.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:05:46.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:05:46.131 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:05:46.203 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:05:37
2026-06-03T12:05:46.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85980, datetime.datetime(2026, 6, 3, 12, 5, 37), datetime.datetime(2026, 6, 3, 12, 5, 36), 'salt', 7.01, 99.51, None, 37.51, 103.72, 0.07, 823.15, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:05:46.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:05:46.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:05:46.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:05:36, diff=10.211305s, valid=True
2026-06-03T12:05:46.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:05:46.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:05:46.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:06:12, diff=-25.785061s, valid=True
2026-06-03T12:05:46.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:05:46.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:05:46.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:05:36, diff=10.223087s, valid=True
2026-06-03T12:05:46.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:05:46.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:05:46.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:05:46.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:05:46.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:05:46.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:05:46.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:06:12, diff=-25.773171s, valid=True
2026-06-03T12:05:46.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:05:46.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:05:46.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:05:46.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55343.227642s, valid=False
2026-06-03T12:05:46.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:05:46.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:05:46.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:05:46.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:05:46.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:05:46.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:05:46.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:05:46.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:05:46.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:05:46.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:05:46.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:05:46.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:05:46.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:05:46.550 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:05:46.776 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:05:47.114 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:05:47.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:05:47.216 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:05:47.216 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:05:47.284 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:05:47.284 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:06:17.311 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:06:17.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:06:17.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:06:17.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:06:17.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:06:17.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:06:17.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:06:17.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:06:17.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:06:17.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:06:17.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:06:17.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:06:17.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:06:20.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:06:20.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:06:20.558 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:06:20.558 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:06:20.566 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:06:20.580 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:06:20.580 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:06:20.581 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:06:20.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:06:20.581 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:06:20.581 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:06:20.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:06:20.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:06:20.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:06:20.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:06:20.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:06:20.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:06:20.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:06:20.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:06:20.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:06:20.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:06:20.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:06:20.916 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:06:20.995 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:06:07
2026-06-03T12:06:20.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85981, datetime.datetime(2026, 6, 3, 12, 6, 7), datetime.datetime(2026, 6, 3, 12, 6, 6), 'salt', 6.84, 99.48, None, 33.98, 104.35, 0.07, 823.21, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:06:20.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:06:20.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:06:21.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:06:06, diff=15.001969s, valid=True
2026-06-03T12:06:21.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:06:21.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:06:21.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:06:12, diff=9.004829s, valid=True
2026-06-03T12:06:21.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:06:21.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:06:21.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:06:03, diff=18.011451s, valid=True
2026-06-03T12:06:21.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:06:21.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:06:21.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:06:21.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:06:21.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:06:21.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:06:21.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:06:12, diff=9.014454s, valid=True
2026-06-03T12:06:21.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:06:21.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:06:21.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:06:21.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55378.015107s, valid=False
2026-06-03T12:06:21.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:06:21.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:06:21.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:06:21.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:06:21.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:06:21.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:06:21.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:06:21.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:06:21.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:06:21.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:06:21.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:06:21.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:06:21.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:06:21.330 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:06:21.535 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:06:21.874 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:06:21.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:06:21.976 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:06:21.976 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:06:22.130 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:06:22.131 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:06:52.136 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:06:52.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:06:52.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:06:52.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:06:52.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:06:52.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:06:52.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:06:52.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:06:52.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:06:52.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:06:52.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:06:52.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:06:52.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:06:55.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:06:55.377 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:06:55.378 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:06:55.378 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:06:55.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:06:55.402 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:06:55.402 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:06:55.403 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:06:55.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:06:55.404 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:06:55.404 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:06:55.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:06:55.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:06:55.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:06:55.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:06:55.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:06:55.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:06:55.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:06:55.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:06:55.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:06:55.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:06:55.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:06:55.743 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:06:55.814 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:06:37
2026-06-03T12:06:55.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85982, datetime.datetime(2026, 6, 3, 12, 6, 37), datetime.datetime(2026, 6, 3, 12, 6, 36), 'salt', 6.97, 99.54, None, 28.44, 102.26, 0.06, 823.46, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:06:55.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:06:55.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:06:55.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:06:36, diff=19.82216s, valid=True
2026-06-03T12:06:55.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:06:55.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:06:55.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:07:12, diff=-16.174289s, valid=True
2026-06-03T12:06:55.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:06:55.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:06:55.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:06:33, diff=22.83404s, valid=True
2026-06-03T12:06:55.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:06:55.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:06:55.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:06:55.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:06:55.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:06:55.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:06:55.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:07:12, diff=-16.162145s, valid=True
2026-06-03T12:06:55.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:06:55.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:06:55.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:06:55.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55412.838677s, valid=False
2026-06-03T12:06:55.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:06:55.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:06:55.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:06:55.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:06:55.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:06:55.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:06:55.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:06:55.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:06:55.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:06:55.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:06:56.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:06:56.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:06:56.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:06:56.160 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:06:56.366 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:06:56.761 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:06:56.865 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:06:56.865 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:06:56.865 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:06:56.937 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:06:56.937 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:07:26.967 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:07:26.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:07:26.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:07:27.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:07:27.120 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:07:27.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:07:27.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:07:27.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:07:27.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:07:27.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:07:27.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:07:27.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:07:27.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:07:30.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:07:30.097 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:07:30.097 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:07:30.097 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:07:30.106 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:07:30.117 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:07:30.118 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:07:30.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:07:30.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:07:30.118 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:07:30.118 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:07:30.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:07:30.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:07:30.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:07:30.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:07:30.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:07:30.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:07:30.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:07:30.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:07:30.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:07:30.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:07:30.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:07:30.399 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:07:30.468 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:07:07
2026-06-03T12:07:30.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85983, datetime.datetime(2026, 6, 3, 12, 7, 7), datetime.datetime(2026, 6, 3, 12, 7, 7), 'salt', 7.01, 99.54, None, 32.18, 101.68, 0.07, 823.33, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:07:30.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:07:30.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:07:30.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:07:07, diff=23.477573s, valid=True
2026-06-03T12:07:30.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:07:30.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:07:30.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:07:12, diff=18.481163s, valid=True
2026-06-03T12:07:30.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:07:30.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:07:30.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:07:03, diff=27.48892s, valid=True
2026-06-03T12:07:30.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:07:30.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:07:30.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:07:30.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:07:30.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:07:30.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:07:30.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:07:12, diff=18.492403s, valid=True
2026-06-03T12:07:30.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:07:30.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:07:30.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:07:30.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55447.493159s, valid=False
2026-06-03T12:07:30.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:07:30.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:07:30.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:07:30.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:07:30.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:07:30.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:07:30.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:07:30.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:07:30.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:07:30.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:07:30.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:07:30.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:07:30.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:07:30.810 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:07:31.015 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:07:31.353 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:07:31.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:07:31.454 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:07:31.454 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:07:31.611 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:07:31.611 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:08:01.640 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:08:01.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:08:01.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:08:01.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:08:01.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:08:02.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:08:02.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:08:02.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:08:02.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:08:02.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:08:02.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:08:02.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:08:02.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:08:04.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:08:04.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:08:04.828 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:08:04.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:08:04.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:08:04.852 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:08:04.853 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:08:04.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:08:04.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:08:04.854 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:08:04.854 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:08:04.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:08:04.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:08:04.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:08:05.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:08:05.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:08:05.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:08:05.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:08:05.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:08:05.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:08:05.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:08:05.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:08:05.192 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:08:05.294 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:07:38
2026-06-03T12:08:05.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85984, datetime.datetime(2026, 6, 3, 12, 7, 38), datetime.datetime(2026, 6, 3, 12, 7, 37), 'salt', 7.01, 99.54, None, 30.03, 105.86, 0.07, 823.52, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:08:05.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:08:05.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:08:05.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:07:37, diff=28.301791s, valid=True
2026-06-03T12:08:05.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:08:05.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:08:05.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:08:12, diff=-6.694734s, valid=True
2026-06-03T12:08:05.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:08:05.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:08:05.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:07:33, diff=32.313489s, valid=True
2026-06-03T12:08:05.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:08:05.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:08:05.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:08:05.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:08:05.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:08:05.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:08:05.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:08:12, diff=-6.682783s, valid=True
2026-06-03T12:08:05.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:08:05.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:08:05.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:08:05.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55482.318027s, valid=False
2026-06-03T12:08:05.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:08:05.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:08:05.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:08:05.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:08:05.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:08:05.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:08:05.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:08:05.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:08:05.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:08:05.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:08:05.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:08:05.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:08:05.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:08:05.712 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:08:05.917 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:08:06.256 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:08:06.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:08:06.360 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:08:06.360 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:08:06.542 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:08:06.543 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:08:36.570 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:08:36.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:08:36.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:08:37.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:08:37.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:08:37.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:08:37.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:08:37.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:08:37.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:08:37.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:08:37.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:08:37.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:08:37.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:08:39.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:08:40.002 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:08:40.002 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:08:40.002 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:08:40.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:08:40.023 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:08:40.023 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:08:40.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:08:40.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:08:40.024 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:08:40.024 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:08:40.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:08:40.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:08:40.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:08:40.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:08:40.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:08:40.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:08:40.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:08:40.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:08:40.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:08:40.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:08:40.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:08:40.325 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:08:40.410 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:08:38
2026-06-03T12:08:40.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85986, datetime.datetime(2026, 6, 3, 12, 8, 38), datetime.datetime(2026, 6, 3, 12, 8, 37), 'salt', 7.01, 99.54, None, 37.96, 100.32, 0.07, 823.33, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:08:40.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:08:40.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:08:40.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:08:37, diff=3.416921s, valid=True
2026-06-03T12:08:40.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:08:40.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:08:40.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:09:12, diff=-31.579962s, valid=True
2026-06-03T12:08:40.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:08:40.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:08:40.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:08:35, diff=5.427504s, valid=True
2026-06-03T12:08:40.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:08:40.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:08:40.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:08:40.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:08:40.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:08:40.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:08:40.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:09:12, diff=-31.569028s, valid=True
2026-06-03T12:08:40.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:08:40.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:08:40.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:08:40.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55517.43173s, valid=False
2026-06-03T12:08:40.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:08:40.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:08:40.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:08:40.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:08:40.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:08:40.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:08:40.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:08:40.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:08:40.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:08:40.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:08:40.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:08:40.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:08:40.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:08:40.754 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:08:40.962 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:08:41.305 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:08:41.409 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:08:41.409 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:08:41.409 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:08:41.479 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:08:41.479 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:09:11.484 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:09:11.484 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:09:11.485 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:09:11.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:09:11.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:09:11.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:09:11.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:09:11.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:09:11.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:09:11.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:09:11.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:09:11.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:09:11.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:09:14.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:09:14.696 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:09:14.697 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:09:14.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:09:14.707 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:09:14.719 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:09:14.720 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:09:14.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:09:14.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:09:14.721 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:09:14.721 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:09:14.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:09:14.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:09:14.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:09:14.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:09:14.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:09:15.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:09:15.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:09:15.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:09:15.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:09:15.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:09:15.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:09:15.050 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:09:15.119 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:09:08
2026-06-03T12:09:15.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85987, datetime.datetime(2026, 6, 3, 12, 9, 8), datetime.datetime(2026, 6, 3, 12, 9, 8), 'salt', 7.01, 99.54, None, 33.84, 103.18, 0.07, 823.27, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:09:15.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:09:15.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:09:15.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:09:08, diff=7.126484s, valid=True
2026-06-03T12:09:15.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:09:15.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:09:15.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:09:12, diff=3.130034s, valid=True
2026-06-03T12:09:15.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:09:15.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:09:15.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:09:06, diff=9.138233s, valid=True
2026-06-03T12:09:15.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:09:15.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:09:15.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:09:15.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:09:15.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:09:15.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:09:15.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:09:12, diff=3.141952s, valid=True
2026-06-03T12:09:15.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:09:15.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:09:15.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:09:15.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55552.142772s, valid=False
2026-06-03T12:09:15.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:09:15.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:09:15.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:09:15.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:09:15.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:09:15.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:09:15.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:09:15.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:09:15.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:09:15.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:09:15.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:09:15.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:09:15.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:09:15.532 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:09:15.738 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:09:16.101 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:09:16.203 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:09:16.203 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:09:16.203 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:09:16.275 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:09:16.276 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:09:46.289 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:09:46.289 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:09:46.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:09:46.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:09:46.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:09:46.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:09:46.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:09:46.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:09:46.728 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:09:46.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:09:46.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:09:46.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:09:46.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:09:49.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:09:49.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:09:49.392 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:09:49.392 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:09:49.400 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:09:49.412 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:09:49.412 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:09:49.412 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:09:49.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:09:49.412 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:09:49.412 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:09:49.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:09:49.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:09:49.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:09:49.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:09:49.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:09:49.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:09:49.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:09:49.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:09:49.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:09:49.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:09:49.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:09:49.739 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:09:49.809 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:09:39
2026-06-03T12:09:49.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85988, datetime.datetime(2026, 6, 3, 12, 9, 39), datetime.datetime(2026, 6, 3, 12, 9, 38), 'salt', 6.94, 99.54, None, 33.31, 97.17, 0.06, 823.46, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:09:49.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:09:49.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:09:49.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:09:38, diff=11.81623s, valid=True
2026-06-03T12:09:49.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:09:49.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:09:49.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:10:12, diff=-22.18035s, valid=True
2026-06-03T12:09:49.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:09:49.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:09:49.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:09:37, diff=12.828479s, valid=True
2026-06-03T12:09:49.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:09:49.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:09:49.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:09:49.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:09:49.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:09:49.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:09:49.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:10:12, diff=-22.167753s, valid=True
2026-06-03T12:09:49.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:09:49.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:09:49.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:09:49.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55586.832985s, valid=False
2026-06-03T12:09:49.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:09:49.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:09:49.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:09:49.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:09:49.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:09:49.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:09:49.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:09:49.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:09:49.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:09:49.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:09:50.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:09:50.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:09:50.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:09:50.171 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:09:50.376 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:09:50.719 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:09:50.822 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:09:50.822 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:09:50.822 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:09:50.979 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:09:50.979 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:10:21.009 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:10:21.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:10:21.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:10:21.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:10:21.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:10:21.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:10:21.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:10:21.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:10:21.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:10:21.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:10:21.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:10:21.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:10:21.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:10:24.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:10:24.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:10:24.245 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:10:24.245 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:10:24.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:10:24.269 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:10:24.269 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:10:24.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:10:24.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:10:24.271 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:10:24.271 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:10:24.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:10:24.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:10:24.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:10:24.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:10:24.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:10:24.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:10:24.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:10:24.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:10:24.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:10:24.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:10:24.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:10:24.600 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:10:24.669 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:10:09
2026-06-03T12:10:24.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85989, datetime.datetime(2026, 6, 3, 12, 10, 9), datetime.datetime(2026, 6, 3, 12, 10, 8), 'salt', 7.04, 99.58, None, 33.94, 99.1, 0.06, 823.39, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:10:24.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:10:24.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:10:24.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:10:08, diff=16.676917s, valid=True
2026-06-03T12:10:24.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:10:24.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:10:24.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:10:12, diff=12.68025s, valid=True
2026-06-03T12:10:24.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:10:24.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:10:24.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:10:09, diff=15.688176s, valid=True
2026-06-03T12:10:24.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:10:24.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:10:24.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:10:24.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:10:24.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:10:24.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:10:24.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:10:12, diff=12.691756s, valid=True
2026-06-03T12:10:24.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:10:24.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:10:24.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:10:24.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55621.692521s, valid=False
2026-06-03T12:10:24.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:10:24.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:10:24.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:10:24.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:10:24.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:10:24.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:10:24.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:10:24.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:10:24.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:10:24.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:10:24.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:10:24.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:10:25.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:10:25.084 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:10:25.290 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:10:25.631 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:10:25.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:10:25.732 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:10:25.733 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:10:25.906 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:10:25.906 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:10:55.927 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:10:55.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:10:55.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:10:56.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:10:56.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:10:56.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:10:56.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:10:56.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:10:56.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:10:56.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:10:56.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:10:56.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:10:56.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:10:58.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:10:58.987 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:10:58.988 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:10:58.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:10:58.999 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:10:59.012 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:10:59.012 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:10:59.013 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:10:59.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:10:59.014 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:10:59.014 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:10:59.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:10:59.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:10:59.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:10:59.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:10:59.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:10:59.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:10:59.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:10:59.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:10:59.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:10:59.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:10:59.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:10:59.351 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:10:59.421 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:10:39
2026-06-03T12:10:59.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85990, datetime.datetime(2026, 6, 3, 12, 10, 39), datetime.datetime(2026, 6, 3, 12, 10, 38), 'salt', 7.04, 99.58, None, 34.65, 103.32, 0.06, 823.21, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:10:59.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:10:59.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:10:59.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:10:38, diff=21.427508s, valid=True
2026-06-03T12:10:59.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:10:59.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:10:59.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:11:12, diff=-12.569654s, valid=True
2026-06-03T12:10:59.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:10:59.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:10:59.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:10:35, diff=24.437251s, valid=True
2026-06-03T12:10:59.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:10:59.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:10:59.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:10:59.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:10:59.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:10:59.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:10:59.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:11:12, diff=-12.559698s, valid=True
2026-06-03T12:10:59.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:10:59.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:10:59.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:10:59.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55656.440984s, valid=False
2026-06-03T12:10:59.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:10:59.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:10:59.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:10:59.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:10:59.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:10:59.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:10:59.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:10:59.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:10:59.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:10:59.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:10:59.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:10:59.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:10:59.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:10:59.759 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:10:59.976 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:11:00.323 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:11:00.428 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:11:00.428 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:11:00.428 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:11:01.927 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:11:01.927 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:11:31.944 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:11:31.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:11:31.944 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:11:32.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:11:32.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:11:32.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:11:32.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:11:32.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:11:32.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:11:32.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:11:32.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:11:32.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:11:32.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:11:35.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:11:35.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:11:35.407 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:11:35.407 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:11:35.417 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:11:35.430 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:11:35.430 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:11:35.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:11:35.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:11:35.432 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:11:35.432 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:11:35.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:11:35.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:11:35.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:11:35.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:11:35.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:11:35.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:11:35.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:11:35.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:11:35.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:11:35.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:11:35.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:11:35.774 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:11:35.845 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:11:09
2026-06-03T12:11:35.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85991, datetime.datetime(2026, 6, 3, 12, 11, 9), datetime.datetime(2026, 6, 3, 12, 11, 9), 'salt', 7.04, 99.54, None, 37.58, 104.87, 0.06, 823.33, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:11:35.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:11:35.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:11:35.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:11:09, diff=26.852652s, valid=True
2026-06-03T12:11:35.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:11:35.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:11:35.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:11:12, diff=23.856247s, valid=True
2026-06-03T12:11:35.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:11:35.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:11:35.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:11:05, diff=30.864403s, valid=True
2026-06-03T12:11:35.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:11:35.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:11:35.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:11:35.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:11:35.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:11:35.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:11:35.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:11:12, diff=23.868143s, valid=True
2026-06-03T12:11:35.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:11:35.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:11:35.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:11:35.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55692.868946s, valid=False
2026-06-03T12:11:35.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:11:35.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:11:35.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:11:35.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:11:35.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:11:35.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:11:35.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:11:35.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:11:35.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:11:36.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:11:36.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:11:36.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:11:36.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:11:36.188 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:11:36.394 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:11:36.729 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:11:36.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:11:36.830 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:11:36.830 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:11:36.986 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:11:36.986 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:12:07.013 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:12:07.013 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:12:07.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:12:07.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:12:07.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:12:07.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:12:07.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:12:07.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:12:07.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:12:07.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:12:07.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:12:07.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:12:07.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:12:10.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:12:10.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:12:10.291 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:12:10.292 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:12:10.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:12:10.317 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:12:10.317 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:12:10.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:12:10.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:12:10.319 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:12:10.319 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:12:10.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:12:10.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:12:10.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:12:10.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:12:10.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:12:10.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:12:10.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:12:10.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:12:10.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:12:10.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:12:10.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:12:10.660 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:12:10.727 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:12:10
2026-06-03T12:12:10.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85993, datetime.datetime(2026, 6, 3, 12, 12, 10), datetime.datetime(2026, 6, 3, 12, 12, 9), 'salt', 7.01, 99.51, None, 37.29, 97.99, 0.07, 823.39, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:12:10.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:12:10.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:12:10.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:12:09, diff=1.734103s, valid=True
2026-06-03T12:12:10.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:12:10.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:12:10.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:12:12, diff=-1.263091s, valid=True
2026-06-03T12:12:10.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:12:10.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:12:10.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:12:05, diff=5.743602s, valid=True
2026-06-03T12:12:10.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:12:10.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:12:10.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:12:10.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:12:10.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:12:10.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:12:10.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:12:12, diff=-1.253433s, valid=True
2026-06-03T12:12:10.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:12:10.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:12:10.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:12:10.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55727.747213s, valid=False
2026-06-03T12:12:10.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:12:10.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:12:10.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:12:10.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:12:10.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:12:10.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:12:10.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:12:10.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:12:10.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:12:10.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:12:10.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:12:10.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:12:11.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:12:11.096 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:12:11.306 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:12:11.648 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:12:11.813 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:12:11.813 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:12:11.814 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:12:11.985 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:12:11.985 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:12:42.014 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:12:42.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:12:42.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:12:42.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:12:42.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:12:42.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:12:42.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:12:42.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:12:42.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:12:42.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:12:42.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:12:42.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:12:42.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:12:45.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:12:45.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:12:45.253 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:12:45.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:12:45.265 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:12:45.277 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:12:45.278 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:12:45.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:12:45.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:12:45.279 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:12:45.279 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:12:45.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:12:45.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:12:45.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:12:45.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:12:45.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:12:45.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:12:45.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:12:45.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:12:45.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:12:45.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:12:45.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:12:45.640 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:12:45.723 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:12:40
2026-06-03T12:12:45.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85994, datetime.datetime(2026, 6, 3, 12, 12, 40), datetime.datetime(2026, 6, 3, 12, 12, 39), 'salt', 6.94, 99.51, None, 34.61, 100.55, 0.07, 823.27, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:12:45.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:12:45.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:12:45.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:12:39, diff=6.731135s, valid=True
2026-06-03T12:12:45.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:12:45.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:12:45.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:13:12, diff=-26.265229s, valid=True
2026-06-03T12:12:45.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:12:45.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:12:45.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:12:35, diff=10.743264s, valid=True
2026-06-03T12:12:45.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:12:45.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:12:45.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:12:45.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:12:45.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:12:45.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:12:45.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:13:12, diff=-26.252891s, valid=True
2026-06-03T12:12:45.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:12:45.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:12:45.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:12:45.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55762.747969s, valid=False
2026-06-03T12:12:45.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:12:45.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:12:45.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:12:45.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:12:45.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:12:45.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:12:45.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:12:45.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:12:45.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:12:45.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:12:45.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:12:45.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:12:46.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:12:46.071 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:12:46.280 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:12:46.619 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:12:46.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:12:46.721 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:12:46.721 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:12:46.804 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:12:46.805 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:13:16.821 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:13:16.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:13:16.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:13:17.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:13:17.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:13:17.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:13:17.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:13:17.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:13:17.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:13:17.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:13:17.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:13:17.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:13:17.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:13:20.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:13:20.170 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:13:20.170 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:13:20.170 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:13:20.181 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:13:20.193 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:13:20.193 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:13:20.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:13:20.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:13:20.194 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:13:20.194 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:13:20.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:13:20.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:13:20.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:13:20.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:13:20.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:13:20.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:13:20.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:13:20.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:13:20.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:13:20.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:13:20.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:13:20.524 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:13:20.602 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:13:10
2026-06-03T12:13:20.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85995, datetime.datetime(2026, 6, 3, 12, 13, 10), datetime.datetime(2026, 6, 3, 12, 13, 10), 'salt', 6.97, 99.58, None, 32.74, 108.89, 0.05, 823.27, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:13:20.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:13:20.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:13:20.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:13:10, diff=10.609446s, valid=True
2026-06-03T12:13:20.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:13:20.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:13:20.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:13:12, diff=8.612873s, valid=True
2026-06-03T12:13:20.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:13:20.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:13:20.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:13:07, diff=13.620762s, valid=True
2026-06-03T12:13:20.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:13:20.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:13:20.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:13:20.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:13:20.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:13:20.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:13:20.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:13:12, diff=8.624367s, valid=True
2026-06-03T12:13:20.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:13:20.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:13:20.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:13:20.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55797.625189s, valid=False
2026-06-03T12:13:20.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:13:20.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:13:20.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:13:20.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:13:20.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:13:20.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:13:20.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:13:20.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:13:20.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:13:20.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:13:20.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:13:20.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:13:20.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:13:20.944 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:13:21.242 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:13:21.580 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:13:21.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:13:21.684 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:13:21.684 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:13:21.834 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:13:21.834 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:13:51.835 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:13:51.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:13:51.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:13:51.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:13:51.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:13:52.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:13:52.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:13:52.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:13:52.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:13:52.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:13:52.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:13:52.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:13:52.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:13:54.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:13:54.900 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:13:54.900 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:13:54.900 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:13:54.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:13:54.920 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:13:54.920 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:13:54.921 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:13:54.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:13:54.921 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:13:54.921 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:13:54.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:13:55.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:13:55.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:13:55.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:13:55.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:13:55.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:13:55.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:13:55.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:13:55.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:13:55.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:13:55.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:13:55.287 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:13:55.384 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:13:41
2026-06-03T12:13:55.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85996, datetime.datetime(2026, 6, 3, 12, 13, 41), datetime.datetime(2026, 6, 3, 12, 13, 40), 'salt', 6.94, 99.54, None, 30.98, 97.34, 0.06, 823.21, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:13:55.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:13:55.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:13:55.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:13:40, diff=15.39205s, valid=True
2026-06-03T12:13:55.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:13:55.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:13:55.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:14:12, diff=-16.604351s, valid=True
2026-06-03T12:13:55.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:13:55.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:13:55.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:13:38, diff=17.404022s, valid=True
2026-06-03T12:13:55.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:13:55.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:13:55.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:13:55.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:13:55.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:13:55.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:13:55.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:14:12, diff=-16.592195s, valid=True
2026-06-03T12:13:55.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:13:55.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:13:55.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:13:55.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55832.408609s, valid=False
2026-06-03T12:13:55.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:13:55.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:13:55.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:13:55.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:13:55.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:13:55.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:13:55.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:13:55.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:13:55.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:13:55.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:13:55.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:13:55.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:13:55.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:13:55.737 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:13:55.948 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:13:56.288 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:13:56.395 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:13:56.396 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:13:56.396 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:13:56.578 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:13:56.578 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:14:26.583 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:14:26.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:14:26.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:14:26.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:14:26.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:14:26.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:14:26.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:14:26.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:14:26.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:14:26.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:14:26.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:14:27.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:14:27.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:14:29.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:14:29.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:14:29.748 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:14:29.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:14:29.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:14:29.771 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:14:29.771 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:14:29.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:14:29.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:14:29.772 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:14:29.773 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:14:29.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:14:29.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:14:29.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:14:29.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:14:29.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:14:30.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:14:30.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:14:30.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:14:30.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:14:30.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:14:30.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:14:30.070 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:14:30.139 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:14:11
2026-06-03T12:14:30.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85997, datetime.datetime(2026, 6, 3, 12, 14, 11), datetime.datetime(2026, 6, 3, 12, 14, 10), 'salt', 7.01, 99.54, None, 26.22, 101.37, 0.07, 823.03, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:14:30.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:14:30.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:14:30.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:14:10, diff=20.146754s, valid=True
2026-06-03T12:14:30.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:14:30.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:14:30.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:14:12, diff=18.149846s, valid=True
2026-06-03T12:14:30.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:14:30.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:14:30.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:14:10, diff=20.156936s, valid=True
2026-06-03T12:14:30.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:14:30.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:14:30.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:14:30.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:14:30.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:14:30.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:14:30.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:14:12, diff=18.160233s, valid=True
2026-06-03T12:14:30.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:14:30.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:14:30.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:14:30.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55867.160957s, valid=False
2026-06-03T12:14:30.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:14:30.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:14:30.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:14:30.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:14:30.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:14:30.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:14:30.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:14:30.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:14:30.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:14:30.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:14:30.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:14:30.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:14:30.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:14:30.546 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:14:30.749 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:14:31.087 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:14:31.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:14:31.194 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:14:31.194 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:14:31.340 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:14:31.340 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:15:01.370 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:15:01.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:15:01.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:15:01.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:15:01.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:15:01.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:15:01.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:15:01.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:15:01.778 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:15:01.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:15:01.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:15:01.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:15:01.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:15:04.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:15:04.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:15:04.456 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:15:04.456 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:15:04.465 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:15:04.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:15:04.477 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:15:04.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:15:04.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:15:04.477 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:15:04.477 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:15:04.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:15:04.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:15:04.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:15:04.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:15:04.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:15:04.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:15:04.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:15:04.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:15:04.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:15:04.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:15:04.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:15:04.757 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:15:04.828 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:14:41
2026-06-03T12:15:04.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85998, datetime.datetime(2026, 6, 3, 12, 14, 41), datetime.datetime(2026, 6, 3, 12, 14, 41), 'salt', 6.97, 99.51, None, 31.69, 99.61, 0.06, 823.39, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:15:04.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:15:04.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:15:04.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:14:41, diff=23.835653s, valid=True
2026-06-03T12:15:04.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:15:04.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:15:04.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:15:12, diff=-7.161212s, valid=True
2026-06-03T12:15:04.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:15:04.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:15:04.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:14:37, diff=27.846402s, valid=True
2026-06-03T12:15:04.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:15:04.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:15:04.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:15:04.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:15:04.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:15:04.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:15:04.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:15:12, diff=-7.150242s, valid=True
2026-06-03T12:15:04.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:15:04.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:15:04.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:15:04.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55901.850471s, valid=False
2026-06-03T12:15:04.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:15:04.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:15:04.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:15:04.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:15:04.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:15:04.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:15:04.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:15:04.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:15:04.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:15:04.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:15:05.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:15:05.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:15:05.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:15:05.167 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:15:05.375 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:15:05.720 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:15:05.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:15:05.824 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:15:05.824 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:15:05.994 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:15:05.995 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:15:36.021 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:15:36.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:15:36.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:15:36.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:15:36.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:15:36.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:15:36.428 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:15:36.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:15:36.437 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:15:36.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:15:36.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:15:36.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:15:36.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:15:39.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:15:39.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:15:39.110 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:15:39.111 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:15:39.120 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:15:39.133 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:15:39.133 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:15:39.134 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:15:39.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:15:39.135 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:15:39.135 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:15:39.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:15:39.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:15:39.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:15:39.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:15:39.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:15:39.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:15:39.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:15:39.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:15:39.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:15:39.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:15:39.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:15:39.480 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:15:39.570 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:15:12
2026-06-03T12:15:39.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(85999, datetime.datetime(2026, 6, 3, 12, 15, 12), datetime.datetime(2026, 6, 3, 12, 15, 11), 'salt', 7.01, 99.48, None, 26.82, 112.69, 0.07, 823.09, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:15:39.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:15:39.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:15:39.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:15:11, diff=28.577521s, valid=True
2026-06-03T12:15:39.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:15:39.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:15:39.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:15:12, diff=27.58104s, valid=True
2026-06-03T12:15:39.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:15:39.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:15:39.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:15:07, diff=32.589382s, valid=True
2026-06-03T12:15:39.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:15:39.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:15:39.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:15:39.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:15:39.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:15:39.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:15:39.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:15:12, diff=27.593141s, valid=True
2026-06-03T12:15:39.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:15:39.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:15:39.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:15:39.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55936.593958s, valid=False
2026-06-03T12:15:39.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:15:39.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:15:39.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:15:39.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:15:39.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:15:39.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:15:39.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:15:39.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:15:39.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:15:39.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:15:39.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:15:39.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:15:39.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:15:39.994 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:15:40.208 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:15:40.548 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:15:40.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:15:40.650 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:15:40.651 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:15:40.881 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:15:40.881 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:16:10.895 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:16:10.896 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:16:10.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:16:11.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:16:11.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:16:11.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:16:11.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:16:11.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:16:11.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:16:11.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:16:11.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:16:11.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:16:11.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:16:14.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:16:14.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:16:14.185 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:16:14.186 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:16:14.196 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:16:14.209 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:16:14.210 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:16:14.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:16:14.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:16:14.211 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:16:14.211 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:16:14.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:16:14.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:16:14.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:16:14.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:16:14.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:16:14.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:16:14.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:16:14.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:16:14.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:16:14.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:16:14.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:16:14.563 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:16:14.637 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:16:12
2026-06-03T12:16:14.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86001, datetime.datetime(2026, 6, 3, 12, 16, 12), datetime.datetime(2026, 6, 3, 12, 16, 11), 'salt', 7.04, 99.58, None, 31.65, 106.07, 0.06, 823.03, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:16:14.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:16:14.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:16:14.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:16:11, diff=3.64463s, valid=True
2026-06-03T12:16:14.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:16:14.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:16:14.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:16:12, diff=2.648098s, valid=True
2026-06-03T12:16:14.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:16:14.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:16:14.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:16:07, diff=7.656189s, valid=True
2026-06-03T12:16:14.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:16:14.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:16:14.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:16:14.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:16:14.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:16:14.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:16:14.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:16:12, diff=2.659916s, valid=True
2026-06-03T12:16:14.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:16:14.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:16:14.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:16:14.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=55971.660729s, valid=False
2026-06-03T12:16:14.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:16:14.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:16:14.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:16:14.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:16:14.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:16:14.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:16:14.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:16:14.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:16:14.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:16:14.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:16:14.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:16:14.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:16:14.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:16:14.982 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:16:15.186 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:16:15.524 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:16:15.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:16:15.627 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:16:15.627 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:16:15.699 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:16:15.699 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:16:45.730 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:16:45.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:16:45.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:16:45.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:16:45.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:16:46.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:16:46.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:16:46.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:16:46.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:16:46.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:16:46.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:16:46.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:16:46.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:16:48.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:16:48.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:16:48.831 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:16:48.831 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:16:48.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:16:48.854 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:16:48.854 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:16:48.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:16:48.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:16:48.855 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:16:48.856 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:16:48.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:16:49.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:16:49.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:16:49.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:16:49.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:16:49.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:16:49.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:16:49.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:16:49.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:16:49.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:16:49.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:16:49.274 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:16:49.350 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:16:42
2026-06-03T12:16:49.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86002, datetime.datetime(2026, 6, 3, 12, 16, 42), datetime.datetime(2026, 6, 3, 12, 16, 42), 'salt', 7.04, 99.61, None, 33.38, 107.43, 0.05, 823.21, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:16:49.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:16:49.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:16:49.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:16:42, diff=7.356557s, valid=True
2026-06-03T12:16:49.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:16:49.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:16:49.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:17:12, diff=-22.640571s, valid=True
2026-06-03T12:16:49.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:16:49.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:16:49.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:16:38, diff=11.36609s, valid=True
2026-06-03T12:16:49.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:16:49.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:16:49.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:16:49.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:16:49.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:16:49.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:16:49.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:17:12, diff=-22.630922s, valid=True
2026-06-03T12:16:49.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:16:49.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:16:49.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:16:49.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56006.369728s, valid=False
2026-06-03T12:16:49.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:16:49.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:16:49.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:16:49.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:16:49.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:16:49.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:16:49.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:16:49.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:16:49.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:16:49.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:16:49.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:16:49.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:16:49.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:16:49.680 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:16:49.893 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:16:50.256 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:16:50.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:16:50.364 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:16:50.364 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:16:50.515 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:16:50.515 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:17:20.545 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:17:20.546 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:17:20.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:17:20.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:17:20.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:17:20.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:17:20.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:17:20.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:17:20.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:17:20.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:17:20.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:17:20.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:17:20.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:17:23.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:17:23.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:17:23.641 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:17:23.641 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:17:23.652 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:17:23.665 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:17:23.666 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:17:23.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:17:23.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:17:23.667 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:17:23.667 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:17:23.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:17:23.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:17:23.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:17:23.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:17:23.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:17:23.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:17:23.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:17:24.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:17:24.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:17:24.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:17:24.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:17:24.026 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:17:24.097 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:17:13
2026-06-03T12:17:24.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86003, datetime.datetime(2026, 6, 3, 12, 17, 13), datetime.datetime(2026, 6, 3, 12, 17, 12), 'salt', 7.04, 99.64, None, 35.92, 97.95, 0.05, 823.15, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:17:24.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:17:24.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:17:24.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:17:12, diff=12.105185s, valid=True
2026-06-03T12:17:24.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:17:24.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:17:24.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:17:12, diff=12.108721s, valid=True
2026-06-03T12:17:24.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:17:24.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:17:24.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:17:08, diff=16.116901s, valid=True
2026-06-03T12:17:24.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:17:24.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:17:24.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:17:24.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:17:24.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:17:24.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:17:24.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:17:12, diff=12.120595s, valid=True
2026-06-03T12:17:24.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:17:24.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:17:24.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:17:24.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56041.121396s, valid=False
2026-06-03T12:17:24.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:17:24.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:17:24.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:17:24.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:17:24.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:17:24.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:17:24.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:17:24.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:17:24.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:17:24.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:17:24.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:17:24.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:17:24.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:17:24.443 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:17:24.647 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:17:24.986 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:17:25.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:17:25.088 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:17:25.088 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:17:25.252 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:17:25.253 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:17:55.263 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:17:55.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:17:55.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:17:55.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:17:55.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:17:55.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:17:55.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:17:55.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:17:55.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:17:55.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:17:55.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:17:55.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:17:55.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:17:58.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:17:58.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:17:58.456 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:17:58.456 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:17:58.467 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:17:58.479 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:17:58.480 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:17:58.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:17:58.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:17:58.481 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:17:58.481 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:17:58.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:17:58.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:17:58.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:17:58.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:17:58.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:17:58.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:17:58.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:17:58.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:17:58.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:17:58.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:17:58.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:17:58.852 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:17:58.947 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:17:43
2026-06-03T12:17:58.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86004, datetime.datetime(2026, 6, 3, 12, 17, 43), datetime.datetime(2026, 6, 3, 12, 17, 42), 'salt', 7.04, 99.58, None, 34.86, 111.24, 0.06, 823.33, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:17:58.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:17:58.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:17:58.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:17:42, diff=16.955318s, valid=True
2026-06-03T12:17:58.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:17:58.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:17:58.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:18:12, diff=-13.041178s, valid=True
2026-06-03T12:17:58.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:17:58.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:17:58.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:17:39, diff=19.967179s, valid=True
2026-06-03T12:17:58.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:17:58.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:17:58.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:17:58.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:17:58.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:17:58.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:17:58.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:18:12, diff=-13.029056s, valid=True
2026-06-03T12:17:58.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:17:58.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:17:58.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:17:58.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56075.971759s, valid=False
2026-06-03T12:17:58.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:17:58.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:17:58.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:17:58.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:17:58.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:17:59.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:17:59.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:17:59.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:17:59.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:17:59.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:17:59.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:17:59.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:17:59.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:17:59.292 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:17:59.540 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:17:59.885 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:17:59.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:17:59.993 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:17:59.993 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:18:00.186 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:18:00.186 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:18:30.208 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:18:30.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:18:30.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:18:30.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:18:30.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:18:30.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:18:30.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:18:30.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:18:30.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:18:30.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:18:30.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:18:30.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:18:30.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:18:33.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:18:33.476 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:18:33.476 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:18:33.477 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:18:33.486 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:18:33.499 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:18:33.499 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:18:33.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:18:33.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:18:33.501 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:18:33.501 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:18:33.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:18:33.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:18:33.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:18:33.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:18:33.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:18:33.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:18:33.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:18:33.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:18:33.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:18:33.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:18:33.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:18:33.827 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:18:33.896 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:18:13
2026-06-03T12:18:33.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86005, datetime.datetime(2026, 6, 3, 12, 18, 13), datetime.datetime(2026, 6, 3, 12, 18, 13), 'salt', 7.04, 99.61, None, 33.06, 101.14, 0.05, 823.27, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:18:33.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:18:33.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:18:33.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:18:13, diff=20.903527s, valid=True
2026-06-03T12:18:33.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:18:33.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:18:33.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:18:12, diff=21.906951s, valid=True
2026-06-03T12:18:33.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:18:33.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:18:33.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:18:10, diff=23.914868s, valid=True
2026-06-03T12:18:33.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:18:33.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:18:33.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:18:33.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:18:33.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:18:33.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:18:33.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:18:12, diff=21.918476s, valid=True
2026-06-03T12:18:33.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:18:33.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:18:33.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:18:33.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56110.919272s, valid=False
2026-06-03T12:18:33.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:18:33.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:18:33.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:18:33.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:18:33.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:18:33.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:18:33.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:18:33.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:18:34.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:18:34.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:18:34.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:18:34.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:18:34.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:18:34.239 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:18:34.443 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:18:34.857 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:18:34.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:18:34.958 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:18:34.958 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:18:35.029 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:18:35.030 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:19:05.050 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:19:05.050 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:19:05.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:19:05.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:19:05.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:19:05.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:19:05.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:19:05.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:19:05.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:19:05.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:19:05.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:19:05.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:19:05.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:19:07.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:19:07.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:19:07.989 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:19:07.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:19:08.000 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:19:08.012 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:19:08.013 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:19:08.013 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:19:08.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:19:08.014 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:19:08.014 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:19:08.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:19:08.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:19:08.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:19:08.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:19:08.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:19:08.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:19:08.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:19:08.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:19:08.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:19:08.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:19:08.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:19:08.344 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:19:08.411 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:18:44
2026-06-03T12:19:08.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86006, datetime.datetime(2026, 6, 3, 12, 18, 44), datetime.datetime(2026, 6, 3, 12, 18, 43), 'salt', 6.97, 99.61, None, 33.87, 103.53, 0.05, 823.15, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:19:08.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:19:08.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:19:08.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:18:43, diff=25.419181s, valid=True
2026-06-03T12:19:08.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:19:08.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:19:08.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:19:12, diff=-3.577374s, valid=True
2026-06-03T12:19:08.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:19:08.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:19:08.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:18:42, diff=26.43059s, valid=True
2026-06-03T12:19:08.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:19:08.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:19:08.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:19:08.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:19:08.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:19:08.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:19:08.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:19:12, diff=-3.565783s, valid=True
2026-06-03T12:19:08.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:19:08.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:19:08.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:19:08.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56145.435006s, valid=False
2026-06-03T12:19:08.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:19:08.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:19:08.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:19:08.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:19:08.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:19:08.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:19:08.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:19:08.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:19:08.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:19:08.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:19:08.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:19:08.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:19:08.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:19:08.752 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:19:08.958 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:19:09.297 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:19:09.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:19:09.400 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:19:09.400 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:19:09.649 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:19:09.649 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:19:39.651 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:19:39.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:19:39.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:19:39.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:19:39.792 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:19:40.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:19:40.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:19:40.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:19:40.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:19:40.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:19:40.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:19:40.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:19:40.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:19:42.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:19:42.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:19:42.795 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:19:42.795 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:19:42.804 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:19:42.816 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:19:42.816 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:19:42.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:19:42.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:19:42.816 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:19:42.816 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:19:42.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:19:42.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:19:42.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:19:43.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:19:43.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:19:43.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:19:43.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:19:43.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:19:43.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:19:43.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:19:43.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:19:43.152 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:19:43.222 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:19:14
2026-06-03T12:19:43.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86007, datetime.datetime(2026, 6, 3, 12, 19, 14), datetime.datetime(2026, 6, 3, 12, 19, 13), 'salt', 7.01, 99.61, None, 31.51, 93.09, 0.06, 822.97, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:19:43.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:19:43.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:19:43.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:19:13, diff=30.229496s, valid=True
2026-06-03T12:19:43.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:19:43.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:19:43.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:19:12, diff=31.233078s, valid=True
2026-06-03T12:19:43.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:19:43.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:19:43.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:19:13, diff=30.241175s, valid=True
2026-06-03T12:19:43.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:19:43.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:19:43.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:19:43.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:19:43.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:19:43.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:19:43.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:19:12, diff=31.245032s, valid=True
2026-06-03T12:19:43.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:19:43.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:19:43.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:19:43.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56180.24582s, valid=False
2026-06-03T12:19:43.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:19:43.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:19:43.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:19:43.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:19:43.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:19:43.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:19:43.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:19:43.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:19:43.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:19:43.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:19:43.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:19:43.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:19:43.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:19:43.574 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:19:43.852 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:19:44.193 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:19:44.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:19:44.294 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:19:44.295 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:19:44.476 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:19:44.477 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:20:14.507 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:20:14.507 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:20:14.507 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:20:14.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:20:14.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:20:14.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:20:14.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:20:14.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:20:14.860 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:20:14.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:20:14.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:20:14.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:20:14.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:20:17.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:20:17.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:20:17.561 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:20:17.561 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:20:17.572 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:20:17.585 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:20:17.586 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:20:17.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:20:17.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:20:17.587 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:20:17.587 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:20:17.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:20:17.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:20:17.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:20:17.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:20:17.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:20:17.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:20:17.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:20:17.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:20:17.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:20:17.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:20:17.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:20:17.919 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:20:17.988 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:20:14
2026-06-03T12:20:17.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86009, datetime.datetime(2026, 6, 3, 12, 20, 14), datetime.datetime(2026, 6, 3, 12, 20, 13), 'salt', 6.91, 99.51, None, 41.35, 106.14, 0.07, 822.97, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:20:17.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:20:17.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:20:17.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:20:13, diff=4.996475s, valid=True
2026-06-03T12:20:17.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:20:17.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:20:17.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:20:12, diff=5.999953s, valid=True
2026-06-03T12:20:18.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:20:18.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:20:18.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:20:10, diff=8.008206s, valid=True
2026-06-03T12:20:18.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:20:18.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:20:18.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:20:18.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:20:18.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:20:18.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:20:18.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:20:12, diff=6.011933s, valid=True
2026-06-03T12:20:18.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:20:18.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:20:18.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:20:18.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56215.012739s, valid=False
2026-06-03T12:20:18.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:20:18.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:20:18.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:20:18.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:20:18.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:20:18.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:20:18.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:20:18.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:20:18.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:20:18.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:20:18.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:20:18.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:20:18.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:20:18.332 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:20:18.538 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:20:18.877 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:20:18.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:20:18.980 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:20:18.980 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:20:19.130 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:20:19.130 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:20:49.132 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:20:49.132 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:20:49.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:20:49.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:20:49.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:20:49.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:20:49.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:20:49.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:20:49.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:20:49.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:20:49.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:20:49.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:20:49.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:20:52.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:20:52.373 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:20:52.374 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:20:52.374 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:20:52.384 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:20:52.396 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:20:52.397 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:20:52.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:20:52.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:20:52.398 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:20:52.398 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:20:52.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:20:52.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:20:52.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:20:52.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:20:52.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:20:52.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:20:52.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:20:52.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:20:52.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:20:52.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:20:52.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:20:52.748 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:20:52.817 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:20:44
2026-06-03T12:20:52.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86010, datetime.datetime(2026, 6, 3, 12, 20, 44), datetime.datetime(2026, 6, 3, 12, 20, 44), 'salt', 6.94, 99.61, None, 37.33, 104.73, 0.05, 822.97, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:20:52.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:20:52.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:20:52.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:20:44, diff=8.824633s, valid=True
2026-06-03T12:20:52.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:20:52.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:20:52.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:21:12, diff=-19.171914s, valid=True
2026-06-03T12:20:52.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:20:52.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:20:52.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:20:41, diff=11.836318s, valid=True
2026-06-03T12:20:52.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:20:52.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:20:52.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:20:52.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:20:52.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:20:52.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:20:52.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:21:12, diff=-19.159944s, valid=True
2026-06-03T12:20:52.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:20:52.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:20:52.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:20:52.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56249.840882s, valid=False
2026-06-03T12:20:52.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:20:52.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:20:52.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:20:52.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:20:52.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:20:52.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:20:52.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:20:52.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:20:52.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:20:52.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:20:53.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:20:53.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:20:53.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:20:53.231 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:20:53.436 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:20:53.774 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:20:53.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:20:53.875 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:20:53.875 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:20:54.052 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:20:54.052 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:21:24.082 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:21:24.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:21:24.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:21:24.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:21:24.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:21:24.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:21:24.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:21:24.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:21:24.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:21:24.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:21:24.507 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:21:24.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:21:24.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:21:27.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:21:27.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:21:27.242 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:21:27.243 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:21:27.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:21:27.266 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:21:27.266 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:21:27.267 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:21:27.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:21:27.267 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:21:27.268 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:21:27.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:21:27.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:21:27.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:21:27.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:21:27.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:21:27.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:21:27.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:21:27.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:21:27.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:21:27.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:21:27.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:21:27.636 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:21:27.708 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:21:15
2026-06-03T12:21:27.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86011, datetime.datetime(2026, 6, 3, 12, 21, 15), datetime.datetime(2026, 6, 3, 12, 21, 14), 'salt', 6.94, 99.54, None, 39.69, 97.22, 0.06, 823.09, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:21:27.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:21:27.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:21:27.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:21:14, diff=13.715973s, valid=True
2026-06-03T12:21:27.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:21:27.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:21:27.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:21:12, diff=15.719261s, valid=True
2026-06-03T12:21:27.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:21:27.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:21:27.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:21:11, diff=16.726983s, valid=True
2026-06-03T12:21:27.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:21:27.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:21:27.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:21:27.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:21:27.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:21:27.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:21:27.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:21:12, diff=15.730458s, valid=True
2026-06-03T12:21:27.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:21:27.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:21:27.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:21:27.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56284.731218s, valid=False
2026-06-03T12:21:27.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:21:27.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:21:27.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:21:27.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:21:27.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:21:27.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:21:27.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:21:27.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:21:27.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:21:27.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:21:27.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:21:27.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:21:28.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:21:28.050 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:21:28.257 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:21:28.598 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:21:28.703 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:21:28.703 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:21:28.703 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:21:28.935 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:21:28.935 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:21:58.965 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:21:58.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:21:58.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:21:59.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:21:59.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:21:59.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:21:59.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:21:59.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:21:59.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:21:59.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:21:59.353 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:21:59.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:21:59.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:22:02.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:22:02.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:22:02.016 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:22:02.017 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:22:02.025 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:22:02.036 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:22:02.037 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:22:02.037 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:22:02.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:22:02.037 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:22:02.037 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:22:02.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:22:02.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:22:02.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:22:02.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:22:02.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:22:02.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:22:02.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:22:02.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:22:02.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:22:02.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:22:02.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:22:02.375 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:22:02.449 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:21:45
2026-06-03T12:22:02.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86012, datetime.datetime(2026, 6, 3, 12, 21, 45), datetime.datetime(2026, 6, 3, 12, 21, 44), 'salt', 6.94, 99.54, None, 34.61, 93.39, 0.06, 823.15, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:22:02.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:22:02.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:22:02.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:21:44, diff=18.45735s, valid=True
2026-06-03T12:22:02.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:22:02.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:22:02.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:22:12, diff=-9.539044s, valid=True
2026-06-03T12:22:02.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:22:02.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:22:02.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:21:41, diff=21.469197s, valid=True
2026-06-03T12:22:02.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:22:02.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:22:02.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:22:02.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:22:02.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:22:02.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:22:02.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:22:12, diff=-9.527064s, valid=True
2026-06-03T12:22:02.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:22:02.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:22:02.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:22:02.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56319.473767s, valid=False
2026-06-03T12:22:02.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:22:02.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:22:02.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:22:02.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:22:02.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:22:02.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:22:02.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:22:02.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:22:02.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:22:02.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:22:02.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:22:02.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:22:02.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:22:02.864 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:22:03.068 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:22:03.409 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:22:03.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:22:03.511 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:22:03.511 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:22:03.733 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:22:03.734 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:22:33.750 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:22:33.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:22:33.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:22:33.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:22:33.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:22:34.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:22:34.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:22:34.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:22:34.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:22:34.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:22:34.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:22:34.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:22:34.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:22:36.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:22:36.857 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:22:36.858 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:22:36.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:22:36.869 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:22:36.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:22:36.882 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:22:36.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:22:36.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:22:36.883 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:22:36.884 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:22:36.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:22:37.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:22:37.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:22:37.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:22:37.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:22:37.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:22:37.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:22:37.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:22:37.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:22:37.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:22:37.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:22:37.207 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:22:37.280 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:22:15
2026-06-03T12:22:37.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86013, datetime.datetime(2026, 6, 3, 12, 22, 15), datetime.datetime(2026, 6, 3, 12, 22, 14), 'salt', 6.94, 99.58, None, 37.05, 100.44, 0.06, 822.85, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:22:37.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:22:37.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:22:37.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:22:14, diff=23.28679s, valid=True
2026-06-03T12:22:37.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:22:37.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:22:37.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:22:12, diff=25.289654s, valid=True
2026-06-03T12:22:37.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:22:37.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:22:37.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:22:12, diff=25.296396s, valid=True
2026-06-03T12:22:37.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:22:37.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:22:37.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:22:37.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:22:37.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:22:37.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:22:37.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:22:12, diff=25.299471s, valid=True
2026-06-03T12:22:37.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:22:37.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:22:37.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:22:37.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56354.300134s, valid=False
2026-06-03T12:22:37.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:22:37.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:22:37.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:22:37.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:22:37.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:22:37.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:22:37.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:22:37.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:22:37.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:22:37.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:22:37.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:22:37.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:22:37.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:22:37.618 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:22:37.838 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:22:38.176 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:22:38.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:22:38.278 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:22:38.278 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:22:38.414 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:22:38.414 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:23:08.441 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:23:08.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:23:08.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:23:08.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:23:08.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:23:08.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:23:08.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:23:08.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:23:08.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:23:08.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:23:08.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:23:08.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:23:08.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:23:11.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:23:11.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:23:11.657 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:23:11.657 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:23:11.668 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:23:11.681 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:23:11.681 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:23:11.682 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:23:11.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:23:11.682 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:23:11.683 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:23:11.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:23:11.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:23:11.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:23:11.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:23:11.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:23:11.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:23:11.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:23:12.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:23:12.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:23:12.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:23:12.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:23:12.079 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:23:12.152 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:22:45
2026-06-03T12:23:12.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86014, datetime.datetime(2026, 6, 3, 12, 22, 45), datetime.datetime(2026, 6, 3, 12, 22, 45), 'salt', 6.87, 99.61, None, 32.71, 105.6, 0.05, 822.91, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:23:12.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:23:12.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:23:12.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:22:45, diff=27.158243s, valid=True
2026-06-03T12:23:12.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:23:12.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:23:12.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:23:12, diff=0.161086s, valid=True
2026-06-03T12:23:12.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:23:12.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:23:12.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:22:43, diff=29.167682s, valid=True
2026-06-03T12:23:12.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:23:12.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:23:12.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:23:12.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:23:12.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:23:12.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:23:12.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:23:12, diff=0.170661s, valid=True
2026-06-03T12:23:12.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:23:12.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:23:12.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:23:12.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56389.171304s, valid=False
2026-06-03T12:23:12.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:23:12.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:23:12.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:23:12.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:23:12.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:23:12.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:23:12.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:23:12.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:23:12.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:23:12.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:23:12.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:23:12.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:23:12.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:23:12.481 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:23:12.686 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:23:13.028 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:23:13.130 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:23:13.130 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:23:13.130 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:23:13.316 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:23:13.363 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:23:43.393 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:23:43.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:23:43.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:23:43.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:23:43.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:23:43.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:23:43.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:23:43.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:23:43.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:23:43.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:23:43.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:23:43.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:23:43.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:23:46.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:23:46.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:23:46.433 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:23:46.434 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:23:46.441 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:23:46.453 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:23:46.453 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:23:46.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:23:46.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:23:46.454 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:23:46.454 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:23:46.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:23:46.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:23:46.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:23:46.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:23:46.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:23:48.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:23:48.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:23:48.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:23:48.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:23:48.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:23:48.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:23:48.199 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:23:48.277 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:23:46
2026-06-03T12:23:48.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86016, datetime.datetime(2026, 6, 3, 12, 23, 46), datetime.datetime(2026, 6, 3, 12, 23, 45), 'salt', 6.87, 99.58, None, 38.64, 107.13, 0.05, 822.91, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:23:48.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:23:48.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:23:48.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:23:45, diff=3.283099s, valid=True
2026-06-03T12:23:48.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:23:48.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:23:48.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:24:12, diff=-23.71405s, valid=True
2026-06-03T12:23:48.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:23:48.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:23:48.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:23:42, diff=6.292642s, valid=True
2026-06-03T12:23:48.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:23:48.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:23:48.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:23:48.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:23:48.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:23:48.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:23:48.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:24:12, diff=-23.704326s, valid=True
2026-06-03T12:23:48.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:23:48.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:23:48.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:23:48.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56425.296339s, valid=False
2026-06-03T12:23:48.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:23:48.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:23:48.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:23:48.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:23:48.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:23:48.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:23:48.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:23:48.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:23:48.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:23:48.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:23:48.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:23:48.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:23:48.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:23:48.612 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:23:48.832 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:23:49.171 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:23:49.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:23:49.274 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:23:49.274 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:23:50.024 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:23:50.025 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:24:20.054 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:24:20.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:24:20.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:24:20.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:24:20.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:24:20.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:24:20.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:24:20.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:24:20.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:24:20.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:24:20.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:24:20.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:24:20.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:24:23.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:24:23.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:24:23.154 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:24:23.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:24:23.163 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:24:23.176 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:24:23.176 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:24:23.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:24:23.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:24:23.176 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:24:23.176 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:24:23.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:24:23.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:24:23.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:24:23.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:24:23.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:24:23.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:24:23.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:24:23.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:24:23.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:24:23.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:24:23.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:24:23.451 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:24:23.521 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:24:16
2026-06-03T12:24:23.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86017, datetime.datetime(2026, 6, 3, 12, 24, 16), datetime.datetime(2026, 6, 3, 12, 24, 15), 'salt', 6.91, 99.54, None, 37.44, 104.9, 0.06, 822.78, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:24:23.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:24:23.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:24:23.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:24:15, diff=8.528366s, valid=True
2026-06-03T12:24:23.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:24:23.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:24:23.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:24:12, diff=11.531935s, valid=True
2026-06-03T12:24:23.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:24:23.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:24:23.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:24:12, diff=11.53976s, valid=True
2026-06-03T12:24:23.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:24:23.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:24:23.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:24:23.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:24:23.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:24:23.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:24:23.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:24:12, diff=11.543222s, valid=True
2026-06-03T12:24:23.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:24:23.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:24:23.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:24:23.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56460.543984s, valid=False
2026-06-03T12:24:23.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:24:23.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:24:23.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:24:23.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:24:23.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:24:23.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:24:23.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:24:23.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:24:23.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:24:23.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:24:23.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:24:23.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:24:23.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:24:23.861 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:24:24.069 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:24:24.411 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:24:24.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:24:24.514 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:24:24.514 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:24:24.892 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:24:24.892 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:24:54.922 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:24:54.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:24:54.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:24:55.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:24:55.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:24:55.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:24:55.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:24:55.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:24:55.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:24:55.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:24:55.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:24:55.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:24:55.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:24:58.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:24:58.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:24:58.159 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:24:58.159 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:24:58.169 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:24:58.181 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:24:58.182 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:24:58.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:24:58.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:24:58.182 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:24:58.182 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:24:58.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:24:58.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:24:58.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:24:58.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:24:58.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:24:58.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:24:58.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:24:58.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:24:58.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:24:58.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:24:58.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:24:58.513 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:24:58.585 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:24:46
2026-06-03T12:24:58.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86018, datetime.datetime(2026, 6, 3, 12, 24, 46), datetime.datetime(2026, 6, 3, 12, 24, 46), 'salt', 6.94, 99.58, None, 35.71, 94.03, 0.06, 822.72, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:24:58.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:24:58.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:24:58.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:24:46, diff=12.591839s, valid=True
2026-06-03T12:24:58.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:24:58.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:24:58.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:25:12, diff=-13.404916s, valid=True
2026-06-03T12:24:58.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:24:58.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:24:58.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:24:42, diff=16.602862s, valid=True
2026-06-03T12:24:58.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:24:58.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:24:58.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:24:58.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:24:58.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:24:58.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:24:58.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:25:12, diff=-13.393683s, valid=True
2026-06-03T12:24:58.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:24:58.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:24:58.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:24:58.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56495.607083s, valid=False
2026-06-03T12:24:58.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:24:58.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:24:58.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:24:58.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:24:58.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:24:58.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:24:58.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:24:58.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:24:58.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:24:58.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:24:58.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:24:58.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:24:58.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:24:58.929 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:24:59.135 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:24:59.538 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:24:59.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:24:59.640 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:24:59.640 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:24:59.828 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:24:59.828 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:25:29.858 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:25:29.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:25:29.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:25:30.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:25:30.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:25:30.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:25:30.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:25:30.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:25:30.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:25:30.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:25:30.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:25:30.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:25:30.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:25:33.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:25:33.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:25:33.084 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:25:33.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:25:33.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:25:33.107 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:25:33.108 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:25:33.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:25:33.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:25:33.109 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:25:33.109 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:25:33.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:25:33.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:25:33.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:25:33.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:25:33.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:25:33.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:25:33.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:25:33.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:25:33.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:25:33.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:25:33.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:25:33.439 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:25:33.508 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:25:17
2026-06-03T12:25:33.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86019, datetime.datetime(2026, 6, 3, 12, 25, 17), datetime.datetime(2026, 6, 3, 12, 25, 16), 'salt', 6.94, 99.64, None, 37.44, 107.71, 0.05, 822.72, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:25:33.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:25:33.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:25:33.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:25:16, diff=17.516326s, valid=True
2026-06-03T12:25:33.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:25:33.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:25:33.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:25:12, diff=21.51977s, valid=True
2026-06-03T12:25:33.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:25:33.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:25:33.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:25:13, diff=20.527803s, valid=True
2026-06-03T12:25:33.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:25:33.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:25:33.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:25:33.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:25:33.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:25:33.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:25:33.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:25:12, diff=21.531498s, valid=True
2026-06-03T12:25:33.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:25:33.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:25:33.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:25:33.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56530.532334s, valid=False
2026-06-03T12:25:33.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:25:33.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:25:33.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:25:33.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:25:33.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:25:33.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:25:33.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:25:33.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:25:33.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:25:33.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:25:33.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:25:33.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:25:33.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:25:33.859 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:25:34.071 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:25:34.412 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:25:34.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:25:34.516 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:25:34.516 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:25:34.768 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:25:34.768 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:26:04.799 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:26:04.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:26:04.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:26:05.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:26:05.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:26:05.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:26:05.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:26:05.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:26:05.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:26:05.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:26:05.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:26:05.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:26:05.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:26:08.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:26:08.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:26:08.137 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:26:08.137 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:26:08.148 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:26:08.161 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:26:08.162 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:26:08.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:26:08.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:26:08.163 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:26:08.163 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:26:08.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:26:08.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:26:08.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:26:08.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:26:08.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:26:08.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:26:08.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:26:08.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:26:08.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:26:08.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:26:08.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:26:08.493 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:26:08.561 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:25:47
2026-06-03T12:26:08.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86020, datetime.datetime(2026, 6, 3, 12, 25, 47), datetime.datetime(2026, 6, 3, 12, 25, 46), 'salt', 6.87, 99.58, None, 44.1, 104.47, 0.05, 822.72, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:26:08.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:26:08.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:26:08.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:25:46, diff=22.568483s, valid=True
2026-06-03T12:26:08.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:26:08.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:26:08.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:26:12, diff=-3.427973s, valid=True
2026-06-03T12:26:08.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:26:08.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:26:08.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:25:43, diff=25.580261s, valid=True
2026-06-03T12:26:08.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:26:08.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:26:08.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:26:08.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:26:08.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:26:08.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:26:08.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:26:12, diff=-3.415971s, valid=True
2026-06-03T12:26:08.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:26:08.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:26:08.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:26:08.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56565.584853s, valid=False
2026-06-03T12:26:08.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:26:08.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:26:08.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:26:08.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:26:08.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:26:08.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:26:08.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:26:08.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:26:08.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:26:08.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:26:08.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:26:08.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:26:08.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:26:08.905 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:26:09.186 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:26:09.529 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:26:09.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:26:09.632 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:26:09.632 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:26:09.817 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:26:09.817 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:26:39.846 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:26:39.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:26:39.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:26:40.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:26:40.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:26:40.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:26:40.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:26:40.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:26:40.353 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:26:40.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:26:40.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:26:40.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:26:40.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:26:43.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:26:43.051 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:26:43.052 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:26:43.053 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:26:43.063 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:26:43.076 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:26:43.077 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:26:43.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:26:43.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:26:43.078 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:26:43.078 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:26:43.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:26:43.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:26:43.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:26:43.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:26:43.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:26:43.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:26:43.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:26:43.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:26:43.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:26:43.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:26:43.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:26:43.410 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:26:43.480 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:26:17
2026-06-03T12:26:43.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86021, datetime.datetime(2026, 6, 3, 12, 26, 17), datetime.datetime(2026, 6, 3, 12, 26, 16), 'salt', 6.81, 99.51, None, 39.34, 105.46, 0.07, 822.72, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:26:43.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:26:43.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:26:43.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:26:16, diff=27.488116s, valid=True
2026-06-03T12:26:43.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:26:43.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:26:43.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:26:12, diff=31.491714s, valid=True
2026-06-03T12:26:43.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:26:43.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:26:43.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:26:14, diff=29.500161s, valid=True
2026-06-03T12:26:43.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:26:43.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:26:43.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:26:43.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:26:43.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:26:43.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:26:43.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:26:12, diff=31.503969s, valid=True
2026-06-03T12:26:43.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:26:43.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:26:43.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:26:43.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56600.504812s, valid=False
2026-06-03T12:26:43.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:26:43.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:26:43.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:26:43.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:26:43.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:26:43.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:26:43.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:26:43.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:26:43.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:26:43.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:26:43.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:26:43.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:26:43.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:26:43.826 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:26:44.033 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:26:44.377 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:26:44.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:26:44.481 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:26:44.481 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:26:44.566 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:26:44.566 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:27:14.596 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:27:14.596 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:27:14.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:27:14.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:27:14.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:27:15.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:27:15.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:27:15.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:27:15.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:27:15.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:27:15.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:27:15.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:27:15.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:27:17.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:27:17.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:27:17.731 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:27:17.731 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:27:17.741 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:27:17.754 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:27:17.755 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:27:17.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:27:17.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:27:17.756 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:27:17.756 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:27:17.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:27:17.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:27:17.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:27:17.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:27:17.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:27:18.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:27:18.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:27:18.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:27:18.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:27:18.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:27:18.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:27:18.086 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:27:18.157 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:27:18
2026-06-03T12:27:18.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86023, datetime.datetime(2026, 6, 3, 12, 27, 18), datetime.datetime(2026, 6, 3, 12, 27, 17), 'salt', 6.87, 99.61, None, 38.32, 93.46, 0.05, 822.97, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:27:18.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:27:18.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:27:18.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:27:17, diff=1.165187s, valid=True
2026-06-03T12:27:18.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:27:18.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:27:18.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:27:12, diff=6.168698s, valid=True
2026-06-03T12:27:18.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:27:18.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:27:18.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:27:17, diff=1.177017s, valid=True
2026-06-03T12:27:18.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:27:18.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:27:18.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:27:18.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:27:18.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:27:18.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:27:18.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:27:12, diff=6.180812s, valid=True
2026-06-03T12:27:18.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:27:18.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:27:18.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:27:18.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56635.181628s, valid=False
2026-06-03T12:27:18.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:27:18.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:27:18.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:27:18.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:27:18.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:27:18.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:27:18.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:27:18.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:27:18.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:27:18.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:27:18.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:27:18.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:27:18.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:27:18.576 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:27:18.786 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:27:19.127 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:27:19.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:27:19.230 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:27:19.230 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:27:19.351 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:27:19.351 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:27:49.489 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:27:49.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:27:49.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:27:49.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:27:49.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:27:50.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:27:50.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:27:50.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:27:50.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:27:50.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:27:50.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:27:50.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:27:50.081 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:27:52.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:27:52.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:27:52.771 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:27:52.771 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:27:52.780 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:27:52.793 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:27:52.794 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:27:52.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:27:52.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:27:52.795 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:27:52.795 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:27:52.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:27:52.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:27:52.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:27:53.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:27:53.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:27:53.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:27:53.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:27:53.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:27:53.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:27:53.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:27:53.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:27:53.123 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:27:53.191 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:27:48
2026-06-03T12:27:53.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86024, datetime.datetime(2026, 6, 3, 12, 27, 48), datetime.datetime(2026, 6, 3, 12, 27, 47), 'salt', 6.97, 99.68, None, 35.99, 105.2, 0.04, 822.85, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:27:53.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:27:53.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:27:53.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:27:47, diff=6.19787s, valid=True
2026-06-03T12:27:53.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:27:53.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:27:53.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:28:12, diff=-18.799267s, valid=True
2026-06-03T12:27:53.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:27:53.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:27:53.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:27:44, diff=9.208173s, valid=True
2026-06-03T12:27:53.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:27:53.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:27:53.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:27:53.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:27:53.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:27:53.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:27:53.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:28:12, diff=-18.78817s, valid=True
2026-06-03T12:27:53.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:27:53.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:27:53.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:27:53.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56670.212644s, valid=False
2026-06-03T12:27:53.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:27:53.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:27:53.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:27:53.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:27:53.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:27:53.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:27:53.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:27:53.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:27:53.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:27:53.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:27:53.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:27:53.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:27:53.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:27:53.532 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:27:53.738 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:27:54.077 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:27:54.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:27:54.179 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:27:54.179 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:27:54.416 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:27:54.417 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:28:24.417 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:28:24.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:28:24.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:28:24.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:28:24.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:28:24.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:28:24.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:28:25.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:28:25.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:28:25.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:28:25.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:28:25.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:28:25.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:28:27.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:28:27.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:28:27.751 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:28:27.751 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:28:27.762 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:28:27.774 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:28:27.775 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:28:27.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:28:27.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:28:27.776 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:28:27.776 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:28:27.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:28:27.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:28:27.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:28:28.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:28:28.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:28:28.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:28:28.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:28:28.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:28:28.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:28:28.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:28:28.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:28:28.105 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:28:28.174 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:28:18
2026-06-03T12:28:28.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86025, datetime.datetime(2026, 6, 3, 12, 28, 18), datetime.datetime(2026, 6, 3, 12, 28, 17), 'salt', 6.94, 99.61, None, 34.47, 101.66, 0.05, 822.78, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:28:28.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:28:28.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:28:28.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:28:17, diff=11.181767s, valid=True
2026-06-03T12:28:28.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:28:28.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:28:28.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:28:12, diff=16.185147s, valid=True
2026-06-03T12:28:28.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:28:28.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:28:28.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:28:14, diff=14.193142s, valid=True
2026-06-03T12:28:28.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:28:28.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:28:28.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:28:28.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:28:28.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:28:28.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:28:28.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:28:12, diff=16.196785s, valid=True
2026-06-03T12:28:28.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:28:28.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:28:28.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:28:28.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56705.197567s, valid=False
2026-06-03T12:28:28.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:28:28.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:28:28.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:28:28.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:28:28.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:28:28.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:28:28.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:28:28.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:28:28.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:28:28.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:28:28.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:28:28.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:28:28.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:28:28.591 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:28:28.798 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:28:29.141 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:28:29.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:28:29.247 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:28:29.247 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:28:29.316 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:28:29.316 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:28:59.343 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:28:59.343 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:28:59.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:28:59.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:28:59.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:28:59.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:28:59.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:28:59.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:28:59.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:28:59.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:28:59.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:28:59.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:28:59.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:29:02.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:29:02.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:29:02.421 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:29:02.422 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:29:02.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:29:02.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:29:02.446 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:29:02.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:29:02.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:29:02.448 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:29:02.448 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:29:02.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:29:02.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:29:02.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:29:02.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:29:02.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:29:02.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:29:02.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:29:02.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:29:02.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:29:02.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:29:02.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:29:02.802 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:29:02.875 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:28:48
2026-06-03T12:29:02.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86026, datetime.datetime(2026, 6, 3, 12, 28, 48), datetime.datetime(2026, 6, 3, 12, 28, 48), 'salt', 6.81, 99.28, None, 34.26, 91.77, 0.1, 822.91, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:29:02.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:29:02.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:29:02.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:28:48, diff=14.881959s, valid=True
2026-06-03T12:29:02.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:29:02.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:29:02.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:29:12, diff=-9.114879s, valid=True
2026-06-03T12:29:02.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:29:02.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:29:02.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:28:44, diff=18.892607s, valid=True
2026-06-03T12:29:02.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:29:02.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:29:02.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:29:02.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:29:02.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:29:02.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:29:02.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:29:12, diff=-9.103882s, valid=True
2026-06-03T12:29:02.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:29:02.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:29:02.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:29:02.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56739.896891s, valid=False
2026-06-03T12:29:02.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:29:02.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:29:02.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:29:02.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:29:02.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:29:02.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:29:02.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:29:02.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:29:02.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:29:03.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:29:03.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:29:03.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:29:03.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:29:03.224 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:29:03.429 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:29:03.768 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:29:03.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:29:03.870 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:29:03.870 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:29:04.026 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:29:04.027 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:29:34.028 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:29:34.028 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:29:34.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:29:34.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:29:34.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:29:34.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:29:34.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:29:34.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:29:34.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:29:34.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:29:34.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:29:34.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:29:34.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:29:37.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:29:37.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:29:37.060 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:29:37.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:29:37.068 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:29:37.080 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:29:37.080 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:29:37.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:29:37.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:29:37.080 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:29:37.080 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:29:37.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:29:37.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:29:37.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:29:37.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:29:37.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:29:37.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:29:37.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:29:37.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:29:37.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:29:37.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:29:37.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:29:37.417 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:29:37.495 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:29:19
2026-06-03T12:29:37.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86027, datetime.datetime(2026, 6, 3, 12, 29, 19), datetime.datetime(2026, 6, 3, 12, 29, 18), 'salt', 7.01, 99.61, None, 34.93, 94.31, 0.06, 822.78, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:29:37.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:29:37.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:29:37.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:29:18, diff=19.501513s, valid=True
2026-06-03T12:29:37.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:29:37.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:29:37.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:29:12, diff=25.504367s, valid=True
2026-06-03T12:29:37.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:29:37.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:29:37.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:29:15, diff=22.511011s, valid=True
2026-06-03T12:29:37.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:29:37.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:29:37.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:29:37.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:29:37.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:29:37.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:29:37.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:29:12, diff=25.514027s, valid=True
2026-06-03T12:29:37.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:29:37.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:29:37.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:29:37.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56774.514678s, valid=False
2026-06-03T12:29:37.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:29:37.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:29:37.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:29:37.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:29:37.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:29:37.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:29:37.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:29:37.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:29:37.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:29:37.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:29:37.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:29:37.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:29:37.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:29:37.844 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:29:38.051 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:29:38.390 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:29:38.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:29:38.492 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:29:38.492 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:29:38.643 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:29:38.643 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:30:08.654 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:30:08.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:30:08.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:30:08.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:30:08.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:30:09.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:30:09.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:30:09.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:30:09.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:30:09.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:30:09.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:30:09.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:30:09.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:30:11.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:30:11.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:30:11.715 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:30:11.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:30:11.727 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:30:11.739 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:30:11.740 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:30:11.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:30:11.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:30:11.741 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:30:11.742 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:30:11.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:30:11.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:30:11.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:30:11.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:30:11.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:30:12.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:30:12.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:30:12.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:30:12.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:30:12.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:30:12.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:30:12.086 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:30:12.159 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:29:49
2026-06-03T12:30:12.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86028, datetime.datetime(2026, 6, 3, 12, 29, 49), datetime.datetime(2026, 6, 3, 12, 29, 48), 'salt', 6.91, 99.58, None, 34.79, 94.97, 0.06, 822.78, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:30:12.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:30:12.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:30:12.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:29:48, diff=24.166179s, valid=True
2026-06-03T12:30:12.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:30:12.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:30:12.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:30:12, diff=0.169194s, valid=True
2026-06-03T12:30:12.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:30:12.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:30:12.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:29:45, diff=27.176355s, valid=True
2026-06-03T12:30:12.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:30:12.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:30:12.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:30:12.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:30:12.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:30:12.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:30:12.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:30:12, diff=0.179574s, valid=True
2026-06-03T12:30:12.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:30:12.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:30:12.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:30:12.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56809.180281s, valid=False
2026-06-03T12:30:12.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:30:12.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:30:12.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:30:12.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:30:12.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:30:12.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:30:12.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:30:12.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:30:12.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:30:12.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:30:12.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:30:12.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:30:12.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:30:12.500 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:30:12.710 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:30:13.052 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:30:13.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:30:13.158 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:30:13.158 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:30:13.405 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:30:13.406 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:30:43.430 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:30:43.430 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:30:43.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:30:43.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:30:43.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:30:44.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:30:44.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:30:44.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:30:44.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:30:44.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:30:44.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:30:44.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:30:44.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:30:46.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:30:46.746 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:30:46.748 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:30:46.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:30:46.757 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:30:46.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:30:46.770 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:30:46.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:30:46.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:30:46.772 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:30:46.772 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:30:46.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:30:46.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:30:46.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:30:47.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:30:47.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:30:47.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:30:47.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:30:47.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:30:47.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:30:47.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:30:47.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:30:47.112 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:30:47.182 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:30:19
2026-06-03T12:30:47.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86029, datetime.datetime(2026, 6, 3, 12, 30, 19), datetime.datetime(2026, 6, 3, 12, 30, 18), 'salt', 6.81, 99.54, None, 31.79, 94.05, 0.06, 822.78, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:30:47.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:30:47.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:30:47.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:30:18, diff=29.190287s, valid=True
2026-06-03T12:30:47.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:30:47.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:30:47.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:30:12, diff=35.193735s, valid=True
2026-06-03T12:30:47.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:30:47.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:30:47.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:30:15, diff=32.201868s, valid=True
2026-06-03T12:30:47.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:30:47.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:30:47.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:30:47.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:30:47.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:30:47.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:30:47.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:30:12, diff=35.205577s, valid=True
2026-06-03T12:30:47.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:30:47.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:30:47.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:30:47.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56844.206375s, valid=False
2026-06-03T12:30:47.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:30:47.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:30:47.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:30:47.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:30:47.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:30:47.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:30:47.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:30:47.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:30:47.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:30:47.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:30:47.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:30:47.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:30:47.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:30:47.528 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:30:47.735 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:30:48.078 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:30:48.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:30:48.184 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:30:48.184 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:30:48.380 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:30:48.380 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:31:18.401 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:31:18.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:31:18.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:31:18.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:31:18.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:31:18.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:31:18.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:31:18.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:31:18.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:31:18.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:31:18.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:31:18.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:31:18.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:31:21.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:31:21.537 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:31:21.538 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:31:21.538 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:31:21.547 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:31:21.560 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:31:21.561 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:31:21.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:31:21.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:31:21.562 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:31:21.562 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:31:21.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:31:21.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:31:21.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:31:21.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:31:21.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:31:21.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:31:21.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:31:21.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:31:21.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:31:21.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:31:21.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:31:21.916 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:31:21.987 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:31:20
2026-06-03T12:31:21.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86031, datetime.datetime(2026, 6, 3, 12, 31, 20), datetime.datetime(2026, 6, 3, 12, 31, 19), 'salt', 7.01, 99.61, None, 32.81, 98.61, 0.06, 822.72, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:31:21.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:31:21.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:31:21.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:31:19, diff=2.994427s, valid=True
2026-06-03T12:31:21.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:31:21.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:31:21.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:31:12, diff=9.99781s, valid=True
2026-06-03T12:31:21.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:31:21.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:31:22.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:31:18, diff=4.005659s, valid=True
2026-06-03T12:31:22.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:31:22.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:31:22.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:31:22.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:31:22.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:31:22.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:31:22.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:31:12, diff=10.009265s, valid=True
2026-06-03T12:31:22.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:31:22.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:31:22.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:31:22.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56879.010049s, valid=False
2026-06-03T12:31:22.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:31:22.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:31:22.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:31:22.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:31:22.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:31:22.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:31:22.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:31:22.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:31:22.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:31:22.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:31:22.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:31:22.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:31:22.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:31:22.329 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:31:22.533 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:31:22.933 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:31:23.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:31:23.035 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:31:23.035 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:31:23.219 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:31:23.219 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:31:53.225 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:31:53.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:31:53.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:31:53.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:31:53.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:31:53.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:31:53.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:31:53.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:31:53.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:31:53.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:31:53.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:31:53.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:31:53.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:31:56.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:31:56.310 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:31:56.310 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:31:56.311 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:31:56.319 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:31:56.331 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:31:56.331 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:31:56.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:31:56.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:31:56.332 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:31:56.332 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:31:56.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:31:56.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:31:56.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:31:56.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:31:56.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:31:56.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:31:56.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:31:56.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:31:56.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:31:56.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:31:56.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:31:56.677 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:31:56.754 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:31:50
2026-06-03T12:31:56.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86032, datetime.datetime(2026, 6, 3, 12, 31, 50), datetime.datetime(2026, 6, 3, 12, 31, 49), 'salt', 7.01, 99.71, None, 37.4, 98.68, 0.04, 822.72, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:31:56.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:31:56.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:31:56.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:31:49, diff=7.761631s, valid=True
2026-06-03T12:31:56.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:31:56.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:31:56.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:32:12, diff=-15.234883s, valid=True
2026-06-03T12:31:56.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:31:56.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:31:56.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:31:49, diff=7.773189s, valid=True
2026-06-03T12:31:56.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:31:56.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:31:56.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:31:56.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:31:56.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:31:56.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:31:56.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:32:12, diff=-15.22306s, valid=True
2026-06-03T12:31:56.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:31:56.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:31:56.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:31:56.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56913.777761s, valid=False
2026-06-03T12:31:56.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:31:56.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:31:56.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:31:56.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:31:56.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:31:56.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:31:56.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:31:56.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:31:56.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:31:56.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:31:56.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:31:57.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:31:57.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:31:57.098 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:31:57.303 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:31:57.641 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:31:57.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:31:57.744 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:31:57.744 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:31:57.944 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:31:57.945 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:32:27.975 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:32:27.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:32:27.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:32:28.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:32:28.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:32:28.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:32:28.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:32:28.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:32:28.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:32:28.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:32:28.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:32:28.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:32:28.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:32:31.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:32:31.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:32:31.840 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:32:31.840 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:32:31.849 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:32:31.862 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:32:31.862 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:32:31.863 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:32:31.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:32:31.864 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:32:31.864 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:32:31.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:32:32.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:32:32.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:32:32.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:32:32.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:32:32.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:32:32.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:32:32.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:32:32.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:32:32.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:32:32.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:32:32.198 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:32:32.267 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:32:20
2026-06-03T12:32:32.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86033, datetime.datetime(2026, 6, 3, 12, 32, 20), datetime.datetime(2026, 6, 3, 12, 32, 19), 'salt', 6.81, 99.51, None, 33.91, 85.15, 0.07, 822.66, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:32:32.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:32:32.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:32:32.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:32:19, diff=13.274155s, valid=True
2026-06-03T12:32:32.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:32:32.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:32:32.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:32:12, diff=20.277529s, valid=True
2026-06-03T12:32:32.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:32:32.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:32:32.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:32:16, diff=16.285584s, valid=True
2026-06-03T12:32:32.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:32:32.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:32:32.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:32:32.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:32:32.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:32:32.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:32:32.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:32:12, diff=20.289375s, valid=True
2026-06-03T12:32:32.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:32:32.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:32:32.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:32:32.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56949.290182s, valid=False
2026-06-03T12:32:32.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:32:32.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:32:32.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:32:32.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:32:32.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:32:32.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:32:32.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:32:32.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:32:32.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:32:32.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:32:32.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:32:32.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:32:32.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:32:32.610 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:32:32.887 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:32:33.226 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:32:33.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:32:33.328 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:32:33.328 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:32:33.575 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:32:33.575 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:33:03.606 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:33:03.606 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:33:03.606 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:33:03.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:33:03.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:33:04.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:33:04.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:33:04.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:33:04.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:33:04.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:33:04.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:33:04.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:33:04.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:33:06.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:33:06.916 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:33:06.917 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:33:06.917 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:33:06.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:33:06.939 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:33:06.940 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:33:06.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:33:06.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:33:06.941 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:33:06.941 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:33:06.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:33:07.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:33:07.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:33:07.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:33:07.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:33:07.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:33:07.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:33:07.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:33:07.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:33:07.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:33:07.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:33:07.286 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:33:07.369 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:32:50
2026-06-03T12:33:07.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86034, datetime.datetime(2026, 6, 3, 12, 32, 50), datetime.datetime(2026, 6, 3, 12, 32, 50), 'salt', 6.91, 99.54, None, 31.51, 107.27, 0.06, 822.78, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:33:07.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:33:07.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:33:07.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:32:50, diff=17.377177s, valid=True
2026-06-03T12:33:07.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:33:07.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:33:07.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:33:12, diff=-4.619313s, valid=True
2026-06-03T12:33:07.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:33:07.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:33:07.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:32:46, diff=21.388972s, valid=True
2026-06-03T12:33:07.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:33:07.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:33:07.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:33:07.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:33:07.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:33:07.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:33:07.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:33:12, diff=-4.607326s, valid=True
2026-06-03T12:33:07.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:33:07.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:33:07.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:33:07.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=56984.39348s, valid=False
2026-06-03T12:33:07.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:33:07.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:33:07.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:33:07.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:33:07.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:33:07.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:33:07.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:33:07.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:33:07.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:33:07.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:33:07.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:33:07.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:33:07.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:33:07.712 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:33:07.918 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:33:08.280 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:33:08.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:33:08.382 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:33:08.382 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:33:08.629 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:33:08.629 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:33:38.659 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:33:38.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:33:38.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:33:38.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:33:38.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:33:39.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:33:39.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:33:39.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:33:39.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:33:39.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:33:39.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:33:39.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:33:39.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:33:41.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:33:41.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:33:41.825 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:33:41.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:33:41.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:33:41.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:33:41.847 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:33:41.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:33:41.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:33:41.848 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:33:41.848 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:33:41.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:33:41.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:33:41.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:33:42.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:33:42.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:33:42.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:33:42.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:33:42.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:33:42.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:33:42.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:33:42.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:33:42.191 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:33:42.272 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:33:21
2026-06-03T12:33:42.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86035, datetime.datetime(2026, 6, 3, 12, 33, 21), datetime.datetime(2026, 6, 3, 12, 33, 20), 'salt', 6.94, 99.71, None, 33.13, 104.36, 0.04, 822.91, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:33:42.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:33:42.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:33:42.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:33:20, diff=22.280101s, valid=True
2026-06-03T12:33:42.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:33:42.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:33:42.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:33:12, diff=30.283572s, valid=True
2026-06-03T12:33:42.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:33:42.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:33:42.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:33:16, diff=26.29175s, valid=True
2026-06-03T12:33:42.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:33:42.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:33:42.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:33:42.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:33:42.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:33:42.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:33:42.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:33:12, diff=30.295427s, valid=True
2026-06-03T12:33:42.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:33:42.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:33:42.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:33:42.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57019.296245s, valid=False
2026-06-03T12:33:42.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:33:42.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:33:42.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:33:42.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:33:42.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:33:42.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:33:42.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:33:42.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:33:42.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:33:42.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:33:42.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:33:42.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:33:42.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:33:42.686 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:33:42.891 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:33:43.229 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:33:43.330 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:33:43.330 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:33:43.330 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:33:43.499 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:33:43.499 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:34:13.529 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:34:13.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:34:13.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:34:13.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:34:13.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:34:13.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:34:13.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:34:13.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:34:13.933 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:34:13.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:34:13.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:34:13.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:34:13.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:34:16.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:34:16.591 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:34:16.592 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:34:16.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:34:16.603 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:34:16.616 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:34:16.616 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:34:16.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:34:16.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:34:16.617 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:34:16.617 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:34:16.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:34:16.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:34:16.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:34:16.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:34:16.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:34:16.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:34:16.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:34:16.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:34:16.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:34:16.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:34:16.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:34:16.959 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:34:17.045 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:33:51
2026-06-03T12:34:17.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86036, datetime.datetime(2026, 6, 3, 12, 33, 51), datetime.datetime(2026, 6, 3, 12, 33, 50), 'salt', 6.91, 99.58, None, 32.5, 104.71, 0.06, 822.97, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:34:17.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:34:17.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:34:17.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:33:50, diff=27.053127s, valid=True
2026-06-03T12:34:17.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:34:17.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:34:17.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:34:12, diff=5.056587s, valid=True
2026-06-03T12:34:17.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:34:17.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:34:17.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:33:47, diff=30.064704s, valid=True
2026-06-03T12:34:17.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:34:17.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:34:17.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:34:17.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:34:17.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:34:17.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:34:17.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:34:12, diff=5.068428s, valid=True
2026-06-03T12:34:17.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:34:17.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:34:17.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:34:17.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57054.06924s, valid=False
2026-06-03T12:34:17.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:34:17.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:34:17.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:34:17.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:34:17.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:34:17.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:34:17.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:34:17.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:34:17.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:34:17.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:34:17.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:34:17.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:34:17.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:34:17.404 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:34:17.609 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:34:17.944 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:34:18.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:34:18.043 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:34:18.043 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:34:18.126 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:34:18.127 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:34:48.153 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:34:48.153 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:34:48.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:34:48.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:34:48.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:34:48.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:34:48.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:34:48.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:34:48.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:34:48.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:34:48.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:34:48.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:34:48.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:34:51.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:34:51.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:34:51.157 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:34:51.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:34:51.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:34:51.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:34:51.179 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:34:51.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:34:51.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:34:51.180 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:34:51.181 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:34:51.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:34:51.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:34:51.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:34:51.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:34:51.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:34:51.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:34:51.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:34:51.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:34:51.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:34:51.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:34:51.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:34:51.530 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:34:51.613 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:34:21
2026-06-03T12:34:51.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86037, datetime.datetime(2026, 6, 3, 12, 34, 21), datetime.datetime(2026, 6, 3, 12, 34, 21), 'salt', 6.87, 99.58, None, 31.19, 106.35, 0.05, 822.91, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:34:51.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:34:51.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:34:51.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:34:21, diff=30.620893s, valid=True
2026-06-03T12:34:51.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:34:51.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:34:51.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:34:12, diff=39.624436s, valid=True
2026-06-03T12:34:51.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:34:51.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:34:51.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:34:17, diff=34.632641s, valid=True
2026-06-03T12:34:51.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:34:51.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:34:51.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:34:51.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:34:51.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:34:51.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:34:51.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:34:12, diff=39.636422s, valid=True
2026-06-03T12:34:51.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:34:51.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:34:51.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:34:51.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57088.63726s, valid=False
2026-06-03T12:34:51.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:34:51.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:34:51.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:34:51.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:34:51.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:34:51.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:34:51.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:34:51.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:34:51.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:34:51.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:34:51.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:34:51.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:34:51.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:34:52.028 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:34:52.233 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:34:52.574 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:34:52.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:34:52.676 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:34:52.676 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:34:52.860 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:34:52.860 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:35:22.889 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:35:22.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:35:22.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:35:23.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:35:23.221 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:35:23.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:35:23.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:35:23.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:35:23.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:35:23.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:35:23.477 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:35:23.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:35:23.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:35:26.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:35:26.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:35:26.167 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:35:26.167 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:35:26.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:35:26.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:35:26.196 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:35:26.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:35:26.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:35:26.197 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:35:26.197 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:35:26.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:35:26.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:35:26.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:35:26.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:35:26.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:35:26.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:35:26.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:35:26.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:35:26.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:35:26.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:35:26.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:35:26.539 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:35:26.623 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:35:22
2026-06-03T12:35:26.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86039, datetime.datetime(2026, 6, 3, 12, 35, 22), datetime.datetime(2026, 6, 3, 12, 35, 21), 'salt', 6.94, 99.64, None, 27.03, 101.73, 0.05, 822.72, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:35:26.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:35:26.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:35:26.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:35:21, diff=5.630786s, valid=True
2026-06-03T12:35:26.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:35:26.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:35:26.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:35:12, diff=14.634441s, valid=True
2026-06-03T12:35:26.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:35:26.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:35:26.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:35:20, diff=6.642661s, valid=True
2026-06-03T12:35:26.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:35:26.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:35:26.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:35:26.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:35:26.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:35:26.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:35:26.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:35:12, diff=14.646362s, valid=True
2026-06-03T12:35:26.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:35:26.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:35:26.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:35:26.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57123.647177s, valid=False
2026-06-03T12:35:26.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:35:26.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:35:26.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:35:26.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:35:26.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:35:26.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:35:26.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:35:26.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:35:26.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:35:26.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:35:26.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:35:26.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:35:26.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:35:26.969 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:35:27.174 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:35:27.513 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:35:27.616 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:35:27.616 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:35:27.616 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:35:27.842 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:35:27.842 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:35:57.850 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:35:57.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:35:57.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:35:58.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:35:58.169 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:35:58.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:35:58.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:35:58.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:35:58.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:35:58.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:35:58.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:35:58.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:35:58.428 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:36:01.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:36:01.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:36:01.113 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:36:01.113 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:36:01.119 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:36:01.131 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:36:01.131 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:36:01.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:36:01.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:36:01.132 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:36:01.132 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:36:01.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:36:01.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:36:01.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:36:01.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:36:01.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:36:01.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:36:01.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:36:01.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:36:01.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:36:01.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:36:01.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:36:01.470 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:36:01.551 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:35:52
2026-06-03T12:36:01.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86040, datetime.datetime(2026, 6, 3, 12, 35, 52), datetime.datetime(2026, 6, 3, 12, 35, 51), 'salt', 7.01, 99.68, None, 32.78, 95.15, 0.05, 822.6, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:36:01.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:36:01.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:36:01.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:35:51, diff=10.559129s, valid=True
2026-06-03T12:36:01.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:36:01.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:36:01.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:36:12, diff=-10.437395s, valid=True
2026-06-03T12:36:01.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:36:01.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:36:01.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:35:51, diff=10.570836s, valid=True
2026-06-03T12:36:01.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:36:01.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:36:01.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:36:01.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:36:01.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:36:01.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:36:01.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:36:12, diff=-10.425458s, valid=True
2026-06-03T12:36:01.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:36:01.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:36:01.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:36:01.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57158.57536s, valid=False
2026-06-03T12:36:01.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:36:01.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:36:01.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:36:01.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:36:01.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:36:01.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:36:01.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:36:01.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:36:01.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:36:01.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:36:01.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:36:01.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:36:01.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:36:01.959 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:36:02.167 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:36:02.505 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:36:02.608 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:36:02.608 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:36:02.609 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:36:02.856 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:36:02.856 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:36:32.862 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:36:32.863 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:36:32.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:36:33.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:36:33.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:36:33.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:36:33.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:36:33.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:36:33.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:36:33.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:36:33.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:36:33.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:36:33.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:36:36.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:36:36.329 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:36:36.330 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:36:36.330 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:36:36.342 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:36:36.354 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:36:36.355 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:36:36.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:36:36.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:36:36.356 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:36:36.356 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:36:36.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:36:36.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:36:36.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:36:36.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:36:36.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:36:36.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:36:36.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:36:36.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:36:36.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:36:36.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:36:36.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:36:36.640 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:36:36.711 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:36:22
2026-06-03T12:36:36.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86041, datetime.datetime(2026, 6, 3, 12, 36, 22), datetime.datetime(2026, 6, 3, 12, 36, 22), 'salt', 6.87, 99.51, None, 39.91, 105.37, 0.06, 822.78, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:36:36.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:36:36.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:36:36.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:36:22, diff=14.71848s, valid=True
2026-06-03T12:36:36.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:36:36.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:36:36.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:36:12, diff=24.721724s, valid=True
2026-06-03T12:36:36.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:36:36.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:36:36.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:36:18, diff=18.729431s, valid=True
2026-06-03T12:36:36.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:36:36.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:36:36.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:36:36.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:36:36.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:36:36.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:36:36.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:36:12, diff=24.732905s, valid=True
2026-06-03T12:36:36.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:36:36.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:36:36.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:36:36.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57193.733674s, valid=False
2026-06-03T12:36:36.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:36:36.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:36:36.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:36:36.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:36:36.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:36:36.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:36:36.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:36:36.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:36:36.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:36:36.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:36:36.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:36:36.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:36:37.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:36:37.054 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:36:37.258 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:36:37.595 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:36:37.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:36:37.719 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:36:37.719 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:36:37.932 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:36:37.932 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:37:07.963 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:37:07.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:37:07.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:37:08.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:37:08.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:37:08.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:37:08.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:37:08.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:37:08.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:37:08.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:37:08.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:37:08.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:37:08.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:37:11.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:37:11.383 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:37:11.384 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:37:11.385 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:37:11.396 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:37:11.413 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:37:11.414 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:37:11.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:37:11.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:37:11.415 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:37:11.415 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:37:11.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:37:11.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:37:11.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:37:11.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:37:11.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:37:11.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T12:37:11.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:37:11.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T12:37:11.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:37:11.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:37:11.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:37:11.758 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:37:11.830 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:36:53
2026-06-03T12:37:11.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86042, datetime.datetime(2026, 6, 3, 12, 36, 53), datetime.datetime(2026, 6, 3, 12, 36, 52), 'salt', 6.84, 99.54, None, 37.82, 96.87, 0.06, 822.72, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:37:11.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:37:11.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:37:11.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:36:52, diff=19.842307s, valid=True
2026-06-03T12:37:11.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:37:11.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T12:37:11.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:37:12, diff=-0.152267s, valid=True
2026-06-03T12:37:11.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:37:11.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:37:11.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:36:48, diff=23.860397s, valid=True
2026-06-03T12:37:11.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:37:11.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:37:11.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:37:11.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:37:11.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:37:11.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T12:37:11.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:37:12, diff=-0.133993s, valid=True
2026-06-03T12:37:11.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:37:11.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:37:11.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:37:11.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57228.866964s, valid=False
2026-06-03T12:37:11.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:37:11.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:37:11.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:37:11.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:37:11.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:37:11.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:37:11.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:37:11.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:37:11.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:37:12.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:37:12.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:37:12.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:37:12.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:37:12.187 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:37:12.405 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:37:12.749 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:37:12.851 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:37:12.852 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:37:12.852 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:37:13.027 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:37:13.028 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:37:43.058 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:37:43.058 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:37:43.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:37:43.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:37:43.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:37:43.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:37:43.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:37:43.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:37:43.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:37:43.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:37:43.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:37:43.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:37:43.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:37:46.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:37:46.746 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:37:46.746 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:37:46.747 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:37:46.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:37:46.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:37:46.771 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:37:46.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:37:46.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:37:46.772 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:37:46.772 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:37:46.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:37:46.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:37:46.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:37:47.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:37:47.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:37:47.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T12:37:47.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:37:47.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T12:37:47.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:37:47.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:37:47.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:37:47.115 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:37:47.185 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:37:23
2026-06-03T12:37:47.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86043, datetime.datetime(2026, 6, 3, 12, 37, 23), datetime.datetime(2026, 6, 3, 12, 37, 22), 'salt', 6.94, 99.64, None, 38.11, 106.63, 0.05, 822.66, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:37:47.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:37:47.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:37:47.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:37:22, diff=25.192636s, valid=True
2026-06-03T12:37:47.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:37:47.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T12:37:47.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:37:12, diff=35.196108s, valid=True
2026-06-03T12:37:47.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:37:47.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:37:47.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:37:18, diff=29.204314s, valid=True
2026-06-03T12:37:47.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:37:47.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:37:47.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:37:47.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:37:47.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:37:47.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T12:37:47.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:37:12, diff=35.208042s, valid=True
2026-06-03T12:37:47.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:37:47.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:37:47.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:37:47.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57264.208862s, valid=False
2026-06-03T12:37:47.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:37:47.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:37:47.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:37:47.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:37:47.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:37:47.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:37:47.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:37:47.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:37:47.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:37:47.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:37:47.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:37:47.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:37:47.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:37:47.529 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:37:47.726 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:37:48.120 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:37:48.221 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:37:48.221 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:37:48.222 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:37:48.456 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:37:48.456 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:38:18.467 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:38:18.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:38:18.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:38:18.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:38:18.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:38:19.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:38:19.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:38:19.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:38:19.012 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:38:19.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:38:19.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:38:19.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:38:19.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:38:21.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:38:21.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:38:21.749 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:38:21.749 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:38:21.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:38:21.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:38:21.773 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:38:21.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:38:21.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:38:21.775 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:38:21.775 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:38:21.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:38:21.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:38:21.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:38:22.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:38:22.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:38:22.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:38:22.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:38:22.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:38:22.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:38:22.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:38:22.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:38:22.102 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:38:22.172 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:37:53
2026-06-03T12:38:22.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86044, datetime.datetime(2026, 6, 3, 12, 37, 53), datetime.datetime(2026, 6, 3, 12, 37, 52), 'salt', 6.87, 99.61, None, 34.44, 101.05, 0.05, 822.66, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:38:22.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:38:22.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:38:22.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:37:52, diff=30.178109s, valid=True
2026-06-03T12:38:22.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:38:22.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:38:22.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:38:12, diff=10.180899s, valid=True
2026-06-03T12:38:22.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:38:22.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:38:22.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:37:48, diff=34.187487s, valid=True
2026-06-03T12:38:22.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:38:22.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:38:22.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:38:22.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:38:22.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:38:22.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:38:22.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:38:12, diff=10.190475s, valid=True
2026-06-03T12:38:22.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:38:22.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:38:22.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:38:22.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57299.191161s, valid=False
2026-06-03T12:38:22.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:38:22.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:38:22.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:38:22.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:38:22.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:38:22.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:38:22.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:38:22.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:38:22.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:38:22.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:38:22.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:38:22.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:38:22.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:38:22.504 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:38:22.701 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:38:23.032 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:38:23.134 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:38:23.134 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:38:23.134 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:38:23.347 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:38:23.348 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:38:53.378 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:38:53.378 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:38:53.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:38:53.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:38:53.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:38:53.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:38:53.926 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:38:53.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:38:53.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:38:53.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:38:53.944 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:38:53.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:38:53.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:38:56.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:38:56.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:38:56.624 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:38:56.625 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:38:56.637 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:38:56.650 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:38:56.650 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:38:56.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:38:56.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:38:56.652 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:38:56.652 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:38:56.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:38:56.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:38:56.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:38:56.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:38:56.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:38:56.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:38:56.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:38:56.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:38:56.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:38:56.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:38:56.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:38:56.982 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:38:57.051 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:38:54
2026-06-03T12:38:57.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86046, datetime.datetime(2026, 6, 3, 12, 38, 54), datetime.datetime(2026, 6, 3, 12, 38, 53), 'salt', 6.84, 99.54, None, 36.8, 104.78, 0.06, 822.78, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:38:57.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:38:57.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:38:57.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:38:53, diff=4.058973s, valid=True
2026-06-03T12:38:57.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:38:57.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:38:57.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:39:12, diff=-14.937548s, valid=True
2026-06-03T12:38:57.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:38:57.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:38:57.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:38:49, diff=8.070552s, valid=True
2026-06-03T12:38:57.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:38:57.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:38:57.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:38:57.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:38:57.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:38:57.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:38:57.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:39:12, diff=-14.925734s, valid=True
2026-06-03T12:38:57.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:38:57.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:38:57.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:38:57.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57334.075086s, valid=False
2026-06-03T12:38:57.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:38:57.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:38:57.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:38:57.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:38:57.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:38:57.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:38:57.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:38:57.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:38:57.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:38:57.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:38:57.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:38:57.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:38:57.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:38:57.393 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:38:57.663 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:38:57.994 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:38:58.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:38:58.094 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:38:58.094 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:38:58.285 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:38:58.285 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:39:28.300 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:39:28.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:39:28.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:39:28.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:39:28.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:39:29.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:39:29.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:39:29.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:39:29.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:39:29.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:39:29.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:39:29.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:39:29.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:39:31.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:39:31.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:39:31.741 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:39:31.741 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:39:31.751 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:39:31.764 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:39:31.764 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:39:31.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:39:31.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:39:31.765 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:39:31.766 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:39:31.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:39:31.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:39:31.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:39:32.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:39:32.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:39:32.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:39:32.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:39:32.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:39:32.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:39:32.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:39:32.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:39:32.107 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:39:32.191 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:39:24
2026-06-03T12:39:32.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86047, datetime.datetime(2026, 6, 3, 12, 39, 24), datetime.datetime(2026, 6, 3, 12, 39, 23), 'salt', 6.87, 99.64, None, 37.79, 106.63, 0.04, 822.72, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:39:32.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:39:32.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:39:32.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:39:23, diff=9.198978s, valid=True
2026-06-03T12:39:32.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:39:32.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:39:32.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:39:12, diff=20.202542s, valid=True
2026-06-03T12:39:32.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:39:32.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:39:32.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:39:21, diff=11.210918s, valid=True
2026-06-03T12:39:32.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:39:32.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:39:32.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:39:32.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:39:32.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:39:32.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:39:32.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:39:12, diff=20.214676s, valid=True
2026-06-03T12:39:32.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:39:32.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:39:32.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:39:32.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57369.215481s, valid=False
2026-06-03T12:39:32.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:39:32.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:39:32.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:39:32.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:39:32.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:39:32.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:39:32.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:39:32.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:39:32.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:39:32.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:39:32.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:39:32.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:39:32.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:39:32.536 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:39:32.732 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:39:33.063 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:39:33.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:39:33.164 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:39:33.164 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:39:33.423 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:39:33.424 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:40:03.454 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:40:03.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:40:03.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:40:03.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:40:03.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:40:03.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:40:03.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:40:03.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:40:03.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:40:03.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:40:03.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:40:03.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:40:03.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:40:06.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:40:06.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:40:06.427 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:40:06.427 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:40:06.435 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:40:06.447 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:40:06.447 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:40:06.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:40:06.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:40:06.447 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:40:06.448 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:40:06.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:40:06.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:40:06.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:40:06.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:40:06.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:40:06.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:40:06.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:40:06.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:40:06.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:40:06.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:40:06.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:40:06.765 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:40:06.847 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:39:54
2026-06-03T12:40:06.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86048, datetime.datetime(2026, 6, 3, 12, 39, 54), datetime.datetime(2026, 6, 3, 12, 39, 53), 'salt', 6.91, 99.68, None, 32.07, 99.05, 0.05, 822.78, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:40:06.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:40:06.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:40:06.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:39:53, diff=13.854448s, valid=True
2026-06-03T12:40:06.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:40:06.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:40:06.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:40:12, diff=-5.142136s, valid=True
2026-06-03T12:40:06.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:40:06.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:40:06.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:39:53, diff=13.865885s, valid=True
2026-06-03T12:40:06.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:40:06.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:40:06.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:40:06.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:40:06.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:40:06.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:40:06.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:40:12, diff=-5.130505s, valid=True
2026-06-03T12:40:06.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:40:06.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:40:06.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:40:06.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57403.870292s, valid=False
2026-06-03T12:40:06.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:40:06.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:40:06.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:40:06.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:40:06.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:40:06.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:40:06.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:40:06.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:40:06.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:40:07.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:40:07.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:40:07.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:40:07.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:40:07.260 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:40:07.456 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:40:07.786 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:40:07.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:40:07.887 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:40:07.887 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:40:08.058 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:40:08.058 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:40:38.088 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:40:38.088 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:40:38.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:40:38.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:40:38.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:40:38.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:40:38.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:40:38.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:40:38.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:40:38.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:40:38.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:40:38.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:40:38.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:40:41.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:40:41.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:40:41.440 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:40:41.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:40:41.449 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:40:41.462 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:40:41.462 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:40:41.463 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:40:41.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:40:41.463 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:40:41.463 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:40:41.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:40:41.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:40:41.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:40:41.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:40:41.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:40:41.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:40:41.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:40:41.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:40:41.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:40:41.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:40:41.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:40:41.806 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:40:41.877 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:40:24
2026-06-03T12:40:41.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86049, datetime.datetime(2026, 6, 3, 12, 40, 24), datetime.datetime(2026, 6, 3, 12, 40, 24), 'salt', 6.84, 99.54, None, 32.28, 111.42, 0.06, 822.72, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:40:41.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:40:41.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:40:41.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:40:24, diff=17.885122s, valid=True
2026-06-03T12:40:41.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:40:41.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:40:41.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:40:12, diff=29.888677s, valid=True
2026-06-03T12:40:41.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:40:41.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:40:41.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:40:24, diff=17.89695s, valid=True
2026-06-03T12:40:41.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:40:41.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:40:41.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:40:41.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:40:41.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:40:41.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:40:41.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:40:12, diff=29.900741s, valid=True
2026-06-03T12:40:41.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:40:41.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:40:41.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:40:41.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57438.901553s, valid=False
2026-06-03T12:40:41.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:40:41.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:40:41.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:40:41.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:40:41.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:40:41.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:40:41.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:40:41.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:40:41.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:40:42.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:40:42.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:40:42.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:40:42.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:40:42.222 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:40:42.435 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:40:42.766 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:40:42.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:40:42.866 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:40:42.867 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:40:42.947 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:40:42.947 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:41:12.977 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:41:12.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:41:12.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:41:13.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:41:13.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:41:13.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:41:13.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:41:13.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:41:13.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:41:13.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:41:13.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:41:13.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:41:13.547 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:41:16.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:41:16.281 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:41:16.282 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:41:16.282 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:41:16.292 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:41:16.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:41:16.305 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:41:16.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:41:16.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:41:16.306 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:41:16.306 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:41:16.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:41:16.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:41:16.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:41:16.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:41:16.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:41:16.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:41:16.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:41:16.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:41:16.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:41:16.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:41:16.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:41:16.715 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:41:16.792 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:40:55
2026-06-03T12:41:16.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86050, datetime.datetime(2026, 6, 3, 12, 40, 55), datetime.datetime(2026, 6, 3, 12, 40, 54), 'salt', 6.91, 99.51, None, 36.73, 98.72, 0.07, 822.78, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:41:16.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:41:16.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:41:16.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:40:54, diff=22.799126s, valid=True
2026-06-03T12:41:16.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:41:16.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:41:16.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:41:12, diff=4.801994s, valid=True
2026-06-03T12:41:16.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:41:16.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:41:16.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:40:50, diff=26.808601s, valid=True
2026-06-03T12:41:16.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:41:16.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:41:16.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:41:16.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:41:16.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:41:16.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:41:16.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:41:12, diff=4.811583s, valid=True
2026-06-03T12:41:16.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:41:16.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:41:16.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:41:16.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57473.812249s, valid=False
2026-06-03T12:41:16.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:41:16.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:41:16.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:41:16.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:41:16.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:41:16.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:41:16.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:41:16.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:41:16.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:41:16.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:41:17.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:41:17.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:41:17.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:41:17.123 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:41:17.319 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:41:17.650 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:41:17.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:41:17.750 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:41:17.750 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:41:18.585 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:41:18.585 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:41:48.615 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:41:48.615 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:41:48.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:41:48.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:41:48.778 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:41:49.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:41:49.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:41:49.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:41:49.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:41:49.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:41:49.034 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:41:49.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:41:49.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:41:52.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:41:52.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:41:52.324 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:41:52.325 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:41:52.334 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:41:52.347 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:41:52.347 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:41:52.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:41:52.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:41:52.349 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:41:52.349 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:41:52.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:41:52.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:41:52.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:41:52.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:41:52.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:41:52.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T12:41:52.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:41:52.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T12:41:52.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:41:52.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:41:52.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:41:52.697 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:41:52.769 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:41:25
2026-06-03T12:41:52.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86051, datetime.datetime(2026, 6, 3, 12, 41, 25), datetime.datetime(2026, 6, 3, 12, 41, 24), 'salt', 6.97, 99.61, None, 36.13, 99.97, 0.05, 822.72, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:41:52.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:41:52.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:41:52.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:41:24, diff=28.777322s, valid=True
2026-06-03T12:41:52.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:41:52.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T12:41:52.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:41:12, diff=40.780846s, valid=True
2026-06-03T12:41:52.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:41:52.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:41:52.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:41:20, diff=32.788927s, valid=True
2026-06-03T12:41:52.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:41:52.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:41:52.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:41:52.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:41:52.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:41:52.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T12:41:52.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:41:12, diff=40.792664s, valid=True
2026-06-03T12:41:52.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:41:52.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:41:52.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:41:52.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57509.793475s, valid=False
2026-06-03T12:41:52.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:41:52.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:41:52.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:41:52.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:41:52.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:41:52.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:41:52.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:41:52.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:41:52.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:41:52.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:41:52.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:41:53.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:41:53.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:41:53.117 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:41:53.314 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:41:53.643 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:41:53.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:41:53.743 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:41:53.743 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:41:53.974 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:41:53.974 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:42:23.976 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:42:23.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:42:23.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:42:24.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:42:24.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:42:24.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:42:24.427 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:42:24.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:42:24.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:42:24.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:42:24.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:42:24.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:42:24.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:42:27.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:42:27.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:42:27.206 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:42:27.207 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:42:27.217 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:42:27.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:42:27.230 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:42:27.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:42:27.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:42:27.231 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:42:27.231 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:42:27.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:42:27.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:42:27.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:42:27.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:42:27.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:42:27.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:42:27.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:42:27.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:42:27.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:42:27.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:42:27.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:42:27.555 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:42:27.623 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:42:25
2026-06-03T12:42:27.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86053, datetime.datetime(2026, 6, 3, 12, 42, 25), datetime.datetime(2026, 6, 3, 12, 42, 25), 'salt', 6.87, 99.54, None, 35.39, 108.16, 0.06, 822.66, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:42:27.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:42:27.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:42:27.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:42:25, diff=2.630936s, valid=True
2026-06-03T12:42:27.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:42:27.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:42:27.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:42:12, diff=15.634217s, valid=True
2026-06-03T12:42:27.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:42:27.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:42:27.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:42:20, diff=7.641931s, valid=True
2026-06-03T12:42:27.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:42:27.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:42:27.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:42:27.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:42:27.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:42:27.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:42:27.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:42:12, diff=15.645404s, valid=True
2026-06-03T12:42:27.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:42:27.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:42:27.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:42:27.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57544.646165s, valid=False
2026-06-03T12:42:27.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:42:27.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:42:27.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:42:27.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:42:27.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:42:27.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:42:27.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:42:27.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:42:27.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:42:27.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:42:27.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:42:27.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:42:27.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:42:27.963 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:42:28.159 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:42:28.490 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:42:28.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:42:28.591 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:42:28.591 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:42:28.830 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:42:28.831 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:42:58.861 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:42:58.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:42:58.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:42:59.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:42:59.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:42:59.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:42:59.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:42:59.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:42:59.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:42:59.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:42:59.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:42:59.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:42:59.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:43:01.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:43:01.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:43:01.981 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:43:01.981 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:43:01.988 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:43:02.000 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:43:02.000 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:43:02.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:43:02.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:43:02.001 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:43:02.001 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:43:02.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:43:02.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:43:02.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:43:02.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:43:02.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:43:02.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:43:02.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:43:02.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:43:02.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:43:02.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:43:02.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:43:02.307 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:43:02.379 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:42:56
2026-06-03T12:43:02.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86054, datetime.datetime(2026, 6, 3, 12, 42, 56), datetime.datetime(2026, 6, 3, 12, 42, 55), 'salt', 6.84, 99.61, None, 33.55, 103.72, 0.05, 822.42, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:43:02.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:43:02.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:43:02.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:42:55, diff=7.386728s, valid=True
2026-06-03T12:43:02.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:43:02.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:43:02.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:43:12, diff=-9.609865s, valid=True
2026-06-03T12:43:02.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:43:02.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:43:02.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:42:51, diff=11.398193s, valid=True
2026-06-03T12:43:02.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:43:02.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:43:02.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:43:02.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:43:02.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:43:02.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:43:02.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:43:12, diff=-9.598136s, valid=True
2026-06-03T12:43:02.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:43:02.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:43:02.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:43:02.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57579.402663s, valid=False
2026-06-03T12:43:02.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:43:02.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:43:02.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:43:02.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:43:02.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:43:02.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:43:02.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:43:02.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:43:02.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:43:02.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:43:02.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:43:02.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:43:02.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:43:02.729 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:43:02.943 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:43:03.334 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:43:03.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:43:03.434 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:43:03.434 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:43:03.587 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:43:03.587 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:43:33.618 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:43:33.618 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:43:33.618 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:43:33.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:43:33.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:43:34.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:43:34.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:43:34.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:43:34.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:43:34.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:43:34.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:43:34.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:43:34.212 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:43:36.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:43:36.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:43:36.870 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:43:36.871 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:43:36.880 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:43:36.893 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:43:36.894 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:43:36.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:43:36.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:43:36.895 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:43:36.895 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:43:36.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:43:37.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:43:37.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:43:37.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:43:37.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:43:37.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:43:37.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:43:37.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:43:37.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:43:37.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:43:37.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:43:37.225 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:43:37.300 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:43:26
2026-06-03T12:43:37.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86055, datetime.datetime(2026, 6, 3, 12, 43, 26), datetime.datetime(2026, 6, 3, 12, 43, 25), 'salt', 6.94, 99.64, None, 34.82, 111.19, 0.05, 822.48, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:43:37.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:43:37.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:43:37.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:43:25, diff=12.306707s, valid=True
2026-06-03T12:43:37.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:43:37.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:43:37.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:43:12, diff=25.30956s, valid=True
2026-06-03T12:43:37.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:43:37.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:43:37.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:43:22, diff=15.316245s, valid=True
2026-06-03T12:43:37.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:43:37.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:43:37.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:43:37.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:43:37.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:43:37.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:43:37.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:43:12, diff=25.319317s, valid=True
2026-06-03T12:43:37.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:43:37.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:43:37.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:43:37.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57614.319975s, valid=False
2026-06-03T12:43:37.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:43:37.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:43:37.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:43:37.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:43:37.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:43:37.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:43:37.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:43:37.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:43:37.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:43:37.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:43:37.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:43:37.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:43:37.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:43:37.640 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:43:37.851 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:43:38.183 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:43:38.284 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:43:38.284 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:43:38.284 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:43:38.457 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:43:38.458 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:44:08.458 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:44:08.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:44:08.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:44:08.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:44:08.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:44:09.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:44:09.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:44:09.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:44:09.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:44:09.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:44:09.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:44:09.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:44:09.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:44:11.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:44:11.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:44:11.816 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:44:11.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:44:11.827 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:44:11.840 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:44:11.840 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:44:11.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:44:11.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:44:11.841 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:44:11.842 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:44:11.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:44:11.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:44:11.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:44:12.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:44:12.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:44:12.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:44:12.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:44:12.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:44:12.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:44:12.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:44:12.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:44:12.198 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:44:12.269 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:43:57
2026-06-03T12:44:12.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86056, datetime.datetime(2026, 6, 3, 12, 43, 57), datetime.datetime(2026, 6, 3, 12, 43, 56), 'salt', 6.97, 99.71, None, 35.21, 102.78, 0.03, 822.48, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:44:12.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:44:12.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:44:12.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:43:56, diff=16.276722s, valid=True
2026-06-03T12:44:12.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:44:12.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:44:12.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:44:12, diff=0.28033s, valid=True
2026-06-03T12:44:12.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:44:12.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:44:12.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:43:53, diff=19.288971s, valid=True
2026-06-03T12:44:12.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:44:12.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:44:12.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:44:12.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:44:12.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:44:12.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:44:12.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:44:12, diff=0.292843s, valid=True
2026-06-03T12:44:12.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:44:12.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:44:12.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:44:12.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57649.29368s, valid=False
2026-06-03T12:44:12.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:44:12.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:44:12.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:44:12.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:44:12.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:44:12.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:44:12.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:44:12.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:44:12.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:44:12.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:44:12.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:44:12.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:44:12.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:44:12.616 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:44:12.886 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:44:13.218 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:44:13.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:44:13.319 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:44:13.319 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:44:13.392 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:44:13.392 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:44:43.422 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:44:43.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:44:43.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:44:43.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:44:43.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:44:43.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:44:43.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:44:43.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:44:43.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:44:43.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:44:43.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:44:43.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:44:43.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:44:46.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:44:46.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:44:46.459 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:44:46.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:44:46.468 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:44:46.482 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:44:46.483 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:44:46.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:44:46.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:44:46.484 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:44:46.484 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:44:46.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:44:46.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:44:46.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:44:46.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:44:46.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:44:46.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:44:46.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:44:46.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:44:46.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:44:46.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:44:46.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:44:46.850 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:44:46.919 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:44:27
2026-06-03T12:44:46.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86057, datetime.datetime(2026, 6, 3, 12, 44, 27), datetime.datetime(2026, 6, 3, 12, 44, 26), 'salt', 6.94, 99.64, None, 30.84, 98.23, 0.05, 822.36, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:44:46.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:44:46.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:44:46.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:44:26, diff=20.927154s, valid=True
2026-06-03T12:44:46.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:44:46.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:44:46.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:44:12, diff=34.930766s, valid=True
2026-06-03T12:44:46.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:44:46.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:44:46.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:44:25, diff=21.939148s, valid=True
2026-06-03T12:44:46.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:44:46.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:44:46.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:44:46.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:44:46.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:44:46.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:44:46.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:44:12, diff=34.942976s, valid=True
2026-06-03T12:44:46.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:44:46.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:44:46.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:44:46.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57683.943811s, valid=False
2026-06-03T12:44:46.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:44:46.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:44:46.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:44:46.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:44:46.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:44:47.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:44:47.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:44:47.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:44:47.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:44:47.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:44:47.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:44:47.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:44:47.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:44:47.271 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:44:47.471 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:44:47.839 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:44:47.939 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:44:47.940 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:44:47.940 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:44:48.011 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:44:48.011 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:45:18.041 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:45:18.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:45:18.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:45:18.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:45:18.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:45:18.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:45:18.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:45:18.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:45:18.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:45:18.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:45:18.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:45:18.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:45:18.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:45:21.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:45:22.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:45:22.652 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:45:22.652 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:45:22.663 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:45:22.676 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:45:22.681 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:45:22.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:45:22.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:45:22.682 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:45:22.682 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:45:22.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:45:22.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:45:22.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:45:22.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:45:22.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:45:22.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:45:22.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:45:23.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:45:23.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:45:23.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:45:23.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:45:23.017 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:45:23.090 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:44:57
2026-06-03T12:45:23.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86058, datetime.datetime(2026, 6, 3, 12, 44, 57), datetime.datetime(2026, 6, 3, 12, 44, 56), 'salt', 6.97, 99.61, None, 35.11, 103.93, 0.05, 822.54, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:45:23.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:45:23.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:45:23.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:44:56, diff=27.098155s, valid=True
2026-06-03T12:45:23.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:45:23.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:45:23.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:45:12, diff=11.101682s, valid=True
2026-06-03T12:45:23.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:45:23.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:45:23.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:44:57, diff=26.109773s, valid=True
2026-06-03T12:45:23.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:45:23.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:45:23.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:45:23.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:45:23.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:45:23.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:45:23.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:45:12, diff=11.113534s, valid=True
2026-06-03T12:45:23.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:45:23.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:45:23.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:45:23.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57720.114377s, valid=False
2026-06-03T12:45:23.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:45:23.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:45:23.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:45:23.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:45:23.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:45:23.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:45:23.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:45:23.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:45:23.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:45:23.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:45:23.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:45:23.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:45:23.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:45:23.511 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:45:23.708 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:45:24.038 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:45:24.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:45:24.140 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:45:24.140 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:45:25.002 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:45:25.002 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:45:55.026 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:45:55.027 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:45:55.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:45:55.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:45:55.355 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:45:55.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:45:55.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:45:55.601 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:45:55.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:45:55.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:45:55.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:45:55.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:45:55.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:45:58.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:45:58.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:45:58.293 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:45:58.293 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:45:58.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:45:58.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:45:58.315 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:45:58.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:45:58.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:45:58.317 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:45:58.317 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:45:58.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:45:58.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:45:58.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:45:58.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:45:58.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:45:58.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:45:58.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:45:58.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:45:58.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:45:58.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:45:58.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:45:58.662 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:45:58.734 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:45:58
2026-06-03T12:45:58.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86060, datetime.datetime(2026, 6, 3, 12, 45, 58), datetime.datetime(2026, 6, 3, 12, 45, 57), 'salt', 7.04, 99.68, None, 38.14, 100.06, 0.04, 822.48, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:45:58.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:45:58.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:45:58.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:45:57, diff=1.741547s, valid=True
2026-06-03T12:45:58.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:45:58.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:45:58.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:46:12, diff=-13.254933s, valid=True
2026-06-03T12:45:58.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:45:58.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:45:58.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:45:52, diff=6.753127s, valid=True
2026-06-03T12:45:58.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:45:58.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:45:58.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:45:58.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:45:58.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:45:58.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:45:58.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:46:12, diff=-13.243182s, valid=True
2026-06-03T12:45:58.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:45:58.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:45:58.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:45:58.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57755.757607s, valid=False
2026-06-03T12:45:58.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:45:58.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:45:58.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:45:58.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:45:58.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:45:58.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:45:58.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:45:58.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:45:58.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:45:58.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:45:58.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:45:58.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:45:59.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:45:59.078 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:45:59.274 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:45:59.605 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:45:59.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:45:59.706 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:45:59.706 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:45:59.858 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:45:59.858 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:46:29.887 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:46:29.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:46:29.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:46:30.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:46:30.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:46:30.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:46:30.545 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:46:30.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:46:30.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:46:30.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:46:30.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:46:30.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:46:30.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:46:33.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:46:33.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:46:33.307 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:46:33.307 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:46:33.317 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:46:33.330 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:46:33.330 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:46:33.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:46:33.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:46:33.332 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:46:33.332 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:46:33.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:46:33.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:46:33.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:46:33.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:46:33.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:46:33.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:46:33.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:46:33.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:46:33.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:46:33.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:46:33.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:46:33.676 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:46:33.747 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:46:28
2026-06-03T12:46:33.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86061, datetime.datetime(2026, 6, 3, 12, 46, 28), datetime.datetime(2026, 6, 3, 12, 46, 27), 'salt', 7.01, 99.74, None, 32.71, 105.09, 0.04, 822.48, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:46:33.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:46:33.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:46:33.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:46:27, diff=6.755116s, valid=True
2026-06-03T12:46:33.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:46:33.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:46:33.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:46:12, diff=21.758576s, valid=True
2026-06-03T12:46:33.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:46:33.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:46:33.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:46:22, diff=11.766803s, valid=True
2026-06-03T12:46:33.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:46:33.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:46:33.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:46:33.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:46:33.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:46:33.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:46:33.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:46:12, diff=21.770545s, valid=True
2026-06-03T12:46:33.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:46:33.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:46:33.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:46:33.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57790.771345s, valid=False
2026-06-03T12:46:33.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:46:33.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:46:33.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:46:33.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:46:33.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:46:33.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:46:33.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:46:33.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:46:33.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:46:33.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:46:34.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:46:34.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:46:34.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:46:34.158 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:46:34.353 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:46:34.683 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:46:34.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:46:34.784 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:46:34.784 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:46:35.032 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:46:35.032 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:47:05.062 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:47:05.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:47:05.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:47:05.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:47:05.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:47:05.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:47:05.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:47:05.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:47:05.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:47:05.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:47:05.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:47:05.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:47:05.939 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:47:08.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:47:08.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:47:08.567 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:47:08.568 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:47:08.578 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:47:08.590 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:47:08.590 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:47:08.591 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:47:08.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:47:08.592 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:47:08.592 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:47:08.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:47:08.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:47:08.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:47:08.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:47:08.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:47:08.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:47:08.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:47:08.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:47:08.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:47:08.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:47:08.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:47:08.932 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:47:09.004 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:46:58
2026-06-03T12:47:09.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86062, datetime.datetime(2026, 6, 3, 12, 46, 58), datetime.datetime(2026, 6, 3, 12, 46, 57), 'salt', 6.94, 99.61, None, 33.77, 104.08, 0.05, 822.36, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:47:09.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:47:09.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:47:09.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:46:57, diff=12.012267s, valid=True
2026-06-03T12:47:09.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:47:09.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:47:09.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:47:12, diff=-2.984193s, valid=True
2026-06-03T12:47:09.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:47:09.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:47:09.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:46:53, diff=16.024082s, valid=True
2026-06-03T12:47:09.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:47:09.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:47:09.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:47:09.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:47:09.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:47:09.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:47:09.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:47:12, diff=-2.972182s, valid=True
2026-06-03T12:47:09.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:47:09.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:47:09.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:47:09.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57826.028633s, valid=False
2026-06-03T12:47:09.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:47:09.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:47:09.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:47:09.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:47:09.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:47:09.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:47:09.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:47:09.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:47:09.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:47:09.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:47:09.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:47:09.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:47:09.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:47:09.350 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:47:09.553 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:47:09.953 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:47:10.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:47:10.071 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:47:10.071 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:47:10.293 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:47:10.294 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:47:40.324 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:47:40.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:47:40.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:47:40.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:47:40.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:47:41.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:47:41.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:47:41.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:47:41.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:47:41.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:47:41.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:47:41.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:47:41.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:47:43.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:47:43.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:47:43.769 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:47:43.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:47:43.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:47:43.792 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:47:43.792 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:47:43.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:47:43.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:47:43.794 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:47:43.794 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:47:43.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:47:43.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:47:43.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:47:44.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:47:44.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:47:44.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:47:44.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:47:44.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:47:44.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:47:44.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:47:44.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:47:44.137 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:47:44.209 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:47:28
2026-06-03T12:47:44.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86063, datetime.datetime(2026, 6, 3, 12, 47, 28), datetime.datetime(2026, 6, 3, 12, 47, 28), 'salt', 7.01, 99.61, None, 36.38, 109.19, 0.06, 822.36, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:47:44.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:47:44.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:47:44.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:47:28, diff=16.217255s, valid=True
2026-06-03T12:47:44.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:47:44.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:47:44.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:47:12, diff=32.220769s, valid=True
2026-06-03T12:47:44.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:47:44.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:47:44.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:47:24, diff=20.229046s, valid=True
2026-06-03T12:47:44.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:47:44.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:47:44.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:47:44.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:47:44.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:47:44.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:47:44.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:47:12, diff=32.232778s, valid=True
2026-06-03T12:47:44.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:47:44.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:47:44.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:47:44.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57861.233592s, valid=False
2026-06-03T12:47:44.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:47:44.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:47:44.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:47:44.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:47:44.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:47:44.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:47:44.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:47:44.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:47:44.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:47:44.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:47:44.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:47:44.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:47:44.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:47:44.619 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:47:44.817 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:47:45.166 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:47:45.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:47:45.268 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:47:45.268 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:47:45.477 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:47:45.477 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:48:15.507 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:48:15.507 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:48:15.507 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:48:15.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:48:15.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:48:15.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:48:15.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:48:15.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:48:15.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:48:15.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:48:15.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:48:15.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:48:15.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:48:18.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:48:18.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:48:18.620 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:48:18.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:48:18.630 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:48:18.645 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:48:18.645 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:48:18.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:48:18.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:48:18.646 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:48:18.647 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:48:18.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:48:18.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:48:18.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:48:18.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:48:18.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:48:18.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:48:18.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:48:18.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:48:18.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:48:18.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:48:18.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:48:18.998 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:48:19.067 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:47:59
2026-06-03T12:48:19.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86064, datetime.datetime(2026, 6, 3, 12, 47, 59), datetime.datetime(2026, 6, 3, 12, 47, 58), 'salt', 7.07, 99.68, None, 36.84, 110.84, 0.04, 822.42, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:48:19.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:48:19.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:48:19.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:47:58, diff=21.074908s, valid=True
2026-06-03T12:48:19.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:48:19.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:48:19.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:48:12, diff=7.078397s, valid=True
2026-06-03T12:48:19.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:48:19.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:48:19.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:47:55, diff=24.086426s, valid=True
2026-06-03T12:48:19.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:48:19.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:48:19.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:48:19.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:48:19.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:48:19.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:48:19.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:48:12, diff=7.089846s, valid=True
2026-06-03T12:48:19.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:48:19.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:48:19.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:48:19.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57896.090556s, valid=False
2026-06-03T12:48:19.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:48:19.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:48:19.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:48:19.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:48:19.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:48:19.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:48:19.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:48:19.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:48:19.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:48:19.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:48:19.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:48:19.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:48:19.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:48:19.411 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:48:19.609 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:48:19.953 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:48:20.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:48:20.074 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:48:20.074 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:48:20.263 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:48:20.264 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:48:50.271 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:48:50.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:48:50.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:48:50.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:48:50.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:48:50.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:48:50.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:48:50.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:48:50.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:48:50.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:48:50.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:48:50.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:48:50.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:48:54.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:48:54.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:48:54.026 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:48:54.026 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:48:54.034 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:48:54.047 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:48:54.047 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:48:54.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:48:54.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:48:54.048 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:48:54.048 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:48:54.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:48:54.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:48:54.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:48:54.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:48:54.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:48:54.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T12:48:54.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:48:54.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T12:48:54.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:48:54.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:48:54.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:48:54.392 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:48:54.461 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:48:29
2026-06-03T12:48:54.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86065, datetime.datetime(2026, 6, 3, 12, 48, 29), datetime.datetime(2026, 6, 3, 12, 48, 28), 'salt', 6.97, 99.71, None, 37.47, 113.18, 0.03, 822.3, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:48:54.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:48:54.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:48:54.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:48:28, diff=26.469244s, valid=True
2026-06-03T12:48:54.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:48:54.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T12:48:54.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:48:12, diff=42.472739s, valid=True
2026-06-03T12:48:54.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:48:54.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:48:54.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:48:27, diff=27.480828s, valid=True
2026-06-03T12:48:54.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:48:54.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:48:54.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:48:54.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:48:54.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:48:54.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T12:48:54.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:48:12, diff=42.484564s, valid=True
2026-06-03T12:48:54.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:48:54.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:48:54.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:48:54.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57931.485388s, valid=False
2026-06-03T12:48:54.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:48:54.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:48:54.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:48:54.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:48:54.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:48:54.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:48:54.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:48:54.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:48:54.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:48:54.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:48:54.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:48:54.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:48:54.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:48:54.806 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:48:55.004 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:48:55.340 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:48:55.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:48:55.441 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:48:55.441 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:48:55.587 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:48:55.587 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:49:25.617 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:49:25.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:49:25.618 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:49:25.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:49:25.806 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:49:26.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:49:26.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:49:26.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:49:26.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:49:26.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:49:26.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:49:26.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:49:26.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:49:28.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:49:28.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:49:28.828 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:49:28.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:49:28.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:49:28.852 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:49:28.853 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:49:28.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:49:28.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:49:28.854 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:49:28.854 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:49:28.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:49:28.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:49:28.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:49:29.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:49:29.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:49:29.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:49:29.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:49:29.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:49:29.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:49:29.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:49:29.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:49:29.199 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:49:29.271 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:48:59
2026-06-03T12:49:29.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86066, datetime.datetime(2026, 6, 3, 12, 48, 59), datetime.datetime(2026, 6, 3, 12, 48, 58), 'salt', 6.91, 99.58, None, 37.68, 108.16, 0.06, 822.3, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:49:29.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:49:29.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:49:29.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:48:58, diff=31.279251s, valid=True
2026-06-03T12:49:29.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:49:29.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:49:29.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:49:12, diff=17.282766s, valid=True
2026-06-03T12:49:29.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:49:29.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:49:29.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:48:58, diff=31.291181s, valid=True
2026-06-03T12:49:29.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:49:29.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:49:29.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:49:29.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:49:29.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:49:29.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:49:29.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:49:12, diff=17.294977s, valid=True
2026-06-03T12:49:29.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:49:29.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:49:29.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:49:29.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=57966.295838s, valid=False
2026-06-03T12:49:29.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:49:29.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:49:29.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:49:29.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:49:29.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:49:29.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:49:29.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:49:29.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:49:29.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:49:29.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:49:29.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:49:29.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:49:29.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:49:29.618 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:49:29.816 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:49:30.170 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:49:30.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:49:30.273 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:49:30.273 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:49:30.341 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:49:30.341 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:50:00.372 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:50:00.372 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:50:00.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:50:00.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:50:00.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:50:00.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:50:00.940 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:50:00.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:50:00.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:50:00.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:50:00.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:50:00.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:50:00.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:50:03.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:50:03.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:50:03.657 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:50:03.657 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:50:03.668 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:50:03.681 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:50:03.681 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:50:03.682 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:50:03.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:50:03.682 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:50:03.683 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:50:03.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:50:03.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:50:03.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:50:03.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:50:03.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:50:03.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:50:03.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:50:04.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:50:04.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:50:04.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:50:04.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:50:04.024 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:50:04.094 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:50:00
2026-06-03T12:50:04.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86068, datetime.datetime(2026, 6, 3, 12, 50), datetime.datetime(2026, 6, 3, 12, 49, 59), 'salt', 7.01, 99.68, None, 34.68, 108.65, 0.05, 822.48, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:50:04.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:50:04.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:50:04.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:49:59, diff=5.101713s, valid=True
2026-06-03T12:50:04.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:50:04.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:50:04.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:50:12, diff=-7.894779s, valid=True
2026-06-03T12:50:04.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:50:04.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:50:04.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:49:54, diff=10.113439s, valid=True
2026-06-03T12:50:04.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:50:04.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:50:04.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:50:04.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:50:04.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:50:04.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:50:04.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:50:12, diff=-7.882788s, valid=True
2026-06-03T12:50:04.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:50:04.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:50:04.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:50:04.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58001.118023s, valid=False
2026-06-03T12:50:04.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:50:04.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:50:04.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:50:04.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:50:04.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:50:04.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:50:04.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:50:04.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:50:04.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:50:04.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:50:04.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:50:04.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:50:04.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:50:04.438 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:50:04.637 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:50:04.973 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:50:05.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:50:05.075 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:50:05.075 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:50:05.228 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:50:05.228 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:50:35.258 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:50:35.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:50:35.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:50:35.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:50:35.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:50:36.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:50:36.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:50:36.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:50:36.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:50:36.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:50:36.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:50:36.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:50:36.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:50:38.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:50:38.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:50:38.886 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:50:38.886 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:50:38.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:50:38.909 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:50:38.909 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:50:38.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:50:38.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:50:38.911 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:50:38.911 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:50:38.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:50:39.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:50:39.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:50:39.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:50:39.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:50:39.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:50:39.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:50:39.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:50:39.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:50:39.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:50:39.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:50:39.246 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:50:39.317 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:50:30
2026-06-03T12:50:39.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86069, datetime.datetime(2026, 6, 3, 12, 50, 30), datetime.datetime(2026, 6, 3, 12, 50, 29), 'salt', 7.07, 99.71, None, 35.85, 108.75, 0.03, 822.23, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:50:39.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:50:39.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:50:39.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:50:29, diff=10.32465s, valid=True
2026-06-03T12:50:39.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:50:39.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:50:39.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:50:12, diff=27.328105s, valid=True
2026-06-03T12:50:39.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:50:39.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:50:39.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:50:25, diff=14.336143s, valid=True
2026-06-03T12:50:39.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:50:39.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:50:39.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:50:39.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:50:39.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:50:39.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:50:39.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:50:12, diff=27.339883s, valid=True
2026-06-03T12:50:39.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:50:39.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:50:39.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:50:39.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58036.340692s, valid=False
2026-06-03T12:50:39.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:50:39.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:50:39.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:50:39.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:50:39.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:50:39.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:50:39.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:50:39.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:50:39.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:50:39.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:50:39.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:50:39.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:50:39.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:50:39.658 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:50:39.955 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:50:40.303 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:50:40.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:50:40.405 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:50:40.405 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:50:40.477 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:50:40.477 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:51:10.483 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:51:10.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:51:10.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:51:10.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:51:10.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:51:10.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:51:10.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:51:10.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:51:10.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:51:10.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:51:10.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:51:10.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:51:10.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:51:13.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:51:13.682 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:51:13.683 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:51:13.683 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:51:13.694 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:51:13.707 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:51:13.708 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:51:13.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:51:13.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:51:13.709 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:51:13.709 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:51:13.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:51:13.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:51:13.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:51:13.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:51:13.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:51:14.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:51:14.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:51:14.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:51:14.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:51:14.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:51:14.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:51:14.056 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:51:14.127 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:51:00
2026-06-03T12:51:14.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86070, datetime.datetime(2026, 6, 3, 12, 51), datetime.datetime(2026, 6, 3, 12, 50, 59), 'salt', 6.97, 99.61, None, 36.66, 109.36, 0.05, 822.17, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:51:14.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:51:14.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:51:14.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:50:59, diff=15.134971s, valid=True
2026-06-03T12:51:14.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:51:14.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:51:14.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:51:12, diff=2.138477s, valid=True
2026-06-03T12:51:14.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:51:14.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:51:14.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:50:55, diff=19.14666s, valid=True
2026-06-03T12:51:14.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:51:14.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:51:14.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:51:14.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:51:14.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:51:14.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:51:14.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:51:12, diff=2.150381s, valid=True
2026-06-03T12:51:14.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:51:14.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:51:14.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:51:14.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58071.151202s, valid=False
2026-06-03T12:51:14.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:51:14.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:51:14.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:51:14.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:51:14.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:51:14.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:51:14.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:51:14.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:51:14.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:51:14.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:51:14.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:51:14.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:51:14.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:51:14.471 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:51:14.685 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:51:15.031 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:51:15.135 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:51:15.135 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:51:15.135 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:51:15.290 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:51:15.290 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:51:45.296 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:51:45.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:51:45.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:51:45.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:51:45.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:51:45.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:51:45.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:51:45.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:51:45.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:51:45.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:51:45.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:51:45.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:51:45.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:51:48.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:51:48.578 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:51:48.579 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:51:48.579 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:51:48.587 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:51:48.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:51:48.600 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:51:48.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:51:48.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:51:48.601 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:51:48.602 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:51:48.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:51:48.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:51:48.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:51:48.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:51:48.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:51:48.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:51:48.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:51:48.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:51:48.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:51:48.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:51:48.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:51:48.934 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:51:49.004 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:51:30
2026-06-03T12:51:49.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86071, datetime.datetime(2026, 6, 3, 12, 51, 30), datetime.datetime(2026, 6, 3, 12, 51, 30), 'salt', 7.04, 99.71, None, 36.31, 99.22, 0.04, 822.42, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:51:49.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:51:49.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:51:49.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:51:30, diff=19.010813s, valid=True
2026-06-03T12:51:49.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:51:49.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:51:49.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:51:12, diff=37.013794s, valid=True
2026-06-03T12:51:49.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:51:49.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:51:49.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:51:26, diff=23.020929s, valid=True
2026-06-03T12:51:49.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:51:49.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:51:49.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:51:49.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:51:49.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:51:49.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:51:49.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:51:12, diff=37.024637s, valid=True
2026-06-03T12:51:49.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:51:49.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:51:49.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:51:49.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58106.025427s, valid=False
2026-06-03T12:51:49.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:51:49.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:51:49.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:51:49.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:51:49.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:51:49.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:51:49.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:51:49.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:51:49.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:51:49.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:51:49.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:51:49.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:51:49.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:51:49.413 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:51:49.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:51:49.970 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:51:50.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:51:50.093 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:51:50.093 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:51:50.273 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:51:50.273 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:52:20.304 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:52:20.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:52:20.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:52:20.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:52:20.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:52:20.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:52:20.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:52:20.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:52:20.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:52:21.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:52:21.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:52:21.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:52:21.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:52:23.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:52:23.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:52:23.775 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:52:23.775 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:52:23.786 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:52:23.799 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:52:23.800 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:52:23.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:52:23.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:52:23.801 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:52:23.801 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:52:23.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:52:23.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:52:23.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:52:24.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:52:24.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:52:24.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:52:24.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:52:24.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:52:24.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:52:24.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:52:24.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:52:24.138 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:52:24.209 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:52:01
2026-06-03T12:52:24.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86072, datetime.datetime(2026, 6, 3, 12, 52, 1), datetime.datetime(2026, 6, 3, 12, 52), 'salt', 7.1, 99.71, None, 36.13, 108.28, 0.03, 822.23, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:52:24.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:52:24.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:52:24.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:52:00, diff=24.21688s, valid=True
2026-06-03T12:52:24.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:52:24.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:52:24.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:52:12, diff=12.220422s, valid=True
2026-06-03T12:52:24.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:52:24.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:52:24.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:51:57, diff=27.228538s, valid=True
2026-06-03T12:52:24.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:52:24.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:52:24.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:52:24.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:52:24.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:52:24.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:52:24.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:52:12, diff=12.232278s, valid=True
2026-06-03T12:52:24.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:52:24.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:52:24.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:52:24.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58141.233102s, valid=False
2026-06-03T12:52:24.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:52:24.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:52:24.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:52:24.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:52:24.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:52:24.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:52:24.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:52:24.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:52:24.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:52:24.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:52:24.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:52:24.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:52:24.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:52:24.556 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:52:24.762 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:52:25.103 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:52:25.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:52:25.208 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:52:25.208 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:52:25.278 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:52:25.278 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:52:55.304 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:52:55.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:52:55.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:52:55.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:52:55.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:52:55.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:52:55.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:52:55.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:52:55.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:52:55.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:52:55.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:52:55.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:52:55.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:52:58.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:52:58.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:52:58.391 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:52:58.391 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:52:58.401 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:52:58.414 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:52:58.414 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:52:58.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:52:58.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:52:58.416 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:52:58.416 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:52:58.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:52:58.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:52:58.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:52:58.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:52:58.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:52:58.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T12:52:58.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:52:58.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T12:52:58.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:52:58.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:52:58.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:52:58.752 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:52:58.823 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:52:31
2026-06-03T12:52:58.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86073, datetime.datetime(2026, 6, 3, 12, 52, 31), datetime.datetime(2026, 6, 3, 12, 52, 30), 'salt', 7.11, 99.68, None, 35.78, 105.2, 0.04, 822.42, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:52:58.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:52:58.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:52:58.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:52:30, diff=28.830854s, valid=True
2026-06-03T12:52:58.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:52:58.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T12:52:58.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:52:12, diff=46.83432s, valid=True
2026-06-03T12:52:58.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:52:58.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:52:58.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:52:28, diff=30.842534s, valid=True
2026-06-03T12:52:58.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:52:58.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:52:58.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:52:58.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:52:58.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:52:58.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T12:52:58.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:52:12, diff=46.846504s, valid=True
2026-06-03T12:52:58.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:52:58.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:52:58.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:52:58.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58175.848195s, valid=False
2026-06-03T12:52:58.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:52:58.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:52:58.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:52:58.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:52:58.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:52:58.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:52:58.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:52:58.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:52:58.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:52:58.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:52:59.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:52:59.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:52:59.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:52:59.242 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:52:59.450 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:52:59.792 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:52:59.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:52:59.903 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:52:59.903 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:53:00.057 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:53:00.058 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:53:30.082 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:53:30.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:53:30.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:53:30.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:53:30.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:53:30.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:53:30.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:53:30.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:53:30.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:53:30.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:53:30.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:53:30.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:53:30.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:53:33.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:53:33.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:53:33.512 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:53:33.513 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:53:33.523 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:53:33.536 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:53:33.536 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:53:33.537 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:53:33.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:53:33.537 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:53:33.537 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:53:33.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:53:33.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:53:33.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:53:33.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:53:33.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:53:33.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:53:33.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:53:33.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:53:33.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:53:33.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:53:33.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:53:33.872 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:53:33.941 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:53:31
2026-06-03T12:53:33.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86075, datetime.datetime(2026, 6, 3, 12, 53, 31), datetime.datetime(2026, 6, 3, 12, 53, 31), 'salt', 7.04, 99.58, None, 27.49, 94.9, 0.06, 822.48, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:53:33.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:53:33.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:53:33.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:53:31, diff=2.948719s, valid=True
2026-06-03T12:53:33.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:53:33.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:53:33.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:53:12, diff=21.952183s, valid=True
2026-06-03T12:53:33.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:53:33.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:53:33.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:53:27, diff=6.960375s, valid=True
2026-06-03T12:53:33.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:53:33.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:53:33.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:53:33.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:53:33.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:53:33.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:53:33.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:53:12, diff=21.964094s, valid=True
2026-06-03T12:53:33.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:53:33.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:53:33.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:53:33.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58210.964905s, valid=False
2026-06-03T12:53:33.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:53:33.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:53:33.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:53:33.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:53:33.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:53:34.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:53:34.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:53:34.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:53:34.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:53:34.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:53:34.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:53:34.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:53:34.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:53:34.284 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:53:34.490 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:53:34.832 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:53:34.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:53:34.934 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:53:34.934 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:53:35.121 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:53:35.121 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:54:05.126 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:54:05.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:54:05.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:54:05.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:54:05.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:54:05.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:54:05.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:54:05.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:54:05.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:54:05.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:54:05.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:54:05.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:54:05.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:54:08.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:54:08.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:54:08.506 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:54:08.506 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:54:08.517 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:54:08.529 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:54:08.530 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:54:08.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:54:08.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:54:08.531 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:54:08.531 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:54:08.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:54:08.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:54:08.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:54:08.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:54:08.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:54:08.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:54:08.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:54:08.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:54:08.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:54:08.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:54:08.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:54:08.935 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:54:09.007 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:54:02
2026-06-03T12:54:09.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86076, datetime.datetime(2026, 6, 3, 12, 54, 2), datetime.datetime(2026, 6, 3, 12, 54, 1), 'salt', 7.17, 99.64, None, 35.14, 117.06, 0.04, 822.24, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:54:09.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:54:09.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:54:09.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:54:01, diff=8.013467s, valid=True
2026-06-03T12:54:09.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:54:09.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:54:09.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:54:12, diff=-2.983622s, valid=True
2026-06-03T12:54:09.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:54:09.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:54:09.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:53:57, diff=12.023154s, valid=True
2026-06-03T12:54:09.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:54:09.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:54:09.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:54:09.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:54:09.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:54:09.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:54:09.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:54:12, diff=-2.973805s, valid=True
2026-06-03T12:54:09.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:54:09.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:54:09.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:54:09.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58246.026855s, valid=False
2026-06-03T12:54:09.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:54:09.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:54:09.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:54:09.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:54:09.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:54:09.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:54:09.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:54:09.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:54:09.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:54:09.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:54:09.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:54:09.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:54:09.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:54:09.340 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:54:09.551 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:54:09.906 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:54:10.022 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:54:10.022 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:54:10.022 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:54:10.179 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:54:10.179 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:54:40.208 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:54:40.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:54:40.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:54:40.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:54:40.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:54:41.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:54:41.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:54:41.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:54:41.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:54:41.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:54:41.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:54:41.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:54:41.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:54:43.653 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:54:43.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:54:43.661 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:54:43.661 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:54:43.671 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:54:43.684 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:54:43.685 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:54:43.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:54:43.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:54:43.686 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:54:43.686 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:54:43.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:54:43.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:54:43.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:54:43.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:54:43.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:54:44.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:54:44.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:54:44.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T12:54:44.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:54:44.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:54:44.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:54:44.063 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:54:44.129 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:54:32
2026-06-03T12:54:44.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86077, datetime.datetime(2026, 6, 3, 12, 54, 32), datetime.datetime(2026, 6, 3, 12, 54, 31), 'salt', 7.14, 99.71, None, 36.13, 107.93, 0.04, 822.48, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:54:44.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:54:44.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:54:44.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:54:31, diff=13.136775s, valid=True
2026-06-03T12:54:44.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:54:44.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:54:44.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:54:12, diff=32.140122s, valid=True
2026-06-03T12:54:44.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:54:44.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:54:44.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:54:27, diff=17.147935s, valid=True
2026-06-03T12:54:44.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:54:44.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:54:44.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:54:44.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:54:44.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:54:44.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T12:54:44.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:54:12, diff=32.151538s, valid=True
2026-06-03T12:54:44.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:54:44.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:54:44.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:54:44.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58281.152317s, valid=False
2026-06-03T12:54:44.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:54:44.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:54:44.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:54:44.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:54:44.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:54:44.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:54:44.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:54:44.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:54:44.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:54:44.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:54:44.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:54:44.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:54:44.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:54:44.475 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:54:44.686 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:54:45.028 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:54:45.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:54:45.133 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:54:45.133 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:54:45.322 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:54:45.322 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:55:15.342 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:55:15.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:55:15.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:55:15.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:55:15.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:55:15.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:55:15.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:55:15.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:55:15.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:55:15.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:55:15.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:55:16.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:55:16.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:55:19.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:55:19.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:55:19.119 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:55:19.119 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:55:19.129 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:55:19.142 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:55:19.142 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:55:19.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:55:19.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:55:19.143 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:55:19.144 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:55:19.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:55:19.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:55:19.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:55:19.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:55:19.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:55:19.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T12:55:19.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:55:19.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T12:55:19.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:55:19.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:55:19.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:55:19.469 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:55:19.538 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:55:02
2026-06-03T12:55:19.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86078, datetime.datetime(2026, 6, 3, 12, 55, 2), datetime.datetime(2026, 6, 3, 12, 55, 1), 'salt', 7.01, 99.61, None, 34.79, 109.45, 0.05, 822.24, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:55:19.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:55:19.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:55:19.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:55:01, diff=18.5454s, valid=True
2026-06-03T12:55:19.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:55:19.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T12:55:19.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:54:12, diff=67.548913s, valid=True
2026-06-03T12:55:19.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:55:19.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:55:19.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:54:57, diff=22.557091s, valid=True
2026-06-03T12:55:19.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:55:19.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:55:19.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:55:19.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:55:19.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:55:19.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T12:55:19.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:54:12, diff=67.560811s, valid=True
2026-06-03T12:55:19.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:55:19.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:55:19.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:55:19.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58316.561599s, valid=False
2026-06-03T12:55:19.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:55:19.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:55:19.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:55:19.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:55:19.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:55:19.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:55:19.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:55:19.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:55:19.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:55:19.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:55:19.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:55:19.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:55:19.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:55:19.890 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:55:20.120 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:55:20.465 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:55:20.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:55:20.568 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:55:20.568 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:55:20.759 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:55:20.759 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:55:50.789 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:55:50.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:55:50.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:55:51.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:55:51.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:55:51.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:55:51.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:55:51.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:55:51.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:55:51.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:55:51.353 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:55:51.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:55:51.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:55:53.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:55:53.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:55:53.760 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:55:53.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:55:53.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:55:53.782 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:55:53.783 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:55:53.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:55:53.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:55:53.784 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:55:53.784 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:55:53.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:55:53.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:55:53.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:55:54.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:55:54.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:55:54.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T12:55:54.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:55:54.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T12:55:54.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:55:54.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:55:54.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:55:54.118 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:55:54.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:55:32
2026-06-03T12:55:54.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86079, datetime.datetime(2026, 6, 3, 12, 55, 32), datetime.datetime(2026, 6, 3, 12, 55, 32), 'salt', 7.01, 99.61, None, 37.58, 110.27, 0.05, 822.18, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:55:54.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:55:54.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:55:54.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:55:32, diff=22.195373s, valid=True
2026-06-03T12:55:54.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:55:54.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T12:55:54.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:54:12, diff=102.198914s, valid=True
2026-06-03T12:55:54.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:55:54.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:55:54.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:55:28, diff=26.207049s, valid=True
2026-06-03T12:55:54.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:55:54.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:55:54.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:55:54.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:55:54.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:55:54.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T12:55:54.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:54:12, diff=102.210784s, valid=True
2026-06-03T12:55:54.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:55:54.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:55:54.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:55:54.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58351.211585s, valid=False
2026-06-03T12:55:54.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:55:54.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:55:54.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:55:54.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:55:54.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:55:54.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:55:54.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:55:54.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:55:54.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:55:54.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:55:54.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:55:54.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:55:54.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:55:54.533 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:55:54.738 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:55:55.134 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:55:55.235 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:55:55.236 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:55:55.236 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:55:55.453 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:55:55.454 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:56:25.458 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:56:25.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:56:25.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:56:25.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:56:25.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:56:26.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:56:26.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:56:26.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:56:26.120 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:56:26.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:56:26.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:56:26.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:56:26.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:56:28.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:56:28.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:56:28.561 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:56:28.562 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:56:28.571 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:56:28.584 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:56:28.585 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:56:28.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:56:28.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:56:28.586 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:56:28.586 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:56:28.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:56:28.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:56:28.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:56:28.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:56:28.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:56:28.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:56:28.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:56:28.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T12:56:28.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:56:28.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:56:28.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:56:28.920 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:56:28.992 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:56:03
2026-06-03T12:56:28.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86080, datetime.datetime(2026, 6, 3, 12, 56, 3), datetime.datetime(2026, 6, 3, 12, 56, 2), 'salt', 7.07, 99.68, None, 37.82, 102.46, 0.04, 822.24, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:56:28.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:56:28.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:56:28.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:56:02, diff=26.999581s, valid=True
2026-06-03T12:56:28.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:56:28.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:56:29.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:54:12, diff=137.003086s, valid=True
2026-06-03T12:56:29.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:56:29.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:56:29.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:55:58, diff=31.011262s, valid=True
2026-06-03T12:56:29.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:56:29.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:56:29.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:56:29.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:56:29.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:56:29.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T12:56:29.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:54:12, diff=137.015041s, valid=True
2026-06-03T12:56:29.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:56:29.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:56:29.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:56:29.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58386.015888s, valid=False
2026-06-03T12:56:29.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:56:29.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:56:29.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:56:29.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:56:29.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:56:29.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:56:29.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:56:29.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:56:29.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:56:29.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:56:29.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:56:29.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:56:29.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:56:29.336 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:56:29.543 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:56:29.891 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:56:29.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:56:29.999 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:56:29.999 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:56:30.225 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:56:30.225 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:57:00.255 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:57:00.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:57:00.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:57:00.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:57:00.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:57:00.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:57:00.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:57:00.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:57:00.814 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:57:00.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:57:00.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:57:00.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:57:00.831 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:57:03.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:57:03.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:57:03.231 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:57:03.231 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:57:03.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:57:03.255 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:57:03.255 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:57:03.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:57:03.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:57:03.257 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:57:03.257 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:57:03.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:57:03.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:57:03.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:57:03.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:57:03.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:57:03.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:57:03.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:57:03.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:57:03.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:57:03.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:57:03.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:57:03.602 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:57:03.675 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:57:03
2026-06-03T12:57:03.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86082, datetime.datetime(2026, 6, 3, 12, 57, 3), datetime.datetime(2026, 6, 3, 12, 57, 2), 'salt', 6.94, 99.58, None, 37.01, 117.03, 0.06, 822.18, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:57:03.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:57:03.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:57:03.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:57:02, diff=1.68259s, valid=True
2026-06-03T12:57:03.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:57:03.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:57:03.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:54:12, diff=171.686109s, valid=True
2026-06-03T12:57:03.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:57:03.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:57:03.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:57:01, diff=2.694425s, valid=True
2026-06-03T12:57:03.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:57:03.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:57:03.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:57:03.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:57:03.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:57:03.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:57:03.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:54:12, diff=171.698149s, valid=True
2026-06-03T12:57:03.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:57:03.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:57:03.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:57:03.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58420.698976s, valid=False
2026-06-03T12:57:03.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:57:03.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:57:03.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:57:03.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:57:03.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:57:03.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:57:03.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:57:03.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:57:03.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:57:03.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:57:03.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:57:03.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:57:03.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:57:04.020 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:57:04.298 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:57:04.641 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:57:04.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:57:04.742 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:57:04.742 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:57:04.921 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:57:04.921 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:57:34.929 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:57:34.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:57:34.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:57:35.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:57:35.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:57:35.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:57:35.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:57:35.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:57:35.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:57:35.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:57:35.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:57:35.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:57:35.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:57:38.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:57:38.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:57:38.050 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:57:38.050 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:57:38.059 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:57:38.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:57:38.073 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:57:38.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:57:38.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:57:38.074 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:57:38.074 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:57:38.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:57:38.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:57:38.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:57:38.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:57:38.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:57:38.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:57:38.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:57:38.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:57:38.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:57:38.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:57:38.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:57:38.403 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:57:38.474 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:57:33
2026-06-03T12:57:38.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86083, datetime.datetime(2026, 6, 3, 12, 57, 33), datetime.datetime(2026, 6, 3, 12, 57, 33), 'salt', 7.01, 99.64, None, 36.62, 95.01, 0.05, 822.24, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:57:38.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:57:38.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:57:38.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:57:33, diff=5.481912s, valid=True
2026-06-03T12:57:38.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:57:38.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:57:38.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:54:12, diff=206.485294s, valid=True
2026-06-03T12:57:38.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:57:38.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:57:38.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:57:33, diff=5.493319s, valid=True
2026-06-03T12:57:38.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:57:38.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:57:38.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:57:38.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:57:38.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:57:38.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:57:38.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:54:12, diff=206.496924s, valid=True
2026-06-03T12:57:38.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:57:38.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:57:38.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:57:38.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58455.497719s, valid=False
2026-06-03T12:57:38.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:57:38.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:57:38.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:57:38.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:57:38.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:57:38.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:57:38.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:57:38.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:57:38.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:57:38.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:57:38.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:57:38.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:57:38.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:57:38.817 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:57:39.022 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:57:39.361 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:57:39.462 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:57:39.462 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:57:39.462 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:57:39.619 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:57:39.619 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:58:09.648 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:58:09.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:58:09.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:58:09.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:58:09.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:58:10.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:58:10.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:58:10.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:58:10.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:58:10.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:58:10.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:58:10.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:58:10.268 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:58:13.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:58:13.532 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:58:13.533 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:58:13.533 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:58:13.543 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:58:13.556 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:58:13.556 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:58:13.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:58:13.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:58:13.557 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:58:13.557 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:58:13.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:58:13.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:58:13.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:58:13.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:58:13.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:58:13.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T12:58:13.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:58:13.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T12:58:13.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:58:13.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:58:13.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:58:13.888 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:58:13.961 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:58:04
2026-06-03T12:58:13.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86084, datetime.datetime(2026, 6, 3, 12, 58, 4), datetime.datetime(2026, 6, 3, 12, 58, 3), 'salt', 7.01, 99.68, None, 34.79, 106.14, 0.05, 822.42, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:58:13.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:58:13.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:58:13.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:58:03, diff=10.968666s, valid=True
2026-06-03T12:58:13.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:58:13.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T12:58:13.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:54:12, diff=241.972s, valid=True
2026-06-03T12:58:13.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:58:13.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:58:13.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:57:59, diff=14.979924s, valid=True
2026-06-03T12:58:13.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:58:13.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:58:13.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:58:13.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:58:13.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:58:13.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T12:58:13.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:54:12, diff=241.983554s, valid=True
2026-06-03T12:58:13.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:58:13.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:58:13.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:58:13.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58490.984342s, valid=False
2026-06-03T12:58:13.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:58:13.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:58:13.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:58:13.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:58:13.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:58:14.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:58:14.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:58:14.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:58:14.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:58:14.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:58:14.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:58:14.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:58:14.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:58:14.373 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:58:14.580 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:58:14.918 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:58:15.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:58:15.020 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:58:15.020 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:58:15.249 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:58:15.249 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:58:45.278 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:58:45.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:58:45.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:58:45.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:58:45.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:58:45.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:58:45.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:58:45.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:58:45.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:58:45.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:58:45.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:58:45.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:58:45.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:58:48.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:58:48.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:58:48.389 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:58:48.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:58:48.399 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:58:48.412 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:58:48.413 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:58:48.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:58:48.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:58:48.414 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:58:48.414 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:58:48.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:58:48.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:58:48.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:58:48.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:58:48.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:58:48.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:58:48.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:58:48.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T12:58:48.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:58:48.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:58:48.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:58:48.742 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:58:48.811 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:58:34
2026-06-03T12:58:48.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86085, datetime.datetime(2026, 6, 3, 12, 58, 34), datetime.datetime(2026, 6, 3, 12, 58, 33), 'salt', 7.07, 99.71, None, 37.86, 102.57, 0.03, 822.24, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:58:48.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:58:48.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:58:48.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:58:33, diff=15.818989s, valid=True
2026-06-03T12:58:48.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:58:48.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:58:48.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:59:12, diff=-23.177525s, valid=True
2026-06-03T12:58:48.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:58:48.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:58:48.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:58:29, diff=19.830634s, valid=True
2026-06-03T12:58:48.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:58:48.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:58:48.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:58:48.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:58:48.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:58:48.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T12:58:48.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:59:12, diff=-23.165721s, valid=True
2026-06-03T12:58:48.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:58:48.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:58:48.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:58:48.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58525.835077s, valid=False
2026-06-03T12:58:48.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:58:48.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:58:48.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:58:48.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:58:48.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:58:48.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:58:48.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:58:48.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:58:48.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:58:48.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:58:49.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:58:49.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:58:49.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:58:49.157 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:58:49.378 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:58:49.718 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:58:49.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:58:49.820 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:58:49.820 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:58:49.970 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:58:49.970 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:59:20.000 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:59:20.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:59:20.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:59:20.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:59:20.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:59:20.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:59:20.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:59:20.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:59:20.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:59:20.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:59:20.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:59:20.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:59:20.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:59:23.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:59:23.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:59:23.602 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:59:23.602 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:59:23.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:59:23.626 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:59:23.627 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:59:23.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:59:23.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:59:23.628 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:59:23.628 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:59:23.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:59:23.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T12:59:23.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:59:23.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T12:59:23.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:59:23.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T12:59:23.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:59:23.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T12:59:23.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:59:23.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:59:23.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:59:23.967 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:59:24.037 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:59:04
2026-06-03T12:59:24.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86086, datetime.datetime(2026, 6, 3, 12, 59, 4), datetime.datetime(2026, 6, 3, 12, 59, 3), 'salt', 6.97, 99.64, None, 34.08, 101.42, 0.04, 822.42, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:59:24.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:59:24.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T12:59:24.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:59:03, diff=21.045233s, valid=True
2026-06-03T12:59:24.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:59:24.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T12:59:24.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:59:12, diff=12.048729s, valid=True
2026-06-03T12:59:24.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:59:24.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T12:59:24.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:58:59, diff=25.057149s, valid=True
2026-06-03T12:59:24.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:59:24.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:59:24.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:59:24.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:59:24.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:59:24.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T12:59:24.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:59:12, diff=12.060742s, valid=True
2026-06-03T12:59:24.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:59:24.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:59:24.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:59:24.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58561.061499s, valid=False
2026-06-03T12:59:24.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:59:24.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:59:24.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:59:24.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:59:24.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:59:24.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:59:24.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:59:24.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:59:24.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:59:24.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:59:24.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:59:24.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:59:24.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:59:24.535 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:59:24.739 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:59:25.077 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T12:59:25.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T12:59:25.180 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T12:59:25.180 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T12:59:25.339 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T12:59:25.339 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T12:59:55.358 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T12:59:55.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T12:59:55.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T12:59:55.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T12:59:55.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T12:59:55.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T12:59:55.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T12:59:56.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T12:59:56.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T12:59:56.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T12:59:56.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T12:59:56.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T12:59:56.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T12:59:58.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T12:59:58.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T12:59:58.729 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T12:59:58.730 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T12:59:58.739 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T12:59:58.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T12:59:58.754 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T12:59:58.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T12:59:58.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T12:59:58.755 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T12:59:58.755 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T12:59:58.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T12:59:58.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T12:59:58.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T12:59:58.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T12:59:58.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:59:59.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T12:59:59.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T12:59:59.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T12:59:59.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T12:59:59.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T12:59:59.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T12:59:59.090 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T12:59:59.162 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 12:59:34
2026-06-03T12:59:59.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86087, datetime.datetime(2026, 6, 3, 12, 59, 34), datetime.datetime(2026, 6, 3, 12, 59, 34), 'salt', 6.77, 99.61, None, 33.1, 102.93, 0.05, 822.11, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T12:59:59.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T12:59:59.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T12:59:59.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:59:34, diff=25.170276s, valid=True
2026-06-03T12:59:59.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T12:59:59.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T12:59:59.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:00:12, diff=-12.826334s, valid=True
2026-06-03T12:59:59.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T12:59:59.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T12:59:59.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 12:59:30, diff=29.181429s, valid=True
2026-06-03T12:59:59.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T12:59:59.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:59:59.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T12:59:59.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T12:59:59.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T12:59:59.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T12:59:59.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:00:12, diff=-12.814972s, valid=True
2026-06-03T12:59:59.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T12:59:59.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T12:59:59.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T12:59:59.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58596.185815s, valid=False
2026-06-03T12:59:59.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T12:59:59.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T12:59:59.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T12:59:59.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T12:59:59.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T12:59:59.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T12:59:59.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T12:59:59.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T12:59:59.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T12:59:59.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T12:59:59.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T12:59:59.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T12:59:59.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T12:59:59.511 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T12:59:59.720 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:00:00.095 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:00:00.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:00:00.243 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:00:00.243 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:00:00.501 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:00:00.502 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:00:30.506 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:00:30.506 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:00:30.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:00:30.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:00:30.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:00:31.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:00:31.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:00:31.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:00:31.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:00:31.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:00:31.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:00:31.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:00:31.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:00:35.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:00:35.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:00:35.274 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:00:35.275 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:00:35.284 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:00:35.297 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:00:35.298 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:00:35.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:00:35.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:00:35.299 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:00:35.299 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:00:35.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:00:35.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T13:00:35.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:00:35.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T13:00:35.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:00:35.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:00:35.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:00:35.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:00:35.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:00:35.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:00:35.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:00:35.621 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:00:35.692 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:00:35
2026-06-03T13:00:35.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86089, datetime.datetime(2026, 6, 3, 13, 0, 35), datetime.datetime(2026, 6, 3, 13, 0, 34), 'salt', 7.04, 99.61, None, 33.77, 109.19, 0.05, 822.24, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:00:35.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:00:35.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T13:00:35.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:00:34, diff=1.699792s, valid=True
2026-06-03T13:00:35.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:00:35.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:00:35.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:01:12, diff=-36.296842s, valid=True
2026-06-03T13:00:35.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:00:35.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T13:00:35.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:00:32, diff=3.711031s, valid=True
2026-06-03T13:00:35.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:00:35.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:00:35.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:00:35.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:00:35.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:00:35.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:00:35.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:01:12, diff=-36.285404s, valid=True
2026-06-03T13:00:35.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:00:35.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:00:35.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:00:35.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58632.71539s, valid=False
2026-06-03T13:00:35.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:00:35.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:00:35.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:00:35.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:00:35.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:00:35.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:00:35.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:00:35.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:00:35.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:00:35.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:00:35.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:00:36.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:00:36.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:00:36.100 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:00:36.305 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:00:36.646 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:00:36.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:00:36.748 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:00:36.748 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:00:37.011 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:00:37.012 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:01:07.028 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:01:07.028 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:01:07.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:01:07.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:01:07.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:01:07.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:01:07.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:01:07.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:01:07.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:01:07.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:01:07.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:01:07.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:01:07.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:01:10.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:01:10.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:01:10.141 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:01:10.141 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:01:10.149 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:01:10.161 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:01:10.162 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:01:10.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:01:10.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:01:10.162 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:01:10.162 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:01:10.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:01:10.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T13:01:10.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:01:10.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T13:01:10.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:01:10.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:01:10.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:01:10.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:01:10.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:01:10.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:01:10.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:01:10.503 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:01:10.576 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:01:05
2026-06-03T13:01:10.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86090, datetime.datetime(2026, 6, 3, 13, 1, 5), datetime.datetime(2026, 6, 3, 13, 1, 4), 'salt', 6.94, 99.54, None, 35.35, 101.66, 0.06, 822.12, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:01:10.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:01:10.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T13:01:10.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:01:04, diff=6.583313s, valid=True
2026-06-03T13:01:10.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:01:10.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:01:10.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:01:12, diff=-1.413354s, valid=True
2026-06-03T13:01:10.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:01:10.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T13:01:10.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:01:03, diff=7.594652s, valid=True
2026-06-03T13:01:10.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:01:10.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:01:10.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:01:10.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:01:10.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:01:10.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:01:10.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:01:12, diff=-1.401762s, valid=True
2026-06-03T13:01:10.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:01:10.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:01:10.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:01:10.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58667.599033s, valid=False
2026-06-03T13:01:10.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:01:10.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:01:10.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:01:10.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:01:10.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:01:10.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:01:10.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:01:10.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:01:10.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:01:10.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:01:10.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:01:10.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:01:10.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:01:10.923 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:01:11.130 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:01:11.472 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:01:11.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:01:11.576 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:01:11.576 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:01:11.647 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:01:11.647 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:01:41.677 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:01:41.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:01:41.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:01:42.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:01:42.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:01:42.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:01:42.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:01:42.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:01:42.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:01:42.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:01:42.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:01:42.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:01:42.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:01:45.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:01:45.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:01:45.496 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:01:45.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:01:45.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:01:45.517 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:01:45.518 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:01:45.518 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:01:45.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:01:45.519 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:01:45.519 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:01:45.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:01:45.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T13:01:45.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:01:45.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T13:01:45.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:01:45.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:01:45.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:01:45.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:01:45.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:01:45.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:01:45.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:01:45.864 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:01:45.938 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:01:35
2026-06-03T13:01:45.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86091, datetime.datetime(2026, 6, 3, 13, 1, 35), datetime.datetime(2026, 6, 3, 13, 1, 35), 'salt', 7.07, 99.68, None, 38.28, 102.1, 0.04, 822.3, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:01:45.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:01:45.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T13:01:45.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:01:35, diff=10.945935s, valid=True
2026-06-03T13:01:45.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:01:45.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:01:45.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:02:12, diff=-26.050601s, valid=True
2026-06-03T13:01:45.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:01:45.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T13:01:45.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:01:35, diff=10.957457s, valid=True
2026-06-03T13:01:45.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:01:45.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:01:45.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:01:45.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:01:45.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:01:45.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:01:45.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:02:12, diff=-26.038821s, valid=True
2026-06-03T13:01:45.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:01:45.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:01:45.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:01:45.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58702.962003s, valid=False
2026-06-03T13:01:45.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:01:45.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:01:45.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:01:45.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:01:45.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:01:46.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:01:46.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:01:46.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:01:46.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:01:46.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:01:46.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:01:46.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:01:46.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:01:46.283 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:01:46.489 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:01:46.830 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:01:46.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:01:46.933 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:01:46.933 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:01:47.168 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:01:47.168 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:02:17.195 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:02:17.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:02:17.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:02:17.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:02:17.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:02:17.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:02:17.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:02:17.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:02:17.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:02:17.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:02:17.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:02:17.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:02:17.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:02:20.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:02:20.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:02:20.369 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:02:20.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:02:20.380 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:02:20.392 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:02:20.393 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:02:20.393 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:02:20.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:02:20.394 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:02:20.394 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:02:20.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:02:20.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T13:02:20.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:02:20.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T13:02:20.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:02:20.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:02:20.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:02:20.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:02:20.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:02:20.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:02:20.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:02:20.730 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:02:20.801 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:02:06
2026-06-03T13:02:20.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86092, datetime.datetime(2026, 6, 3, 13, 2, 6), datetime.datetime(2026, 6, 3, 13, 2, 5), 'salt', 7.01, 99.68, None, 35.95, 98.11, 0.05, 822.18, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:02:20.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:02:20.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T13:02:20.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:02:05, diff=15.808721s, valid=True
2026-06-03T13:02:20.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:02:20.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:02:20.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:02:12, diff=8.812217s, valid=True
2026-06-03T13:02:20.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:02:20.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T13:02:20.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:02:01, diff=19.820297s, valid=True
2026-06-03T13:02:20.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:02:20.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:02:20.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:02:20.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:02:20.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:02:20.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:02:20.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:02:12, diff=8.824003s, valid=True
2026-06-03T13:02:20.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:02:20.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:02:20.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:02:20.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58737.824841s, valid=False
2026-06-03T13:02:20.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:02:20.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:02:20.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:02:20.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:02:20.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:02:20.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:02:20.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:02:20.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:02:20.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:02:20.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:02:21.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:02:21.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:02:21.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:02:21.149 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:02:21.359 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:02:21.754 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:02:21.862 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:02:21.863 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:02:21.863 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:02:22.027 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:02:22.027 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:02:52.053 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:02:52.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:02:52.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:02:52.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:02:52.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:02:52.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:02:52.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:02:52.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:02:52.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:02:52.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:02:52.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:02:52.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:02:52.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:02:55.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:02:55.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:02:55.302 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:02:55.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:02:55.355 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:02:55.367 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:02:55.368 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:02:55.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:02:55.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:02:55.369 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:02:55.369 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:02:55.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:02:55.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T13:02:55.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:02:55.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T13:02:55.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:02:55.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:02:55.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:02:55.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:02:55.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:02:55.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:02:55.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:02:55.717 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:02:55.792 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:02:36
2026-06-03T13:02:55.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86093, datetime.datetime(2026, 6, 3, 13, 2, 36), datetime.datetime(2026, 6, 3, 13, 2, 35), 'salt', 7.11, 99.71, None, 37.54, 102.29, 0.04, 821.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:02:55.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:02:55.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T13:02:55.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:02:35, diff=20.8005s, valid=True
2026-06-03T13:02:55.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:02:55.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:02:55.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:03:12, diff=-16.195854s, valid=True
2026-06-03T13:02:55.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:02:55.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T13:02:55.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:02:31, diff=24.812568s, valid=True
2026-06-03T13:02:55.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:02:55.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:02:55.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:02:55.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:02:55.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:02:55.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:02:55.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:03:12, diff=-16.183648s, valid=True
2026-06-03T13:02:55.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:02:55.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:02:55.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:02:55.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58772.817178s, valid=False
2026-06-03T13:02:55.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:02:55.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:02:55.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:02:55.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:02:55.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:02:55.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:02:55.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:02:55.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:02:55.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:02:55.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:02:56.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:02:56.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:02:56.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:02:56.135 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:02:56.344 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:02:56.689 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:02:56.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:02:56.791 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:02:56.791 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:02:56.947 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:02:56.947 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:03:26.977 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:03:26.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:03:26.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:03:27.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:03:27.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:03:27.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:03:27.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:03:27.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:03:27.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:03:27.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:03:27.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:03:27.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:03:27.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:03:30.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:03:30.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:03:30.700 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:03:30.701 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:03:30.710 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:03:30.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:03:30.723 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:03:30.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:03:30.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:03:30.724 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:03:30.724 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:03:30.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:03:30.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:03:30.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:03:30.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:03:30.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:03:31.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:03:31.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:03:31.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:03:31.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:03:31.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:03:31.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:03:31.078 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:03:31.149 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:03:06
2026-06-03T13:03:31.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86094, datetime.datetime(2026, 6, 3, 13, 3, 6), datetime.datetime(2026, 6, 3, 13, 3, 5), 'salt', 7.04, 99.64, None, 37.08, 103.93, 0.05, 822.3, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:03:31.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:03:31.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:03:31.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:03:05, diff=26.157021s, valid=True
2026-06-03T13:03:31.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:03:31.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:03:31.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:03:12, diff=19.160367s, valid=True
2026-06-03T13:03:31.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:03:31.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:03:31.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:03:01, diff=30.168316s, valid=True
2026-06-03T13:03:31.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:03:31.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:03:31.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:03:31.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:03:31.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:03:31.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:03:31.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:03:12, diff=19.171893s, valid=True
2026-06-03T13:03:31.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:03:31.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:03:31.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:03:31.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58808.17267s, valid=False
2026-06-03T13:03:31.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:03:31.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:03:31.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:03:31.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:03:31.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:03:31.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:03:31.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:03:31.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:03:31.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:03:31.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:03:31.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:03:31.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:03:31.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:03:31.561 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:03:31.765 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:03:32.107 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:03:32.209 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:03:32.209 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:03:32.209 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:03:32.445 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:03:32.445 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:04:02.475 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:04:02.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:04:02.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:04:03.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:04:03.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:04:03.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:04:03.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:04:03.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:04:03.458 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:04:03.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:04:03.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:04:03.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:04:03.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:04:06.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:04:06.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:04:06.095 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:04:06.096 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:04:06.108 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:04:06.121 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:04:06.121 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:04:06.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:04:06.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:04:06.122 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:04:06.122 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:04:06.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:04:06.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:04:06.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:04:06.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:04:06.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:04:06.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:04:06.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:04:06.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:04:06.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:04:06.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:04:06.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:04:06.456 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:04:06.528 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:03:36
2026-06-03T13:04:06.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86095, datetime.datetime(2026, 6, 3, 13, 3, 36), datetime.datetime(2026, 6, 3, 13, 3, 36), 'salt', 7.01, 99.61, None, 39.55, 100.3, 0.05, 822.24, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:04:06.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:04:06.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:04:06.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:03:36, diff=30.536393s, valid=True
2026-06-03T13:04:06.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:04:06.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:04:06.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:04:12, diff=-5.460096s, valid=True
2026-06-03T13:04:06.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:04:06.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:04:06.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:03:31, diff=35.548121s, valid=True
2026-06-03T13:04:06.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:04:06.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:04:06.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:04:06.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:04:06.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:04:06.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:04:06.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:04:12, diff=-5.448127s, valid=True
2026-06-03T13:04:06.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:04:06.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:04:06.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:04:06.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58843.552683s, valid=False
2026-06-03T13:04:06.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:04:06.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:04:06.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:04:06.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:04:06.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:04:06.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:04:06.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:04:06.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:04:06.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:04:06.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:04:06.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:04:06.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:04:06.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:04:06.877 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:04:07.081 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:04:07.418 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:04:07.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:04:07.520 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:04:07.520 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:04:07.750 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:04:07.750 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:04:37.781 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:04:37.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:04:37.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:04:38.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:04:38.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:04:38.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:04:38.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:04:38.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:04:38.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:04:38.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:04:38.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:04:38.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:04:38.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:04:41.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:04:41.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:04:41.105 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:04:41.106 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:04:41.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:04:41.126 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:04:41.126 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:04:41.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:04:41.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:04:41.126 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:04:41.127 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:04:41.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:04:41.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T13:04:41.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:04:41.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T13:04:41.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:04:41.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:04:41.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:04:41.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:04:41.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:04:41.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:04:41.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:04:41.437 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:04:41.505 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:04:37
2026-06-03T13:04:41.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86097, datetime.datetime(2026, 6, 3, 13, 4, 37), datetime.datetime(2026, 6, 3, 13, 4, 36), 'salt', 7.04, 99.61, None, 33.34, 99.36, 0.05, 822.05, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:04:41.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:04:41.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T13:04:41.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:04:36, diff=5.512332s, valid=True
2026-06-03T13:04:41.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:04:41.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:04:41.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:05:12, diff=-30.484289s, valid=True
2026-06-03T13:04:41.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:04:41.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T13:04:41.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:04:33, diff=8.523641s, valid=True
2026-06-03T13:04:41.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:04:41.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:04:41.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:04:41.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:04:41.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:04:41.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:04:41.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:05:12, diff=-30.472811s, valid=True
2026-06-03T13:04:41.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:04:41.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:04:41.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:04:41.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58878.527965s, valid=False
2026-06-03T13:04:41.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:04:41.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:04:41.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:04:41.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:04:41.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:04:41.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:04:41.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:04:41.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:04:41.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:04:41.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:04:41.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:04:41.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:04:41.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:04:41.916 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:04:42.121 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:04:42.461 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:04:42.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:04:42.563 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:04:42.563 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:04:42.696 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:04:42.697 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:05:12.705 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:05:12.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:05:12.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:05:12.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:05:12.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:05:13.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:05:13.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:05:13.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:05:13.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:05:13.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:05:13.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:05:13.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:05:13.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:05:16.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:05:16.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:05:16.125 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:05:16.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:05:16.135 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:05:16.148 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:05:16.149 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:05:16.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:05:16.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:05:16.150 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:05:16.150 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:05:16.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:05:16.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T13:05:16.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:05:16.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T13:05:16.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:05:16.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:05:16.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:05:16.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:05:16.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:05:16.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:05:16.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:05:16.473 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:05:16.540 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:05:07
2026-06-03T13:05:16.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86098, datetime.datetime(2026, 6, 3, 13, 5, 7), datetime.datetime(2026, 6, 3, 13, 5, 6), 'salt', 7.14, 99.71, None, 32.64, 98.16, 0.04, 822.24, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:05:16.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:05:16.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T13:05:16.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:05:06, diff=10.547901s, valid=True
2026-06-03T13:05:16.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:05:16.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:05:16.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:05:12, diff=4.551281s, valid=True
2026-06-03T13:05:16.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:05:16.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T13:05:16.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:05:04, diff=12.559169s, valid=True
2026-06-03T13:05:16.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:05:16.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:05:16.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:05:16.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:05:16.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:05:16.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:05:16.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:05:12, diff=4.562767s, valid=True
2026-06-03T13:05:16.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:05:16.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:05:16.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:05:16.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58913.563543s, valid=False
2026-06-03T13:05:16.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:05:16.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:05:16.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:05:16.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:05:16.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:05:16.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:05:16.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:05:16.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:05:16.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:05:16.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:05:16.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:05:16.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:05:16.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:05:16.882 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:05:17.086 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:05:17.423 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:05:17.525 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:05:17.526 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:05:17.526 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:05:17.711 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:05:17.711 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:05:47.731 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:05:47.731 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:05:47.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:05:48.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:05:48.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:05:48.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:05:48.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:05:48.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:05:48.353 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:05:48.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:05:48.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:05:48.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:05:48.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:05:50.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:05:50.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:05:50.998 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:05:50.998 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:05:51.007 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:05:51.020 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:05:51.021 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:05:51.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:05:51.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:05:51.022 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:05:51.022 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:05:51.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:05:51.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T13:05:51.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:05:51.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T13:05:51.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:05:51.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:05:51.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:05:51.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:05:51.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:05:51.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:05:51.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:05:51.350 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:05:51.419 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:05:37
2026-06-03T13:05:51.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86099, datetime.datetime(2026, 6, 3, 13, 5, 37), datetime.datetime(2026, 6, 3, 13, 5, 37), 'salt', 7.07, 99.71, None, 37.01, 104.59, 0.03, 822.11, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:05:51.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:05:51.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T13:05:51.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:05:37, diff=14.427397s, valid=True
2026-06-03T13:05:51.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:05:51.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:05:51.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:06:12, diff=-20.568983s, valid=True
2026-06-03T13:05:51.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:05:51.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T13:05:51.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:05:36, diff=15.439404s, valid=True
2026-06-03T13:05:51.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:05:51.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:05:51.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:05:51.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:05:51.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:05:51.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:05:51.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:06:12, diff=-20.556764s, valid=True
2026-06-03T13:05:51.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:05:51.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:05:51.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:05:51.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58948.444059s, valid=False
2026-06-03T13:05:51.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:05:51.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:05:51.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:05:51.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:05:51.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:05:51.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:05:51.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:05:51.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:05:51.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:05:51.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:05:51.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:05:51.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:05:51.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:05:51.836 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:05:52.045 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:05:52.394 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:05:52.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:05:52.498 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:05:52.498 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:05:52.667 [WARNING] [MainThread] [clean.py] [copy_files()] Error uploading images and files to the web server: rsync: [sender] read errors mapping "/home/io/development/weatherplots/weatherplots/images/atlas/ref_zp.dat": No data available (61)
WARNING: atlas/ref_zp.dat failed verification -- update discarded (will try again).
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1338) [sender=3.2.7]

2026-06-03T13:05:52.667 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:06:22.697 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:06:22.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:06:22.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:06:23.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:06:23.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:06:23.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:06:23.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:06:23.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:06:23.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:06:23.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:06:23.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:06:23.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:06:23.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:06:26.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:06:26.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:06:26.332 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:06:26.332 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:06:26.342 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:06:26.354 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:06:26.354 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:06:26.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:06:26.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:06:26.355 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:06:26.355 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:06:26.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:06:26.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T13:06:26.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:06:26.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T13:06:26.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:06:26.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:06:26.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:06:26.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:06:26.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:06:26.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:06:26.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:06:26.637 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:06:26.709 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:06:08
2026-06-03T13:06:26.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86100, datetime.datetime(2026, 6, 3, 13, 6, 8), datetime.datetime(2026, 6, 3, 13, 6, 7), 'salt', 7.07, 99.68, None, 37.96, 110.46, 0.04, 821.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:06:26.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:06:26.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T13:06:26.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:06:07, diff=19.717528s, valid=True
2026-06-03T13:06:26.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:06:26.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:06:26.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:06:12, diff=14.720706s, valid=True
2026-06-03T13:06:26.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:06:26.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T13:06:26.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:06:07, diff=19.72815s, valid=True
2026-06-03T13:06:26.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:06:26.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:06:26.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:06:26.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:06:26.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:06:26.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:06:26.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:06:12, diff=14.731533s, valid=True
2026-06-03T13:06:26.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:06:26.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:06:26.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:06:26.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=58983.732277s, valid=False
2026-06-03T13:06:26.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:06:26.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:06:26.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:06:26.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:06:26.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:06:26.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:06:26.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:06:26.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:06:26.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:06:26.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:06:26.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:06:26.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:06:27.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:06:27.072 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:06:27.277 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:06:27.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:06:27.718 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:06:27.718 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:06:27.718 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:06:27.950 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:06:27.950 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:06:57.961 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:06:57.961 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:06:57.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:06:58.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:06:58.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:06:58.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:06:58.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:06:58.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:06:58.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:06:58.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:06:58.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:06:58.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:06:58.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:07:01.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:07:01.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:07:01.200 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:07:01.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:07:01.212 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:07:01.225 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:07:01.225 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:07:01.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:07:01.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:07:01.226 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:07:01.227 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:07:01.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:07:01.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T13:07:01.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:07:01.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T13:07:01.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:07:01.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:07:01.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:07:01.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:07:01.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:07:01.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:07:01.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:07:01.558 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:07:01.628 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:06:38
2026-06-03T13:07:01.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86101, datetime.datetime(2026, 6, 3, 13, 6, 38), datetime.datetime(2026, 6, 3, 13, 6, 37), 'salt', 7.17, 99.78, None, 35.07, 98.7, 0.02, 822.3, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:07:01.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:07:01.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T13:07:01.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:06:37, diff=24.635719s, valid=True
2026-06-03T13:07:01.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:07:01.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:07:01.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:07:12, diff=-10.36093s, valid=True
2026-06-03T13:07:01.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:07:01.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T13:07:01.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:06:33, diff=28.64712s, valid=True
2026-06-03T13:07:01.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:07:01.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:07:01.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:07:01.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:07:01.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:07:01.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:07:01.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:07:12, diff=-10.349195s, valid=True
2026-06-03T13:07:01.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:07:01.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:07:01.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:07:01.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59018.651613s, valid=False
2026-06-03T13:07:01.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:07:01.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:07:01.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:07:01.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:07:01.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:07:01.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:07:01.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:07:01.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:07:01.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:07:01.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:07:01.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:07:01.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:07:01.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:07:02.022 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:07:02.250 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:07:02.590 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:07:02.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:07:02.692 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:07:02.692 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:07:02.861 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:07:02.861 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:07:32.890 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:07:32.890 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:07:32.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:07:33.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:07:33.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:07:33.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:07:33.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:07:33.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:07:33.633 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:07:33.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:07:33.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:07:33.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:07:33.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:07:36.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:07:36.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:07:36.389 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:07:36.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:07:36.398 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:07:36.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:07:36.411 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:07:36.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:07:36.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:07:36.412 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:07:36.412 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:07:36.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:07:36.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:07:36.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:07:36.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:07:36.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:07:36.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:07:36.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:07:36.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:07:36.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:07:36.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:07:36.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:07:36.744 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:07:36.813 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:07:08
2026-06-03T13:07:36.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86102, datetime.datetime(2026, 6, 3, 13, 7, 8), datetime.datetime(2026, 6, 3, 13, 7, 7), 'salt', 7.07, 99.68, None, 39.06, 96.66, 0.04, 822.24, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:07:36.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:07:36.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:07:36.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:07:07, diff=29.821766s, valid=True
2026-06-03T13:07:36.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:07:36.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:07:36.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:07:12, diff=24.825393s, valid=True
2026-06-03T13:07:36.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:07:36.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:07:36.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:07:03, diff=33.833892s, valid=True
2026-06-03T13:07:36.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:07:36.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:07:36.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:07:36.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:07:36.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:07:36.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:07:36.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:07:12, diff=24.837779s, valid=True
2026-06-03T13:07:36.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:07:36.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:07:36.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:07:36.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59053.838636s, valid=False
2026-06-03T13:07:36.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:07:36.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:07:36.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:07:36.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:07:36.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:07:36.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:07:36.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:07:36.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:07:36.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:07:36.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:07:37.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:07:37.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:07:37.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:07:37.161 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:07:37.367 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:07:37.720 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:07:37.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:07:37.894 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:07:37.894 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:07:38.094 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:07:38.095 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:08:08.125 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:08:08.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:08:08.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:08:08.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:08:08.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:08:08.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:08:08.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:08:08.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:08:08.717 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:08:08.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:08:08.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:08:08.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:08:08.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:08:11.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:08:11.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:08:11.447 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:08:11.447 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:08:11.457 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:08:11.469 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:08:11.470 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:08:11.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:08:11.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:08:11.471 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:08:11.472 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:08:11.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:08:11.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T13:08:11.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:08:11.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T13:08:11.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:08:11.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:08:11.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:08:11.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:08:11.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:08:11.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:08:11.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:08:11.804 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:08:11.873 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:08:09
2026-06-03T13:08:11.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86104, datetime.datetime(2026, 6, 3, 13, 8, 9), datetime.datetime(2026, 6, 3, 13, 8, 8), 'salt', 7.01, 99.68, None, 34.05, 94.19, 0.05, 822.24, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:08:11.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:08:11.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T13:08:11.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:08:08, diff=3.880412s, valid=True
2026-06-03T13:08:11.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:08:11.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:08:11.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:08:12, diff=-0.116237s, valid=True
2026-06-03T13:08:11.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:08:11.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T13:08:11.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:08:03, diff=8.891743s, valid=True
2026-06-03T13:08:11.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:08:11.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:08:11.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:08:11.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:08:11.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:08:11.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:08:11.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:08:12, diff=-0.104601s, valid=True
2026-06-03T13:08:11.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:08:11.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:08:11.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:08:11.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59088.896209s, valid=False
2026-06-03T13:08:11.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:08:11.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:08:11.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:08:11.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:08:11.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:08:11.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:08:11.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:08:11.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:08:11.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:08:12.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:08:12.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:08:12.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:08:12.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:08:12.214 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:08:12.419 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:08:12.758 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:08:12.860 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:08:12.861 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:08:12.861 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:08:13.027 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:08:13.028 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:08:43.058 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:08:43.058 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:08:43.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:08:43.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:08:43.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:08:43.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:08:43.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:08:43.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:08:43.458 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:08:43.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:08:43.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:08:43.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:08:43.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:08:46.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:08:46.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:08:46.203 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:08:46.203 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:08:46.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:08:46.225 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:08:46.226 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:08:46.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:08:46.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:08:46.227 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:08:46.227 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:08:46.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:08:46.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T13:08:46.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:08:46.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T13:08:46.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:08:46.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:08:46.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:08:46.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:08:46.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:08:46.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:08:46.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:08:46.560 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:08:46.631 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:08:39
2026-06-03T13:08:46.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86105, datetime.datetime(2026, 6, 3, 13, 8, 39), datetime.datetime(2026, 6, 3, 13, 8, 38), 'salt', 7.01, 99.68, None, 36.38, 100.25, 0.05, 822.11, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:08:46.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:08:46.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T13:08:46.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:08:38, diff=8.638487s, valid=True
2026-06-03T13:08:46.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:08:46.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:08:46.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:09:12, diff=-25.35759s, valid=True
2026-06-03T13:08:46.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:08:46.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T13:08:46.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:08:34, diff=12.650612s, valid=True
2026-06-03T13:08:46.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:08:46.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:08:46.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:08:46.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:08:46.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:08:46.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:08:46.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:09:12, diff=-25.34568s, valid=True
2026-06-03T13:08:46.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:08:46.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:08:46.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:08:46.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59123.655134s, valid=False
2026-06-03T13:08:46.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:08:46.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:08:46.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:08:46.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:08:46.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:08:46.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:08:46.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:08:46.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:08:46.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:08:46.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:08:46.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:08:46.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:08:46.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:08:46.973 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:08:47.251 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:08:47.591 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:08:47.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:08:47.693 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:08:47.693 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:08:47.899 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:08:47.899 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:09:17.929 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:09:17.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:09:17.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:09:18.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:09:18.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:09:18.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:09:18.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:09:18.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:09:18.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:09:18.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:09:18.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:09:18.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:09:18.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:09:21.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:09:21.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:09:21.517 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:09:21.517 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:09:21.527 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:09:21.540 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:09:21.541 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:09:21.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:09:21.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:09:21.542 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:09:21.542 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:09:21.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:09:21.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T13:09:21.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:09:21.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T13:09:21.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:09:21.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:09:21.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:09:21.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:09:21.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:09:21.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:09:21.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:09:21.862 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:09:21.930 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:09:09
2026-06-03T13:09:21.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86106, datetime.datetime(2026, 6, 3, 13, 9, 9), datetime.datetime(2026, 6, 3, 13, 9, 8), 'salt', 7.01, 99.64, None, 34.68, 105.67, 0.05, 822.42, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:09:21.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:09:21.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T13:09:21.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:09:08, diff=13.936785s, valid=True
2026-06-03T13:09:21.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:09:21.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:09:21.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:09:12, diff=9.93966s, valid=True
2026-06-03T13:09:21.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:09:21.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T13:09:21.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:09:06, diff=15.94633s, valid=True
2026-06-03T13:09:21.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:09:21.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:09:21.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:09:21.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:09:21.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:09:21.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:09:21.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:09:12, diff=9.949566s, valid=True
2026-06-03T13:09:21.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:09:21.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:09:21.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:09:21.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59158.950952s, valid=False
2026-06-03T13:09:21.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:09:21.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:09:21.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:09:21.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:09:21.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:09:22.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:09:22.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:09:22.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:09:22.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:09:22.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:09:22.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:09:22.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:09:22.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:09:22.271 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:09:22.497 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:09:22.837 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:09:22.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:09:22.939 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:09:22.939 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:09:23.135 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:09:23.135 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:09:53.156 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:09:53.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:09:53.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:09:53.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:09:53.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:09:53.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:09:53.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:09:53.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:09:53.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:09:53.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:09:53.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:09:53.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:09:53.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:09:56.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:09:56.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:09:56.270 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:09:56.270 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:09:56.281 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:09:56.293 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:09:56.293 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:09:56.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:09:56.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:09:56.294 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:09:56.294 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:09:56.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:09:56.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T13:09:56.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:09:56.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T13:09:56.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:09:56.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:09:56.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:09:56.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:09:56.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:09:56.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:09:56.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:09:56.572 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:09:56.641 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:09:39
2026-06-03T13:09:56.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86107, datetime.datetime(2026, 6, 3, 13, 9, 39), datetime.datetime(2026, 6, 3, 13, 9, 39), 'salt', 7.01, 99.64, None, 34.19, 105.06, 0.05, 822.36, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:09:56.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:09:56.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T13:09:56.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:09:39, diff=17.648217s, valid=True
2026-06-03T13:09:56.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:09:56.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:09:56.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:10:12, diff=-15.348533s, valid=True
2026-06-03T13:09:56.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:09:56.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T13:09:56.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:09:37, diff=19.659093s, valid=True
2026-06-03T13:09:56.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:09:56.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:09:56.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:09:56.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:09:56.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:09:56.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:09:56.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:10:12, diff=-15.337471s, valid=True
2026-06-03T13:09:56.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:09:56.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:09:56.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:09:56.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59193.663307s, valid=False
2026-06-03T13:09:56.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:09:56.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:09:56.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:09:56.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:09:56.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:09:56.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:09:56.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:09:56.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:09:56.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:09:56.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:09:56.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:09:56.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:09:56.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:09:57.052 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:09:57.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:09:57.593 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:09:57.696 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:09:57.696 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:09:57.696 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:09:57.768 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:09:57.768 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:10:27.791 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:10:27.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:10:27.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:10:28.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:10:28.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:10:28.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:10:28.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:10:28.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:10:28.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:10:28.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:10:28.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:10:28.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:10:28.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:10:31.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:10:31.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:10:31.164 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:10:31.164 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:10:31.175 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:10:31.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:10:31.189 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:10:31.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:10:31.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:10:31.190 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:10:31.190 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:10:31.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:10:31.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T13:10:31.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:10:31.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T13:10:31.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:10:31.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:10:31.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:10:31.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:10:31.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:10:31.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:10:31.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:10:31.499 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:10:31.567 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:10:10
2026-06-03T13:10:31.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86108, datetime.datetime(2026, 6, 3, 13, 10, 10), datetime.datetime(2026, 6, 3, 13, 10, 9), 'salt', 7.04, 99.81, None, 34.86, 100.39, 0.02, 822.17, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:10:31.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:10:31.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T13:10:31.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:10:09, diff=22.575442s, valid=True
2026-06-03T13:10:31.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:10:31.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:10:31.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:10:12, diff=19.578909s, valid=True
2026-06-03T13:10:31.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:10:31.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T13:10:31.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:10:09, diff=22.587046s, valid=True
2026-06-03T13:10:31.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:10:31.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:10:31.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:10:31.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:10:31.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:10:31.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:10:31.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:10:12, diff=19.590773s, valid=True
2026-06-03T13:10:31.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:10:31.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:10:31.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:10:31.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59228.591601s, valid=False
2026-06-03T13:10:31.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:10:31.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:10:31.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:10:31.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:10:31.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:10:31.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:10:31.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:10:31.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:10:31.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:10:31.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:10:31.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:10:31.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:10:31.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:10:31.911 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:10:32.116 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:10:32.453 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:10:32.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:10:32.555 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:10:32.555 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:10:32.803 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:10:32.804 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:11:02.831 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:11:02.831 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:11:02.831 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:11:02.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:11:03.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:11:03.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:11:03.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:11:03.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:11:03.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:11:03.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:11:03.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:11:03.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:11:03.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:11:05.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:11:05.806 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:11:05.806 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:11:05.807 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:11:05.820 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:11:05.833 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:11:05.834 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:11:05.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:11:05.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:11:05.835 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:11:05.835 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:11:05.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:11:05.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:11:05.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:11:06.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:11:06.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:11:06.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:11:06.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:11:06.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:11:06.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:11:06.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:11:06.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:11:06.179 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:11:06.251 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:10:40
2026-06-03T13:11:06.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86109, datetime.datetime(2026, 6, 3, 13, 10, 40), datetime.datetime(2026, 6, 3, 13, 10, 39), 'salt', 7.07, 99.78, None, 30.31, 100.84, 0.02, 822.36, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:11:06.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:11:06.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:11:06.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:10:39, diff=27.258917s, valid=True
2026-06-03T13:11:06.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:11:06.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:11:06.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:11:12, diff=-5.737588s, valid=True
2026-06-03T13:11:06.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:11:06.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:11:06.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:10:35, diff=31.270511s, valid=True
2026-06-03T13:11:06.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:11:06.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:11:06.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:11:06.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:11:06.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:11:06.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:11:06.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:11:12, diff=-5.725746s, valid=True
2026-06-03T13:11:06.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:11:06.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:11:06.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:11:06.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59263.275079s, valid=False
2026-06-03T13:11:06.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:11:06.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:11:06.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:11:06.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:11:06.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:11:06.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:11:06.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:11:06.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:11:06.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:11:06.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:11:06.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:11:06.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:11:06.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:11:06.668 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:11:06.874 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:11:07.215 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:11:07.317 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:11:07.318 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:11:07.318 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:11:07.457 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:11:07.457 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:11:37.466 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:11:37.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:11:37.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:11:37.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:11:37.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:11:37.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:11:37.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:11:37.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:11:37.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:11:37.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:11:37.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:11:37.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:11:37.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:11:40.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:11:40.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:11:40.578 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:11:40.578 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:11:40.588 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:11:40.601 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:11:40.602 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:11:40.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:11:40.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:11:40.603 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:11:40.603 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:11:40.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:11:40.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T13:11:40.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:11:40.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T13:11:40.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:11:40.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:11:40.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:11:40.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:11:40.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:11:40.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:11:40.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:11:40.958 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:11:41.032 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:11:40
2026-06-03T13:11:41.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86111, datetime.datetime(2026, 6, 3, 13, 11, 40), datetime.datetime(2026, 6, 3, 13, 11, 40), 'salt', 7.17, 99.74, None, 29.85, 95.08, 0.03, 822.24, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:11:41.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:11:41.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T13:11:41.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:11:40, diff=1.040242s, valid=True
2026-06-03T13:11:41.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:11:41.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:11:41.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:12:12, diff=-30.956238s, valid=True
2026-06-03T13:11:41.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:11:41.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T13:11:41.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:11:35, diff=6.051804s, valid=True
2026-06-03T13:11:41.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:11:41.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:11:41.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:11:41.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:11:41.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:11:41.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:11:41.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:12:12, diff=-30.944467s, valid=True
2026-06-03T13:11:41.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:11:41.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:11:41.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:11:41.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59298.056373s, valid=False
2026-06-03T13:11:41.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:11:41.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:11:41.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:11:41.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:11:41.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:11:41.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:11:41.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:11:41.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:11:41.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:11:41.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:11:41.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:11:41.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:11:41.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:11:41.380 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:11:41.585 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:11:41.926 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:11:42.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:11:42.030 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:11:42.031 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:11:42.195 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:11:42.195 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:12:12.213 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:12:12.213 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:12:12.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:12:12.216 [WARNING] [MainThread] [fetch_web_files.py] [fetch_images()] Error [fetch_web_files.py] processing meteogram: HTTPSConnectionPool(host='www.yr.no', port=443): Max retries exceeded with url: /en/content/2-949303/meteogram.svg (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x706c7b98e920>: Failed to resolve 'www.yr.no' ([Errno -3] Temporary failure in name resolution)"))
2026-06-03T13:12:12.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:12:12.220 [WARNING] [MainThread] [fetch_web_files.py] [fetch_images()] Error [fetch_web_files.py] downloading AllSkyCurrentImage.JPG: HTTPConnectionPool(host='skycam.suth.saao.ac.za', port=80): Max retries exceeded with url: /skycam/Data/AllSkyCurrentImage.JPG (Caused by NameResolutionError("<urllib3.connection.HTTPConnection object at 0x706c7b98f520>: Failed to resolve 'skycam.suth.saao.ac.za' ([Errno -3] Temporary failure in name resolution)"))
2026-06-03T13:12:12.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:12:12.223 [WARNING] [MainThread] [fetch_web_files.py] [fetch_images()] Error [fetch_web_files.py] downloading AllSkyCurrentImageMarked.JPG: HTTPConnectionPool(host='skycam.salt.saao.ac.za', port=80): Max retries exceeded with url: /AllSkyCurrentImageMarked.JPG (Caused by NameResolutionError("<urllib3.connection.HTTPConnection object at 0x706c7b98c460>: Failed to resolve 'skycam.salt.saao.ac.za' ([Errno -3] Temporary failure in name resolution)"))
2026-06-03T13:12:12.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:12:12.226 [WARNING] [MainThread] [fetch_web_files.py] [fetch_images()] Error [fetch_web_files.py] downloading seeing.txt: HTTPConnectionPool(host='timdimm.suth', port=80): Max retries exceeded with url: /seeing/seeing.txt (Caused by NameResolutionError("<urllib3.connection.HTTPConnection object at 0x706c7c0abe50>: Failed to resolve 'timdimm.suth' ([Errno -3] Temporary failure in name resolution)"))
2026-06-03T13:12:12.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:12:12.229 [ERROR] [MainThread] [fetch_web_files.py] [fetch_images()] Error [fetch_web_files.py] processing LCO all-sky image: HTTPSConnectionPool(host='lco.global', port=443): Max retries exceeded with url: /camera/data/cpt/allsky/lastsnap.jpg (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x706c7c0a88e0>: Failed to resolve 'lco.global' ([Errno -3] Temporary failure in name resolution)"))
2026-06-03T13:12:12.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:12:12.229 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:12:12.229 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:12:12.231 [ERROR] [MainThread] [fetch_web_files.py] [get_night_info()] Error [fetch_web_files.py] getting night info from database: (2003, "Can't connect to MySQL server on 'sdb.salt' ([Errno -3] Temporary failure in name resolution)")
2026-06-03T13:12:12.231 [WARNING] [MainThread] [run_weather_plot.py] [run()] Error [in run_weather_plot.py] getting night info : (2003, "Can't connect to MySQL server on 'sdb.salt' ([Errno -3] Temporary failure in name resolution)")
2026-06-03T13:12:12.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:12:12.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:12:12.232 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:12:12.232 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:12:12.232 [ERROR] [MainThread] [database_utils.py] [get_db_connection()] Failed to connect to database: (2003, "Can't connect to MySQL server on '10.2.100.54' ([Errno 101] Network is unreachable)")
2026-06-03T13:12:12.232 [ERROR] [MainThread] [database_utils.py] [fetch_all_weather_data()] Error during bulk weather data fetch: (2003, "Can't connect to MySQL server on '10.2.100.54' ([Errno 101] Network is unreachable)")
2026-06-03T13:12:12.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] None
2026-06-03T13:12:12.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:12:12.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:12:12.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:12:12.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:12:12.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:12:12.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:12:12.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:12:12.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:12:12.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:12:12.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:12:12.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:12:12.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:12:12.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:12:12.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data is NOT available
2026-06-03T13:12:12.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:12:12.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:12:12.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:12:12.235 [WARNING] [MainThread] [run_weather_plot.py] [run()] Error [run_weather_plot.py] creating weather plots : 'NoneType' object is not subscriptable
2026-06-03T13:12:12.235 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:12:12.235 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:12:12.235 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:12:12.379 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:12:12.380 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:12:42.409 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:12:42.409 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:12:42.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:12:42.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:12:42.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:12:43.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:12:43.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:12:43.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:12:43.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:12:43.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:12:43.221 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:12:43.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:12:43.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:12:50.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:12:50.373 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:12:50.374 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:12:50.374 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:12:50.384 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:12:50.396 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:12:50.397 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:12:50.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:12:50.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:12:50.398 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:12:50.398 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:12:50.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:12:50.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:12:50.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:12:50.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:12:50.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:12:50.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:12:50.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:12:50.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:12:50.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:12:50.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:12:50.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:12:50.746 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:12:50.840 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:12:41
2026-06-03T13:12:50.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86112, datetime.datetime(2026, 6, 3, 13, 12, 41), datetime.datetime(2026, 6, 3, 13, 12, 40), 'salt', 7.01, 99.71, None, 37.93, 114.08, 0.04, 821.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:12:50.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:12:50.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:12:50.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:12:40, diff=10.84765s, valid=True
2026-06-03T13:12:50.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:12:50.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:12:50.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:13:12, diff=-21.148831s, valid=True
2026-06-03T13:12:50.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:12:50.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:12:50.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:12:36, diff=14.85936s, valid=True
2026-06-03T13:12:50.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:12:50.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:12:50.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:12:50.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:12:50.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:12:50.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:12:50.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:13:12, diff=-21.136898s, valid=True
2026-06-03T13:12:50.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:12:50.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:12:50.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:12:50.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59367.863937s, valid=False
2026-06-03T13:12:50.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:12:50.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:12:50.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:12:50.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:12:50.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:12:50.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:12:50.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:12:50.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:12:51.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:12:51.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:12:51.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:12:51.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:12:51.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:12:51.256 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:12:51.476 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:12:51.829 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:12:51.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:12:51.933 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:12:51.933 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:12:51.984 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:12:51.984 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:13:22.014 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:13:22.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:13:22.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:13:22.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:13:22.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:13:22.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:13:22.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:13:22.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:13:22.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:13:22.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:13:22.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:13:22.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:13:22.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:13:25.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:13:25.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:13:25.194 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:13:25.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:13:25.207 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:13:25.227 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:13:25.227 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:13:25.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:13:25.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:13:25.228 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:13:25.229 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:13:25.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:13:25.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:13:25.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:13:25.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:13:25.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:13:25.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:13:25.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:13:25.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:13:25.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:13:25.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:13:25.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:13:25.565 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:13:25.636 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:13:11
2026-06-03T13:13:25.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86113, datetime.datetime(2026, 6, 3, 13, 13, 11), datetime.datetime(2026, 6, 3, 13, 13, 10), 'salt', 7.1, 99.74, None, 32.0, 96.26, 0.03, 822.05, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:13:25.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:13:25.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:13:25.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:13:10, diff=15.643476s, valid=True
2026-06-03T13:13:25.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:13:25.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:13:25.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:13:12, diff=13.646954s, valid=True
2026-06-03T13:13:25.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:13:25.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:13:25.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:13:07, diff=18.655138s, valid=True
2026-06-03T13:13:25.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:13:25.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:13:25.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:13:25.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:13:25.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:13:25.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:13:25.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:13:12, diff=13.658861s, valid=True
2026-06-03T13:13:25.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:13:25.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:13:25.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:13:25.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59402.65968s, valid=False
2026-06-03T13:13:25.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:13:25.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:13:25.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:13:25.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:13:25.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:13:25.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:13:25.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:13:25.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:13:25.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:13:25.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:13:25.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:13:25.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:13:25.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:13:25.980 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:13:26.187 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:13:26.530 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:13:26.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:13:26.635 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:13:26.635 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:13:26.701 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:13:26.701 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:13:56.731 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:13:56.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:13:56.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:13:57.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:13:57.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:13:57.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:13:57.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:13:57.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:13:57.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:13:57.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:13:57.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:13:57.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:13:57.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:14:00.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:14:00.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:14:00.092 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:14:00.092 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:14:00.099 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:14:00.111 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:14:00.111 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:14:00.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:14:00.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:14:00.112 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:14:00.112 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:14:00.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:14:00.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:14:00.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:14:00.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:14:00.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:14:00.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:14:00.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:14:00.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:14:00.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:14:00.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:14:00.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:14:00.409 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:14:00.478 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:13:41
2026-06-03T13:14:00.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86114, datetime.datetime(2026, 6, 3, 13, 13, 41), datetime.datetime(2026, 6, 3, 13, 13, 40), 'salt', 7.07, 99.74, None, 33.1, 93.89, 0.03, 822.23, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:14:00.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:14:00.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:14:00.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:13:40, diff=20.485971s, valid=True
2026-06-03T13:14:00.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:14:00.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:14:00.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:14:12, diff=-11.510791s, valid=True
2026-06-03T13:14:00.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:14:00.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:14:00.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:13:38, diff=22.496778s, valid=True
2026-06-03T13:14:00.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:14:00.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:14:00.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:14:00.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:14:00.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:14:00.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:14:00.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:14:12, diff=-11.499764s, valid=True
2026-06-03T13:14:00.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:14:00.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:14:00.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:14:00.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59437.501004s, valid=False
2026-06-03T13:14:00.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:14:00.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:14:00.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:14:00.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:14:00.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:14:00.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:14:00.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:14:00.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:14:00.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:14:00.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:14:00.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:14:00.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:14:00.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:14:00.819 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:14:01.025 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:14:01.366 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:14:01.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:14:01.479 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:14:01.479 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:14:01.546 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:14:01.546 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:14:31.576 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:14:31.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:14:31.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:14:31.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:14:31.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:14:31.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:14:31.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:14:31.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:14:31.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:14:31.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:14:31.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:14:31.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:14:31.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:14:34.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:14:34.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:14:34.878 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:14:34.878 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:14:34.889 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:14:34.901 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:14:34.902 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:14:34.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:14:34.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:14:34.903 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:14:34.903 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:14:34.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:14:35.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:14:35.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:14:35.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:14:35.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:14:35.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:14:35.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:14:35.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:14:35.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:14:35.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:14:35.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:14:35.303 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:14:35.392 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:14:11
2026-06-03T13:14:35.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86115, datetime.datetime(2026, 6, 3, 13, 14, 11), datetime.datetime(2026, 6, 3, 13, 14, 11), 'salt', 7.07, 99.78, None, 36.62, 90.44, 0.02, 822.23, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:14:35.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:14:35.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:14:35.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:14:11, diff=24.401149s, valid=True
2026-06-03T13:14:35.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:14:35.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:14:35.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:14:12, diff=23.404903s, valid=True
2026-06-03T13:14:35.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:14:35.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:14:35.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:14:10, diff=25.413844s, valid=True
2026-06-03T13:14:35.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:14:35.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:14:35.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:14:35.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:14:35.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:14:35.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:14:35.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:14:12, diff=23.417837s, valid=True
2026-06-03T13:14:35.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:14:35.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:14:35.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:14:35.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59472.418715s, valid=False
2026-06-03T13:14:35.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:14:35.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:14:35.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:14:35.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:14:35.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:14:35.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:14:35.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:14:35.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:14:35.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:14:35.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:14:35.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:14:35.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:14:35.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:14:35.738 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:14:35.942 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:14:36.340 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:14:36.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:14:36.443 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:14:36.443 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:14:36.663 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:14:36.663 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:15:06.693 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:15:06.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:15:06.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:15:07.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:15:07.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:15:07.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:15:07.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:15:07.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:15:07.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:15:07.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:15:07.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:15:07.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:15:07.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:15:10.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:15:10.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:15:10.061 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:15:10.061 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:15:10.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:15:10.086 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:15:10.087 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:15:10.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:15:10.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:15:10.087 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:15:10.087 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:15:10.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:15:10.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T13:15:10.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:15:10.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T13:15:10.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:15:10.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:15:10.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:15:10.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:15:10.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:15:10.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:15:10.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:15:10.395 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:15:10.470 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:14:42
2026-06-03T13:15:10.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86116, datetime.datetime(2026, 6, 3, 13, 14, 42), datetime.datetime(2026, 6, 3, 13, 14, 41), 'salt', 7.04, 99.74, None, 34.9, 103.68, 0.03, 821.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:15:10.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:15:10.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T13:15:10.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:14:41, diff=29.478039s, valid=True
2026-06-03T13:15:10.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:15:10.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:15:10.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:15:12, diff=-1.518615s, valid=True
2026-06-03T13:15:10.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:15:10.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T13:15:10.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:14:36, diff=34.489258s, valid=True
2026-06-03T13:15:10.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:15:10.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:15:10.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:15:10.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:15:10.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:15:10.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:15:10.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:15:12, diff=-1.507146s, valid=True
2026-06-03T13:15:10.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:15:10.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:15:10.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:15:10.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59507.493637s, valid=False
2026-06-03T13:15:10.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:15:10.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:15:10.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:15:10.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:15:10.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:15:10.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:15:10.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:15:10.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:15:10.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:15:10.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:15:10.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:15:10.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:15:10.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:15:10.821 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:15:11.029 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:15:11.367 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:15:11.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:15:11.470 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:15:11.471 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:15:11.720 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:15:11.720 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:15:41.750 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:15:41.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:15:41.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:15:41.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:15:41.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:15:42.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:15:42.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:15:42.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:15:42.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:15:42.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:15:42.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:15:42.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:15:42.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:15:45.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:15:45.686 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:15:45.687 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:15:45.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:15:45.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:15:45.714 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:15:45.715 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:15:45.715 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:15:45.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:15:45.716 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:15:45.716 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:15:45.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:15:45.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:15:45.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:15:45.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:15:45.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:15:46.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:15:46.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:15:46.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:15:46.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:15:46.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:15:46.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:15:46.052 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:15:46.128 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:15:42
2026-06-03T13:15:46.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86118, datetime.datetime(2026, 6, 3, 13, 15, 42), datetime.datetime(2026, 6, 3, 13, 15, 41), 'salt', 6.97, 99.64, None, 36.2, 84.05, 0.04, 821.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:15:46.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:15:46.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:15:46.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:15:41, diff=5.135917s, valid=True
2026-06-03T13:15:46.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:15:46.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:15:46.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:16:12, diff=-25.86046s, valid=True
2026-06-03T13:15:46.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:15:46.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:15:46.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:15:37, diff=9.147804s, valid=True
2026-06-03T13:15:46.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:15:46.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:15:46.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:15:46.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:15:46.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:15:46.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:15:46.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:16:12, diff=-25.848486s, valid=True
2026-06-03T13:15:46.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:15:46.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:15:46.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:15:46.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59543.152331s, valid=False
2026-06-03T13:15:46.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:15:46.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:15:46.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:15:46.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:15:46.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:15:46.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:15:46.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:15:46.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:15:46.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:15:46.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:15:46.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:15:46.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:15:46.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:15:46.472 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:15:46.750 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:15:47.088 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:15:47.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:15:47.190 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:15:47.190 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:15:47.394 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:15:47.394 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:16:17.424 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:16:17.425 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:16:17.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:16:17.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:16:17.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:16:17.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:16:17.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:16:17.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:16:17.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:16:17.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:16:17.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:16:17.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:16:17.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:16:20.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:16:20.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:16:20.479 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:16:20.479 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:16:20.489 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:16:20.502 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:16:20.502 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:16:20.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:16:20.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:16:20.504 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:16:20.504 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:16:20.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:16:20.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:16:20.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:16:20.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:16:20.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:16:20.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:16:20.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:16:20.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:16:20.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:16:20.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:16:20.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:16:20.840 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:16:20.912 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:16:12
2026-06-03T13:16:20.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86119, datetime.datetime(2026, 6, 3, 13, 16, 12), datetime.datetime(2026, 6, 3, 13, 16, 12), 'salt', 7.04, 99.64, None, 35.6, 92.71, 0.05, 821.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:16:20.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:16:20.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:16:20.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:16:12, diff=8.919989s, valid=True
2026-06-03T13:16:20.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:16:20.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:16:20.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:16:12, diff=8.923452s, valid=True
2026-06-03T13:16:20.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:16:20.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:16:20.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:16:07, diff=13.931608s, valid=True
2026-06-03T13:16:20.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:16:20.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:16:20.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:16:20.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:16:20.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:16:20.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:16:20.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:16:12, diff=8.935333s, valid=True
2026-06-03T13:16:20.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:16:20.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:16:20.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:16:20.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59577.93617s, valid=False
2026-06-03T13:16:20.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:16:20.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:16:20.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:16:20.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:16:20.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:16:21.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:16:21.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:16:21.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:16:21.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:16:21.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:16:21.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:16:21.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:16:21.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:16:21.257 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:16:21.462 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:16:21.801 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:16:21.905 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:16:21.905 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:16:21.905 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:16:22.069 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:16:22.069 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:16:52.099 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:16:52.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:16:52.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:16:52.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:16:52.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:16:52.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:16:52.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:16:52.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:16:52.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:16:52.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:16:52.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:16:52.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:16:52.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:16:55.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:16:55.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:16:55.655 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:16:55.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:16:55.663 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:16:55.676 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:16:55.677 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:16:55.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:16:55.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:16:55.678 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:16:55.678 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:16:55.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:16:55.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:16:55.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:16:55.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:16:55.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:16:55.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:16:55.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:16:56.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:16:56.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:16:56.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:16:56.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:16:56.046 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:16:56.120 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:16:43
2026-06-03T13:16:56.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86120, datetime.datetime(2026, 6, 3, 13, 16, 43), datetime.datetime(2026, 6, 3, 13, 16, 42), 'salt', 7.07, 99.78, None, 35.92, 95.27, 0.02, 822.05, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:16:56.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:16:56.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:16:56.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:16:42, diff=14.127949s, valid=True
2026-06-03T13:16:56.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:16:56.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:16:56.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:17:12, diff=-15.868393s, valid=True
2026-06-03T13:16:56.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:16:56.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:16:56.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:16:37, diff=19.139996s, valid=True
2026-06-03T13:16:56.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:16:56.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:16:56.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:16:56.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:16:56.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:16:56.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:16:56.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:17:12, diff=-15.856078s, valid=True
2026-06-03T13:16:56.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:16:56.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:16:56.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:16:56.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59613.144763s, valid=False
2026-06-03T13:16:56.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:16:56.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:16:56.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:16:56.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:16:56.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:16:56.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:16:56.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:16:56.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:16:56.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:16:56.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:16:56.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:16:56.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:16:56.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:16:56.538 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:16:56.744 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:16:57.085 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:16:57.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:16:57.187 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:16:57.187 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:16:57.259 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:16:57.259 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:17:27.277 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:17:27.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:17:27.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:17:27.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:17:27.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:17:28.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:17:28.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:17:28.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:17:28.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:17:28.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:17:28.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:17:28.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:17:28.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:17:30.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:17:30.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:17:30.586 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:17:30.587 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:17:30.597 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:17:30.609 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:17:30.610 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:17:30.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:17:30.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:17:30.611 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:17:30.611 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:17:30.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:17:30.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:17:30.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:17:30.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:17:30.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:17:30.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:17:30.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:17:30.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:17:30.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:17:30.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:17:30.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:17:30.897 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:17:30.968 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:17:13
2026-06-03T13:17:30.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86121, datetime.datetime(2026, 6, 3, 13, 17, 13), datetime.datetime(2026, 6, 3, 13, 17, 12), 'salt', 6.97, 99.71, None, 35.0, 94.24, 0.03, 821.87, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:17:30.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:17:30.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:17:30.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:17:12, diff=18.975099s, valid=True
2026-06-03T13:17:30.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:17:30.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:17:30.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:17:12, diff=18.978299s, valid=True
2026-06-03T13:17:30.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:17:30.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:17:30.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:17:08, diff=22.985725s, valid=True
2026-06-03T13:17:30.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:17:30.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:17:30.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:17:30.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:17:30.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:17:30.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:17:30.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:17:12, diff=18.989082s, valid=True
2026-06-03T13:17:30.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:17:30.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:17:30.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:17:30.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59647.98982s, valid=False
2026-06-03T13:17:30.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:17:30.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:17:30.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:17:30.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:17:30.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:17:31.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:17:31.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:17:31.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:17:31.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:17:31.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:17:31.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:17:31.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:17:31.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:17:31.310 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:17:31.514 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:17:31.851 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:17:31.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:17:31.954 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:17:31.954 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:17:32.026 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:17:32.026 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:18:02.057 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:18:02.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:18:02.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:18:02.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:18:02.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:18:02.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:18:02.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:18:02.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:18:02.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:18:02.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:18:02.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:18:02.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:18:02.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:18:05.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:18:05.168 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:18:05.168 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:18:05.168 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:18:05.177 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:18:05.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:18:05.189 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:18:05.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:18:05.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:18:05.189 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:18:05.189 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:18:05.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:18:05.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:18:05.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:18:05.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:18:05.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:18:05.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:18:05.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:18:05.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:18:05.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:18:05.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:18:05.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:18:05.527 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:18:05.597 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:17:43
2026-06-03T13:18:05.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86122, datetime.datetime(2026, 6, 3, 13, 17, 43), datetime.datetime(2026, 6, 3, 13, 17, 42), 'salt', 7.04, 99.71, None, 38.56, 89.57, 0.04, 822.11, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:18:05.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:18:05.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:18:05.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:17:42, diff=23.60488s, valid=True
2026-06-03T13:18:05.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:18:05.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:18:05.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:18:12, diff=-6.391612s, valid=True
2026-06-03T13:18:05.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:18:05.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:18:05.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:17:40, diff=25.616499s, valid=True
2026-06-03T13:18:05.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:18:05.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:18:05.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:18:05.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:18:05.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:18:05.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:18:05.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:18:12, diff=-6.379812s, valid=True
2026-06-03T13:18:05.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:18:05.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:18:05.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:18:05.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59682.620999s, valid=False
2026-06-03T13:18:05.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:18:05.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:18:05.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:18:05.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:18:05.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:18:05.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:18:05.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:18:05.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:18:05.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:18:05.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:18:05.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:18:05.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:18:05.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:18:06.009 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:18:06.214 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:18:06.553 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:18:06.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:18:06.655 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:18:06.655 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:18:06.843 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:18:06.843 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:18:36.873 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:18:36.874 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:18:36.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:18:37.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:18:37.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:18:37.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:18:37.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:18:37.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:18:37.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:18:37.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:18:37.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:18:37.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:18:37.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:18:40.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:18:40.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:18:40.371 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:18:40.371 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:18:40.380 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:18:40.393 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:18:40.393 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:18:40.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:18:40.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:18:40.394 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:18:40.395 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:18:40.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:18:40.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T13:18:40.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:18:40.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T13:18:40.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:18:40.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:18:40.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:18:40.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:18:40.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:18:40.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:18:40.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:18:40.733 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:18:40.802 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:18:13
2026-06-03T13:18:40.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86123, datetime.datetime(2026, 6, 3, 13, 18, 13), datetime.datetime(2026, 6, 3, 13, 18, 13), 'salt', 7.01, 99.71, None, 37.44, 92.85, 0.04, 822.11, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:18:40.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:18:40.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T13:18:40.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:18:13, diff=27.809683s, valid=True
2026-06-03T13:18:40.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:18:40.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:18:40.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:18:12, diff=28.813164s, valid=True
2026-06-03T13:18:40.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:18:40.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T13:18:40.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:18:11, diff=29.821445s, valid=True
2026-06-03T13:18:40.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:18:40.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:18:40.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:18:40.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:18:40.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:18:40.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:18:40.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:18:12, diff=28.825168s, valid=True
2026-06-03T13:18:40.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:18:40.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:18:40.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:18:40.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59717.82599s, valid=False
2026-06-03T13:18:40.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:18:40.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:18:40.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:18:40.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:18:40.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:18:40.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:18:40.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:18:40.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:18:40.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:18:40.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:18:41.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:18:41.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:18:41.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:18:41.147 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:18:41.352 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:18:41.703 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:18:41.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:18:41.805 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:18:41.805 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:18:41.961 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:18:41.961 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:19:11.992 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:19:11.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:19:11.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:19:12.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:19:12.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:19:12.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:19:12.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:19:12.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:19:12.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:19:12.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:19:12.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:19:12.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:19:12.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:19:14.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:19:14.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:19:14.925 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:19:14.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:19:14.938 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:19:14.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:19:14.951 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:19:14.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:19:14.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:19:14.952 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:19:14.952 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:19:14.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:19:15.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:19:15.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:19:15.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:19:15.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:19:15.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:19:15.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:19:15.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:19:15.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:19:15.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:19:15.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:19:15.298 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:19:15.365 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:19:14
2026-06-03T13:19:15.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86125, datetime.datetime(2026, 6, 3, 13, 19, 14), datetime.datetime(2026, 6, 3, 13, 19, 13), 'salt', 7.04, 99.74, None, 38.49, 93.89, 0.03, 821.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:19:15.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:19:15.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:19:15.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:19:13, diff=2.373267s, valid=True
2026-06-03T13:19:15.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:19:15.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:19:15.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:19:12, diff=3.376774s, valid=True
2026-06-03T13:19:15.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:19:15.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:19:15.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:19:08, diff=7.385072s, valid=True
2026-06-03T13:19:15.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:19:15.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:19:15.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:19:15.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:19:15.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:19:15.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:19:15.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:19:12, diff=3.388861s, valid=True
2026-06-03T13:19:15.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:19:15.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:19:15.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:19:15.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59752.389675s, valid=False
2026-06-03T13:19:15.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:19:15.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:19:15.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:19:15.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:19:15.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:19:15.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:19:15.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:19:15.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:19:15.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:19:15.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:19:15.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:19:15.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:19:15.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:19:15.712 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:19:15.921 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:19:16.264 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:19:16.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:19:16.369 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:19:16.369 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:19:16.622 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:19:16.622 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:19:46.652 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:19:46.652 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:19:46.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:19:46.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:19:46.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:19:47.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:19:47.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:19:47.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:19:47.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:19:47.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:19:47.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:19:47.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:19:47.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:19:50.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:19:50.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:19:50.392 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:19:50.392 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:19:50.399 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:19:50.411 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:19:50.411 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:19:50.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:19:50.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:19:50.411 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:19:50.411 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:19:50.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:19:50.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:19:50.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:19:50.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:19:50.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:19:50.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:19:50.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:19:50.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:19:50.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:19:50.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:19:50.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:19:50.748 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:19:50.826 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:19:44
2026-06-03T13:19:50.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86126, datetime.datetime(2026, 6, 3, 13, 19, 44), datetime.datetime(2026, 6, 3, 13, 19, 43), 'salt', 7.07, 99.71, None, 35.71, 98.16, 0.03, 822.11, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:19:50.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:19:50.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:19:50.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:19:43, diff=7.833976s, valid=True
2026-06-03T13:19:50.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:19:50.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:19:50.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:20:12, diff=-21.162584s, valid=True
2026-06-03T13:19:50.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:19:50.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:19:50.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:19:39, diff=11.845532s, valid=True
2026-06-03T13:19:50.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:19:50.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:19:50.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:19:50.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:19:50.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:19:50.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:19:50.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:20:12, diff=-21.150768s, valid=True
2026-06-03T13:19:50.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:19:50.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:19:50.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:19:50.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59787.850042s, valid=False
2026-06-03T13:19:50.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:19:50.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:19:50.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:19:50.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:19:50.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:19:50.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:19:50.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:19:50.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:19:50.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:19:50.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:19:51.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:19:51.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:19:51.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:19:51.171 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:19:51.375 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:19:51.712 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:19:51.874 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:19:51.874 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:19:51.874 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:19:52.069 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:19:52.069 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:20:22.099 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:20:22.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:20:22.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:20:22.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:20:22.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:20:22.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:20:22.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:20:22.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:20:22.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:20:22.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:20:22.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:20:22.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:20:22.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:20:25.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:20:25.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:20:25.095 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:20:25.095 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:20:25.107 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:20:25.121 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:20:25.121 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:20:25.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:20:25.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:20:25.122 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:20:25.123 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:20:25.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:20:25.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:20:25.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:20:25.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:20:25.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:20:25.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:20:25.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:20:25.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:20:25.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:20:25.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:20:25.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:20:25.472 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:20:25.545 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:20:14
2026-06-03T13:20:25.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86127, datetime.datetime(2026, 6, 3, 13, 20, 14), datetime.datetime(2026, 6, 3, 13, 20, 14), 'salt', 7.07, 99.68, None, 29.71, 94.36, 0.04, 821.87, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:20:25.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:20:25.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:20:25.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:20:14, diff=11.553143s, valid=True
2026-06-03T13:20:25.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:20:25.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:20:25.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:20:12, diff=13.556629s, valid=True
2026-06-03T13:20:25.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:20:25.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:20:25.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:20:09, diff=16.564682s, valid=True
2026-06-03T13:20:25.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:20:25.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:20:25.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:20:25.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:20:25.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:20:25.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:20:25.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:20:12, diff=13.568362s, valid=True
2026-06-03T13:20:25.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:20:25.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:20:25.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:20:25.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59822.569177s, valid=False
2026-06-03T13:20:25.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:20:25.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:20:25.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:20:25.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:20:25.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:20:25.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:20:25.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:20:25.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:20:25.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:20:25.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:20:25.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:20:25.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:20:25.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:20:25.887 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:20:26.092 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:20:26.431 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:20:26.533 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:20:26.533 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:20:26.533 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:20:26.602 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:20:26.602 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:20:56.632 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:20:56.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:20:56.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:20:56.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:20:56.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:20:57.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:20:57.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:20:57.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:20:57.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:20:57.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:20:57.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:20:57.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:20:57.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:20:59.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:20:59.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:20:59.649 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:20:59.650 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:20:59.659 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:20:59.672 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:20:59.672 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:20:59.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:20:59.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:20:59.674 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:20:59.674 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:20:59.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:20:59.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:20:59.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:20:59.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:20:59.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:20:59.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:20:59.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:21:00.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:21:00.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:21:00.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:21:00.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:21:00.019 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:21:00.092 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:20:45
2026-06-03T13:21:00.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86128, datetime.datetime(2026, 6, 3, 13, 20, 45), datetime.datetime(2026, 6, 3, 13, 20, 44), 'salt', 7.17, 99.74, None, 33.52, 91.96, 0.03, 821.87, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:21:00.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:21:00.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:21:00.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:20:44, diff=16.099304s, valid=True
2026-06-03T13:21:00.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:21:00.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:21:00.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:21:12, diff=-11.897499s, valid=True
2026-06-03T13:21:00.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:21:00.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:21:00.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:20:39, diff=21.109308s, valid=True
2026-06-03T13:21:00.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:21:00.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:21:00.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:21:00.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:21:00.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:21:00.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:21:00.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:21:12, diff=-11.887612s, valid=True
2026-06-03T13:21:00.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:21:00.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:21:00.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:21:00.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59857.113087s, valid=False
2026-06-03T13:21:00.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:21:00.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:21:00.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:21:00.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:21:00.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:21:00.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:21:00.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:21:00.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:21:00.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:21:00.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:21:00.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:21:00.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:21:00.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:21:00.433 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:21:00.715 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:21:01.058 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:21:01.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:21:01.162 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:21:01.162 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:21:01.246 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:21:01.246 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:21:31.275 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:21:31.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:21:31.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:21:31.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:21:31.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:21:31.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:21:31.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:21:31.653 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:21:31.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:21:31.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:21:31.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:21:31.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:21:31.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:21:34.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:21:34.040 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:21:34.041 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:21:34.041 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:21:34.052 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:21:34.066 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:21:34.067 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:21:34.067 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:21:34.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:21:34.068 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:21:34.068 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:21:34.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:21:34.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:21:34.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:21:34.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:21:34.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:21:34.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:21:34.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:21:34.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:21:34.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:21:34.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:21:34.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:21:34.427 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:21:34.509 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:21:15
2026-06-03T13:21:34.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86129, datetime.datetime(2026, 6, 3, 13, 21, 15), datetime.datetime(2026, 6, 3, 13, 21, 14), 'salt', 7.14, 99.74, None, 35.57, 100.7, 0.03, 821.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:21:34.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:21:34.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:21:34.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:21:14, diff=20.516481s, valid=True
2026-06-03T13:21:34.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:21:34.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:21:34.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:21:12, diff=22.520087s, valid=True
2026-06-03T13:21:34.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:21:34.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:21:34.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:21:09, diff=25.528437s, valid=True
2026-06-03T13:21:34.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:21:34.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:21:34.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:21:34.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:21:34.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:21:34.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:21:34.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:21:12, diff=22.532303s, valid=True
2026-06-03T13:21:34.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:21:34.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:21:34.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:21:34.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59891.533165s, valid=False
2026-06-03T13:21:34.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:21:34.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:21:34.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:21:34.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:21:34.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:21:34.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:21:34.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:21:34.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:21:34.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:21:34.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:21:34.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:21:34.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:21:34.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:21:34.859 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:21:35.065 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:21:35.408 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:21:35.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:21:35.512 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:21:35.512 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:21:35.687 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:21:35.688 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:22:05.692 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:22:05.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:22:05.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:22:05.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:22:05.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:22:06.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:22:06.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:22:06.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:22:06.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:22:06.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:22:06.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:22:06.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:22:06.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:22:08.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:22:08.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:22:08.646 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:22:08.647 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:22:08.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:22:08.670 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:22:08.671 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:22:08.671 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:22:08.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:22:08.672 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:22:08.672 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:22:08.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:22:08.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:22:08.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:22:08.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:22:08.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:22:08.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:22:08.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:22:09.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:22:09.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:22:09.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:22:09.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:22:09.012 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:22:09.083 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:21:46
2026-06-03T13:22:09.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86130, datetime.datetime(2026, 6, 3, 13, 21, 46), datetime.datetime(2026, 6, 3, 13, 21, 46), 'salt', 7.24, 99.68, None, 34.19, 91.94, 0.04, 821.87, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:22:09.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:22:09.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:22:09.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:21:46, diff=23.090476s, valid=True
2026-06-03T13:22:09.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:22:09.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:22:09.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:22:12, diff=-2.905998s, valid=True
2026-06-03T13:22:09.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:22:09.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:22:09.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:21:41, diff=28.102097s, valid=True
2026-06-03T13:22:09.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:22:09.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:22:09.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:22:09.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:22:09.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:22:09.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:22:09.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:22:12, diff=-2.894165s, valid=True
2026-06-03T13:22:09.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:22:09.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:22:09.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:22:09.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59926.10665s, valid=False
2026-06-03T13:22:09.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:22:09.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:22:09.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:22:09.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:22:09.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:22:09.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:22:09.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:22:09.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:22:09.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:22:09.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:22:09.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:22:09.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:22:09.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:22:09.497 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:22:09.707 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:22:10.067 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:22:10.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:22:10.176 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:22:10.177 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:22:10.369 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:22:10.369 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:22:40.369 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:22:40.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:22:40.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:22:40.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:22:40.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:22:40.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:22:40.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:22:40.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:22:40.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:22:40.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:22:40.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:22:40.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:22:40.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:22:43.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:22:43.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:22:43.465 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:22:43.465 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:22:43.477 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:22:43.489 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:22:43.490 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:22:43.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:22:43.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:22:43.491 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:22:43.491 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:22:43.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:22:43.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T13:22:43.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:22:43.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T13:22:43.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:22:43.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:22:43.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:22:43.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:22:43.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:22:43.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:22:43.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:22:43.826 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:22:43.897 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:22:17
2026-06-03T13:22:43.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86131, datetime.datetime(2026, 6, 3, 13, 22, 17), datetime.datetime(2026, 6, 3, 13, 22, 16), 'salt', 7.27, 99.78, None, 37.82, 93.96, 0.03, 821.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:22:43.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:22:43.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T13:22:43.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:22:16, diff=27.90451s, valid=True
2026-06-03T13:22:43.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:22:43.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:22:43.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:22:12, diff=31.907969s, valid=True
2026-06-03T13:22:43.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:22:43.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T13:22:43.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:22:12, diff=31.916153s, valid=True
2026-06-03T13:22:43.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:22:43.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:22:43.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:22:43.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:22:43.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:22:43.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:22:43.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:22:12, diff=31.919869s, valid=True
2026-06-03T13:22:43.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:22:43.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:22:43.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:22:43.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59960.920679s, valid=False
2026-06-03T13:22:43.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:22:43.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:22:43.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:22:43.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:22:43.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:22:43.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:22:43.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:22:43.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:22:44.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:22:44.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:22:44.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:22:44.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:22:44.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:22:44.243 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:22:44.450 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:22:44.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:22:44.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:22:44.894 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:22:44.894 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:22:45.130 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:22:45.130 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:23:15.160 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:23:15.160 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:23:15.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:23:15.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:23:15.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:23:15.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:23:15.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:23:15.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:23:15.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:23:15.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:23:15.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:23:15.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:23:15.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:23:18.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:23:18.533 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:23:18.533 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:23:18.533 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:23:18.543 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:23:18.555 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:23:18.555 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:23:18.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:23:18.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:23:18.555 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:23:18.555 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:23:18.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:23:18.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:23:18.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:23:18.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:23:18.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:23:18.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:23:18.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:23:18.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:23:18.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:23:18.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:23:18.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:23:18.890 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:23:18.961 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:23:17
2026-06-03T13:23:18.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86133, datetime.datetime(2026, 6, 3, 13, 23, 17), datetime.datetime(2026, 6, 3, 13, 23, 16), 'salt', 7.34, 99.74, None, 32.18, 91.75, 0.03, 821.81, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:23:18.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:23:18.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:23:18.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:23:16, diff=2.968891s, valid=True
2026-06-03T13:23:18.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:23:18.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:23:18.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:23:12, diff=6.972384s, valid=True
2026-06-03T13:23:18.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:23:18.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:23:18.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:23:15, diff=3.980614s, valid=True
2026-06-03T13:23:18.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:23:18.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:23:18.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:23:18.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:23:18.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:23:18.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:23:18.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:23:12, diff=6.98436s, valid=True
2026-06-03T13:23:18.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:23:18.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:23:18.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:23:18.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=59995.985201s, valid=False
2026-06-03T13:23:18.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:23:18.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:23:18.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:23:18.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:23:18.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:23:19.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:23:19.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:23:19.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:23:19.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:23:19.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:23:19.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:23:19.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:23:19.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:23:19.377 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:23:19.583 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:23:19.945 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:23:20.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:23:20.055 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:23:20.056 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:23:20.255 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:23:20.256 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:23:50.286 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:23:50.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:23:50.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:23:50.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:23:50.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:23:50.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:23:50.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:23:50.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:23:50.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:23:50.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:23:50.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:23:50.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:23:50.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:23:53.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:23:53.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:23:53.119 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:23:53.119 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:23:53.128 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:23:53.142 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:23:53.143 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:23:53.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:23:53.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:23:53.144 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:23:53.144 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:23:53.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:23:53.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:23:53.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:23:53.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:23:53.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:23:53.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:23:53.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:23:53.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:23:53.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:23:53.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:23:53.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:23:53.481 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:23:53.551 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:23:47
2026-06-03T13:23:53.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86134, datetime.datetime(2026, 6, 3, 13, 23, 47), datetime.datetime(2026, 6, 3, 13, 23, 46), 'salt', 7.3, 99.81, None, 37.58, 88.35, 0.02, 821.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:23:53.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:23:53.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:23:53.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:23:46, diff=7.558854s, valid=True
2026-06-03T13:23:53.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:23:53.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:23:53.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:24:12, diff=-18.437683s, valid=True
2026-06-03T13:23:53.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:23:53.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:23:53.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:23:46, diff=7.570508s, valid=True
2026-06-03T13:23:53.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:23:53.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:23:53.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:23:53.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:23:53.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:23:53.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:23:53.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:24:12, diff=-18.425759s, valid=True
2026-06-03T13:23:53.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:23:53.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:23:53.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:23:53.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60030.575064s, valid=False
2026-06-03T13:23:53.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:23:53.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:23:53.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:23:53.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:23:53.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:23:53.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:23:53.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:23:53.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:23:53.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:23:53.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:23:53.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:23:53.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:23:53.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:23:53.896 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:23:54.103 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:23:54.447 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:23:54.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:23:54.550 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:23:54.550 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:23:54.621 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:23:54.621 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:24:24.652 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:24:24.652 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:24:24.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:24:24.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:24:24.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:24:25.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:24:25.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:24:25.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:24:25.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:24:25.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:24:25.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:24:25.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:24:25.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:24:27.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:24:27.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:24:27.700 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:24:27.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:24:27.711 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:24:27.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:24:27.725 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:24:27.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:24:27.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:24:27.726 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:24:27.726 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:24:27.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:24:27.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:24:27.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:24:27.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:24:27.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:24:28.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:24:28.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:24:28.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:24:28.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:24:28.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:24:28.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:24:28.069 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:24:28.137 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:24:17
2026-06-03T13:24:28.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86135, datetime.datetime(2026, 6, 3, 13, 24, 17), datetime.datetime(2026, 6, 3, 13, 24, 17), 'salt', 7.2, 99.71, None, 36.55, 96.94, 0.03, 821.69, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:24:28.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:24:28.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:24:28.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:24:17, diff=11.144832s, valid=True
2026-06-03T13:24:28.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:24:28.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:24:28.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:24:12, diff=16.148305s, valid=True
2026-06-03T13:24:28.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:24:28.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:24:28.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:24:11, diff=17.156659s, valid=True
2026-06-03T13:24:28.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:24:28.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:24:28.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:24:28.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:24:28.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:24:28.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:24:28.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:24:12, diff=16.160384s, valid=True
2026-06-03T13:24:28.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:24:28.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:24:28.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:24:28.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60065.161213s, valid=False
2026-06-03T13:24:28.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:24:28.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:24:28.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:24:28.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:24:28.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:24:28.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:24:28.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:24:28.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:24:28.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:24:28.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:24:28.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:24:28.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:24:28.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:24:28.549 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:24:28.758 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:24:29.103 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:24:29.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:24:29.206 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:24:29.206 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:24:29.381 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:24:29.381 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:24:59.407 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:24:59.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:24:59.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:24:59.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:24:59.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:24:59.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:24:59.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:24:59.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:24:59.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:24:59.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:24:59.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:24:59.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:24:59.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:25:02.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:25:02.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:25:02.386 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:25:02.386 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:25:02.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:25:02.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:25:02.411 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:25:02.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:25:02.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:25:02.412 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:25:02.412 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:25:02.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:25:02.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:25:02.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:25:02.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:25:02.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:25:02.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:25:02.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:25:02.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:25:02.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:25:02.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:25:02.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:25:02.741 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:25:02.809 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:24:48
2026-06-03T13:25:02.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86136, datetime.datetime(2026, 6, 3, 13, 24, 48), datetime.datetime(2026, 6, 3, 13, 24, 47), 'salt', 7.24, 99.78, None, 41.21, 95.86, 0.03, 821.75, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:25:02.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:25:02.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:25:02.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:24:47, diff=15.816985s, valid=True
2026-06-03T13:25:02.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:25:02.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:25:02.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:25:12, diff=-9.179521s, valid=True
2026-06-03T13:25:02.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:25:02.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:25:02.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:24:41, diff=21.828709s, valid=True
2026-06-03T13:25:02.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:25:02.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:25:02.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:25:02.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:25:02.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:25:02.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:25:02.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:25:12, diff=-9.167592s, valid=True
2026-06-03T13:25:02.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:25:02.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:25:02.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:25:02.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60099.833245s, valid=False
2026-06-03T13:25:02.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:25:02.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:25:02.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:25:02.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:25:02.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:25:02.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:25:02.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:25:02.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:25:02.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:25:02.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:25:03.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:25:03.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:25:03.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:25:03.153 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:25:03.360 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:25:03.703 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:25:03.807 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:25:03.807 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:25:03.807 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:25:03.875 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:25:03.875 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:25:33.890 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:25:33.890 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:25:33.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:25:34.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:25:34.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:25:34.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:25:34.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:25:34.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:25:34.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:25:34.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:25:34.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:25:34.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:25:34.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:25:37.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:25:37.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:25:37.274 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:25:37.274 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:25:37.282 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:25:37.294 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:25:37.294 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:25:37.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:25:37.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:25:37.295 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:25:37.295 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:25:37.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:25:37.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:25:37.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:25:37.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:25:37.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:25:37.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:25:37.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:25:37.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:25:37.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:25:37.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:25:37.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:25:37.559 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:25:37.627 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:25:18
2026-06-03T13:25:37.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86137, datetime.datetime(2026, 6, 3, 13, 25, 18), datetime.datetime(2026, 6, 3, 13, 25, 17), 'salt', 7.17, 99.78, None, 38.0, 96.75, 0.03, 821.87, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:25:37.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:25:37.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:25:37.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:25:17, diff=20.634098s, valid=True
2026-06-03T13:25:37.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:25:37.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:25:37.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:25:12, diff=25.637305s, valid=True
2026-06-03T13:25:37.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:25:37.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:25:37.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:25:11, diff=26.64497s, valid=True
2026-06-03T13:25:37.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:25:37.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:25:37.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:25:37.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:25:37.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:25:37.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:25:37.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:25:12, diff=25.648478s, valid=True
2026-06-03T13:25:37.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:25:37.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:25:37.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:25:37.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60134.649241s, valid=False
2026-06-03T13:25:37.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:25:37.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:25:37.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:25:37.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:25:37.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:25:37.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:25:37.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:25:37.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:25:37.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:25:37.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:25:37.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:25:37.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:25:37.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:25:38.015 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:25:38.222 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:25:38.562 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:25:38.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:25:38.664 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:25:38.664 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:25:38.819 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:25:38.819 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:26:08.839 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:26:08.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:26:08.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:26:08.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:26:08.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:26:09.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:26:09.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:26:09.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:26:09.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:26:09.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:26:09.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:26:09.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:26:09.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:26:11.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:26:11.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:26:11.927 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:26:11.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:26:11.938 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:26:11.951 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:26:11.952 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:26:11.952 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:26:11.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:26:11.953 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:26:11.953 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:26:11.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:26:12.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:26:12.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:26:12.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:26:12.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:26:12.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:26:12.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:26:12.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:26:12.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:26:12.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:26:12.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:26:12.285 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:26:12.364 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:25:48
2026-06-03T13:26:12.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86138, datetime.datetime(2026, 6, 3, 13, 25, 48), datetime.datetime(2026, 6, 3, 13, 25, 48), 'salt', 7.14, 99.74, None, 37.29, 96.19, 0.03, 821.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:26:12.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:26:12.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:26:12.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:25:48, diff=24.371733s, valid=True
2026-06-03T13:26:12.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:26:12.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:26:12.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:26:12, diff=0.375316s, valid=True
2026-06-03T13:26:12.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:26:12.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:26:12.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:25:42, diff=30.383761s, valid=True
2026-06-03T13:26:12.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:26:12.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:26:12.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:26:12.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:26:12.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:26:12.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:26:12.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:26:12, diff=0.387501s, valid=True
2026-06-03T13:26:12.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:26:12.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:26:12.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:26:12.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60169.388326s, valid=False
2026-06-03T13:26:12.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:26:12.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:26:12.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:26:12.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:26:12.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:26:12.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:26:12.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:26:12.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:26:12.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:26:12.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:26:12.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:26:12.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:26:12.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:26:12.708 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:26:12.912 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:26:13.309 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:26:13.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:26:13.410 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:26:13.410 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:26:13.563 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:26:13.563 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:26:43.593 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:26:43.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:26:43.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:26:43.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:26:43.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:26:44.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:26:44.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:26:44.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:26:44.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:26:44.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:26:44.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:26:44.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:26:44.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:26:47.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:26:47.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:26:47.182 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:26:47.182 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:26:47.193 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:26:47.206 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:26:47.206 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:26:47.207 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:26:47.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:26:47.207 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:26:47.208 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:26:47.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:26:47.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T13:26:47.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:26:47.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T13:26:47.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:26:47.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:26:47.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:26:47.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:26:47.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:26:47.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:26:47.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:26:47.543 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:26:47.612 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:26:19
2026-06-03T13:26:47.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86139, datetime.datetime(2026, 6, 3, 13, 26, 19), datetime.datetime(2026, 6, 3, 13, 26, 18), 'salt', 7.14, 99.78, None, 38.07, 95.11, 0.03, 821.75, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:26:47.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:26:47.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T13:26:47.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:26:18, diff=29.619547s, valid=True
2026-06-03T13:26:47.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:26:47.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:26:47.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:26:12, diff=35.623003s, valid=True
2026-06-03T13:26:47.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:26:47.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T13:26:47.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:26:13, diff=34.631159s, valid=True
2026-06-03T13:26:47.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:26:47.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:26:47.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:26:47.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:26:47.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:26:47.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:26:47.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:26:12, diff=35.634856s, valid=True
2026-06-03T13:26:47.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:26:47.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:26:47.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:26:47.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60204.635686s, valid=False
2026-06-03T13:26:47.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:26:47.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:26:47.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:26:47.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:26:47.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:26:47.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:26:47.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:26:47.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:26:47.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:26:47.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:26:47.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:26:47.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:26:47.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:26:47.954 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:26:48.159 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:26:48.500 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:26:48.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:26:48.602 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:26:48.602 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:26:48.674 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:26:48.674 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:27:18.704 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:27:18.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:27:18.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:27:18.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:27:18.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:27:19.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:27:19.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:27:19.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:27:19.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:27:19.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:27:19.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:27:19.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:27:19.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:27:21.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:27:21.757 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:27:21.757 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:27:21.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:27:21.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:27:21.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:27:21.782 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:27:21.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:27:21.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:27:21.783 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:27:21.783 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:27:21.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:27:21.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:27:21.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:27:22.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:27:22.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:27:22.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:27:22.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:27:22.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:27:22.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:27:22.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:27:22.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:27:22.113 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:27:22.186 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:27:19
2026-06-03T13:27:22.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86141, datetime.datetime(2026, 6, 3, 13, 27, 19), datetime.datetime(2026, 6, 3, 13, 27, 18), 'salt', 7.14, 99.78, None, 34.93, 102.81, 0.03, 821.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:27:22.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:27:22.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:27:22.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:27:18, diff=4.193956s, valid=True
2026-06-03T13:27:22.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:27:22.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:27:22.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:27:12, diff=10.197401s, valid=True
2026-06-03T13:27:22.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:27:22.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:27:22.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:27:16, diff=6.205529s, valid=True
2026-06-03T13:27:22.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:27:22.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:27:22.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:27:22.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:27:22.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:27:22.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:27:22.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:27:12, diff=10.209233s, valid=True
2026-06-03T13:27:22.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:27:22.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:27:22.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:27:22.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60239.21004s, valid=False
2026-06-03T13:27:22.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:27:22.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:27:22.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:27:22.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:27:22.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:27:22.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:27:22.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:27:22.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:27:22.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:27:22.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:27:22.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:27:22.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:27:22.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:27:22.531 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:27:22.808 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:27:23.147 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:27:23.248 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:27:23.248 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:27:23.249 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:27:23.321 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:27:23.321 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:27:53.350 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:27:53.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:27:53.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:27:53.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:27:53.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:27:53.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:27:53.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:27:53.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:27:53.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:27:53.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:27:53.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:27:53.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:27:53.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:27:56.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:27:56.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:27:56.431 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:27:56.431 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:27:56.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:27:56.452 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:27:56.453 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:27:56.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:27:56.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:27:56.454 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:27:56.454 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:27:56.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:27:56.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:27:56.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:27:56.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:27:56.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:27:56.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:27:56.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:27:56.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:27:56.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:27:56.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:27:56.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:27:56.755 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:27:56.823 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:27:49
2026-06-03T13:27:56.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86142, datetime.datetime(2026, 6, 3, 13, 27, 49), datetime.datetime(2026, 6, 3, 13, 27, 49), 'salt', 7.1, 99.71, None, 33.63, 96.12, 0.03, 822.05, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:27:56.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:27:56.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:27:56.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:27:49, diff=7.829573s, valid=True
2026-06-03T13:27:56.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:27:56.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:27:56.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:28:12, diff=-15.167347s, valid=True
2026-06-03T13:27:56.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:27:56.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:27:56.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:27:48, diff=8.839443s, valid=True
2026-06-03T13:27:56.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:27:56.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:27:56.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:27:56.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:27:56.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:27:56.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:27:56.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:28:12, diff=-15.157504s, valid=True
2026-06-03T13:27:56.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:27:56.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:27:56.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:27:56.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60273.843163s, valid=False
2026-06-03T13:27:56.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:27:56.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:27:56.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:27:56.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:27:56.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:27:56.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:27:56.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:27:56.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:27:56.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:27:56.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:27:57.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:27:57.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:27:57.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:27:57.159 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:27:57.364 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:27:57.701 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:27:57.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:27:57.802 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:27:57.803 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:27:57.874 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:27:57.875 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:28:27.893 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:28:27.893 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:28:27.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:28:28.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:28:28.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:28:28.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:28:28.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:28:28.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:28:28.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:28:28.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:28:28.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:28:28.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:28:28.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:28:30.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:28:30.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:28:30.942 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:28:30.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:28:30.951 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:28:30.964 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:28:30.964 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:28:30.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:28:30.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:28:30.966 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:28:30.966 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:28:30.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:28:31.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:28:31.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:28:31.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:28:31.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:28:31.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:28:31.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:28:31.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:28:31.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:28:31.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:28:31.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:28:31.305 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:28:31.376 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:28:20
2026-06-03T13:28:31.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86143, datetime.datetime(2026, 6, 3, 13, 28, 20), datetime.datetime(2026, 6, 3, 13, 28, 19), 'salt', 7.17, 99.71, None, 30.13, 105.37, 0.03, 821.87, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:28:31.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:28:31.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:28:31.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:28:19, diff=12.383722s, valid=True
2026-06-03T13:28:31.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:28:31.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:28:31.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:28:12, diff=19.387163s, valid=True
2026-06-03T13:28:31.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:28:31.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:28:31.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:28:19, diff=12.395169s, valid=True
2026-06-03T13:28:31.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:28:31.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:28:31.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:28:31.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:28:31.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:28:31.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:28:31.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:28:12, diff=19.39881s, valid=True
2026-06-03T13:28:31.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:28:31.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:28:31.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:28:31.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60308.399581s, valid=False
2026-06-03T13:28:31.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:28:31.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:28:31.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:28:31.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:28:31.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:28:31.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:28:31.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:28:31.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:28:31.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:28:31.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:28:31.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:28:31.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:28:31.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:28:31.789 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:28:31.992 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:28:32.332 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:28:32.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:28:32.435 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:28:32.435 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:28:32.635 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:28:32.635 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:29:02.645 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:29:02.645 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:29:02.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:29:02.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:29:02.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:29:03.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:29:03.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:29:03.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:29:03.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:29:03.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:29:03.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:29:03.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:29:03.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:29:06.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:29:06.151 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:29:06.152 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:29:06.152 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:29:06.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:29:06.175 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:29:06.175 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:29:06.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:29:06.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:29:06.177 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:29:06.177 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:29:06.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:29:06.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:29:06.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:29:06.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:29:06.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:29:06.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T13:29:06.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:29:06.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T13:29:06.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:29:06.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:29:06.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:29:06.504 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:29:06.572 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:28:50
2026-06-03T13:29:06.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86144, datetime.datetime(2026, 6, 3, 13, 28, 50), datetime.datetime(2026, 6, 3, 13, 28, 49), 'salt', 7.24, 99.78, None, 34.33, 99.76, 0.03, 821.81, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:29:06.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:29:06.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:29:06.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:28:49, diff=17.580085s, valid=True
2026-06-03T13:29:06.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:29:06.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T13:29:06.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:29:12, diff=-5.416429s, valid=True
2026-06-03T13:29:06.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:29:06.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:29:06.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:28:43, diff=23.591774s, valid=True
2026-06-03T13:29:06.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:29:06.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:29:06.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:29:06.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:29:06.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:29:06.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T13:29:06.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:29:12, diff=-5.404524s, valid=True
2026-06-03T13:29:06.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:29:06.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:29:06.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:29:06.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60343.59629s, valid=False
2026-06-03T13:29:06.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:29:06.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:29:06.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:29:06.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:29:06.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:29:06.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:29:06.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:29:06.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:29:06.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:29:06.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:29:06.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:29:06.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:29:06.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:29:06.918 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:29:07.123 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:29:07.462 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:29:07.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:29:07.564 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:29:07.564 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:29:07.634 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:29:07.634 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:29:37.664 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:29:37.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:29:37.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:29:37.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:29:37.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:29:38.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:29:38.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:29:38.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:29:38.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:29:38.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:29:38.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:29:38.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:29:38.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:29:40.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:29:40.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:29:40.971 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:29:40.971 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:29:40.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:29:40.995 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:29:40.995 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:29:40.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:29:40.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:29:40.996 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:29:40.997 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:29:41.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:29:41.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:29:41.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:29:41.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:29:41.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:29:41.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T13:29:41.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:29:41.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T13:29:41.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:29:41.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:29:41.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:29:41.328 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:29:41.408 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:29:20
2026-06-03T13:29:41.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86145, datetime.datetime(2026, 6, 3, 13, 29, 20), datetime.datetime(2026, 6, 3, 13, 29, 19), 'salt', 7.24, 99.81, None, 35.14, 104.01, 0.02, 821.87, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:29:41.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:29:41.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:29:41.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:29:19, diff=22.414683s, valid=True
2026-06-03T13:29:41.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:29:41.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T13:29:41.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:29:12, diff=29.417694s, valid=True
2026-06-03T13:29:41.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:29:41.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:29:41.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:29:13, diff=28.424591s, valid=True
2026-06-03T13:29:41.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:29:41.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:29:41.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:29:41.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:29:41.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:29:41.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T13:29:41.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:29:12, diff=29.427793s, valid=True
2026-06-03T13:29:41.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:29:41.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:29:41.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:29:41.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60378.428479s, valid=False
2026-06-03T13:29:41.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:29:41.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:29:41.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:29:41.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:29:41.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:29:41.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:29:41.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:29:41.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:29:41.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:29:41.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:29:41.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:29:41.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:29:41.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:29:41.817 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:29:42.022 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:29:42.367 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:29:42.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:29:42.470 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:29:42.470 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:29:42.596 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:29:42.596 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:30:12.619 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:30:12.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:30:12.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:30:12.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:30:12.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:30:13.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:30:13.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:30:13.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:30:13.012 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:30:13.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:30:13.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:30:13.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:30:13.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:30:15.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:30:15.474 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:30:15.475 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:30:15.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:30:15.486 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:30:15.499 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:30:15.500 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:30:15.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:30:15.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:30:15.501 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:30:15.501 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:30:15.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:30:15.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T13:30:15.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:30:15.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T13:30:15.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:30:15.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T13:30:15.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:30:15.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T13:30:15.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:30:15.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:30:15.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:30:15.839 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:30:15.913 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:29:51
2026-06-03T13:30:15.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86146, datetime.datetime(2026, 6, 3, 13, 29, 51), datetime.datetime(2026, 6, 3, 13, 29, 50), 'salt', 7.14, 99.71, None, 28.76, 101.38, 0.04, 821.87, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:30:15.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:30:15.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T13:30:15.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:29:50, diff=25.91925s, valid=True
2026-06-03T13:30:15.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:30:15.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T13:30:15.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:30:12, diff=3.922138s, valid=True
2026-06-03T13:30:15.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:30:15.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T13:30:15.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:29:43, diff=32.928755s, valid=True
2026-06-03T13:30:15.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:30:15.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:30:15.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:30:15.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:30:15.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:30:15.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T13:30:15.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:30:12, diff=3.931858s, valid=True
2026-06-03T13:30:15.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:30:15.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:30:15.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:30:15.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60412.932503s, valid=False
2026-06-03T13:30:15.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:30:15.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:30:15.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:30:15.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:30:15.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:30:15.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:30:15.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:30:15.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:30:16.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:30:16.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:30:16.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:30:16.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:30:16.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:30:16.246 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:30:16.450 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:30:16.788 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:30:16.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:30:16.891 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:30:16.891 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:30:17.060 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:30:17.060 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:30:47.081 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:30:47.081 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:30:47.081 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:30:47.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:30:47.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:30:47.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:30:47.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:30:47.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:30:47.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:30:47.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:30:47.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:30:47.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:30:47.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:30:50.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:30:50.079 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:30:50.080 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:30:50.080 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:30:50.088 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:30:50.108 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:30:50.108 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:30:50.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:30:50.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:30:50.108 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:30:50.108 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:30:50.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:30:50.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T13:30:50.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:30:50.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T13:30:50.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:30:50.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T13:30:50.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:30:50.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T13:30:50.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:30:50.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:30:50.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:30:50.392 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:30:50.461 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:30:21
2026-06-03T13:30:50.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86147, datetime.datetime(2026, 6, 3, 13, 30, 21), datetime.datetime(2026, 6, 3, 13, 30, 21), 'salt', 7.14, 99.81, None, 34.58, 101.61, 0.02, 821.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:30:50.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:30:50.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T13:30:50.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:30:21, diff=29.468678s, valid=True
2026-06-03T13:30:50.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:30:50.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T13:30:50.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:30:12, diff=38.471981s, valid=True
2026-06-03T13:30:50.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:30:50.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T13:30:50.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:30:14, diff=36.479784s, valid=True
2026-06-03T13:30:50.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:30:50.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:30:50.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:30:50.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:30:50.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:30:50.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T13:30:50.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:30:12, diff=38.483313s, valid=True
2026-06-03T13:30:50.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:30:50.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:30:50.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:30:50.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60447.48408s, valid=False
2026-06-03T13:30:50.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:30:50.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:30:50.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:30:50.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:30:50.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:30:50.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:30:50.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:30:50.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:30:50.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:30:50.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:30:50.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:30:50.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:30:50.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:30:50.871 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:30:51.077 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:30:51.417 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:30:51.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:30:51.521 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:30:51.522 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:30:53.025 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:30:53.025 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:31:23.038 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:31:23.038 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:31:23.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:31:23.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:31:23.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:31:23.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:31:23.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:31:23.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:31:23.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:31:23.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:31:23.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:31:23.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:31:23.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:31:26.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:31:26.317 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:31:26.318 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:31:26.318 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:31:26.328 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:31:26.350 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:31:26.351 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:31:26.351 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:31:26.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:31:26.352 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:31:26.352 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:31:26.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:31:26.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:31:26.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:31:26.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:31:26.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:31:26.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:31:26.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:31:26.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:31:26.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:31:26.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:31:26.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:31:26.708 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:31:26.790 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:31:22
2026-06-03T13:31:26.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86149, datetime.datetime(2026, 6, 3, 13, 31, 22), datetime.datetime(2026, 6, 3, 13, 31, 21), 'salt', 7.01, 99.71, None, 31.97, 91.61, 0.04, 821.87, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:31:26.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:31:26.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:31:26.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:31:21, diff=5.798062s, valid=True
2026-06-03T13:31:26.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:31:26.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:31:26.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:31:12, diff=14.801705s, valid=True
2026-06-03T13:31:26.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:31:26.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:31:26.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:31:17, diff=9.810335s, valid=True
2026-06-03T13:31:26.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:31:26.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:31:26.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:31:26.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:31:26.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:31:26.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:31:26.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:31:12, diff=14.814255s, valid=True
2026-06-03T13:31:26.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:31:26.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:31:26.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:31:26.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60483.815115s, valid=False
2026-06-03T13:31:26.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:31:26.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:31:26.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:31:26.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:31:26.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:31:26.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:31:26.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:31:26.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:31:26.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:31:26.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:31:27.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:31:27.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:31:27.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:31:27.136 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:31:27.343 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:31:27.683 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:31:27.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:31:27.786 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:31:27.786 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:31:27.957 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:31:27.957 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:31:57.987 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:31:57.987 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:31:57.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:31:58.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:31:58.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:31:58.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:31:58.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:31:58.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:31:58.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:31:58.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:31:58.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:31:58.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:31:58.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:32:01.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:32:01.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:32:01.120 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:32:01.121 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:32:01.132 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:32:01.145 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:32:01.146 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:32:01.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:32:01.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:32:01.147 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:32:01.147 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:32:01.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:32:01.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:32:01.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:32:01.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:32:01.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:32:01.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:32:01.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:32:01.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:32:01.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:32:01.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:32:01.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:32:01.472 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:32:01.543 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:31:52
2026-06-03T13:32:01.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86150, datetime.datetime(2026, 6, 3, 13, 31, 52), datetime.datetime(2026, 6, 3, 13, 31, 51), 'salt', 6.97, 99.74, None, 37.54, 92.85, 0.03, 822.05, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:32:01.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:32:01.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:32:01.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:31:51, diff=10.550371s, valid=True
2026-06-03T13:32:01.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:32:01.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:32:01.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:32:12, diff=-10.446152s, valid=True
2026-06-03T13:32:01.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:32:01.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:32:01.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:31:49, diff=12.561983s, valid=True
2026-06-03T13:32:01.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:32:01.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:32:01.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:32:01.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:32:01.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:32:01.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:32:01.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:32:12, diff=-10.434286s, valid=True
2026-06-03T13:32:01.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:32:01.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:32:01.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:32:01.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60518.566515s, valid=False
2026-06-03T13:32:01.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:32:01.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:32:01.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:32:01.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:32:01.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:32:01.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:32:01.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:32:01.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:32:01.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:32:01.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:32:01.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:32:01.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:32:01.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:32:01.920 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:32:02.125 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:32:02.465 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:32:02.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:32:02.567 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:32:02.568 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:32:02.740 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:32:02.741 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:32:32.754 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:32:32.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:32:32.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:32:33.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:32:33.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:32:33.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:32:33.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:32:33.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:32:33.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:32:33.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:32:33.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:32:33.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:32:33.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:32:35.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:32:35.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:32:35.749 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:32:35.749 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:32:35.759 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:32:35.772 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:32:35.772 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:32:35.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:32:35.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:32:35.773 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:32:35.774 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:32:35.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:32:35.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:32:35.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:32:36.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:32:36.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:32:36.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:32:36.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:32:36.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:32:36.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:32:36.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:32:36.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:32:36.127 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:32:36.199 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:32:22
2026-06-03T13:32:36.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86151, datetime.datetime(2026, 6, 3, 13, 32, 22), datetime.datetime(2026, 6, 3, 13, 32, 22), 'salt', 7.04, 99.71, None, 36.45, 87.36, 0.04, 821.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:32:36.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:32:36.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:32:36.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:32:22, diff=14.207287s, valid=True
2026-06-03T13:32:36.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:32:36.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:32:36.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:32:12, diff=24.210771s, valid=True
2026-06-03T13:32:36.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:32:36.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:32:36.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:32:20, diff=16.219107s, valid=True
2026-06-03T13:32:36.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:32:36.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:32:36.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:32:36.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:32:36.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:32:36.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:32:36.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:32:12, diff=24.222865s, valid=True
2026-06-03T13:32:36.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:32:36.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:32:36.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:32:36.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60553.223683s, valid=False
2026-06-03T13:32:36.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:32:36.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:32:36.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:32:36.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:32:36.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:32:36.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:32:36.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:32:36.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:32:36.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:32:36.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:32:36.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:32:36.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:32:36.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:32:36.542 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:32:36.747 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:32:37.146 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:32:37.251 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:32:37.251 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:32:37.251 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:32:37.317 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:32:37.317 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:33:07.345 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:33:07.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:33:07.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:33:07.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:33:07.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:33:07.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:33:07.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:33:07.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:33:07.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:33:07.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:33:07.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:33:07.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:33:07.944 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:33:10.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:33:10.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:33:10.398 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:33:10.398 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:33:10.414 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:33:10.429 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:33:10.430 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:33:10.430 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:33:10.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:33:10.431 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:33:10.431 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:33:10.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:33:10.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:33:10.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:33:10.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:33:10.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:33:10.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:33:10.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:33:10.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:33:10.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:33:10.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:33:10.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:33:10.760 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:33:10.829 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:32:53
2026-06-03T13:33:10.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86152, datetime.datetime(2026, 6, 3, 13, 32, 53), datetime.datetime(2026, 6, 3, 13, 32, 52), 'salt', 7.07, 99.68, None, 33.2, 96.92, 0.04, 822.17, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:33:10.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:33:10.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:33:10.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:32:52, diff=18.835171s, valid=True
2026-06-03T13:33:10.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:33:10.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:33:10.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:33:12, diff=-1.161982s, valid=True
2026-06-03T13:33:10.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:33:10.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:33:10.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:32:52, diff=18.844684s, valid=True
2026-06-03T13:33:10.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:33:10.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:33:10.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:33:10.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:33:10.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:33:10.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:33:10.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:33:12, diff=-1.152303s, valid=True
2026-06-03T13:33:10.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:33:10.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:33:10.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:33:10.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60587.848343s, valid=False
2026-06-03T13:33:10.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:33:10.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:33:10.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:33:10.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:33:10.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:33:10.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:33:10.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:33:10.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:33:10.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:33:10.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:33:11.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:33:11.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:33:11.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:33:11.162 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:33:11.369 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:33:11.711 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:33:11.813 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:33:11.813 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:33:11.813 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:33:11.971 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:33:11.971 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:33:41.983 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:33:41.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:33:41.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:33:42.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:33:42.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:33:42.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:33:42.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:33:42.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:33:42.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:33:42.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:33:42.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:33:42.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:33:42.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:33:45.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:33:45.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:33:45.117 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:33:45.117 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:33:45.128 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:33:45.141 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:33:45.141 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:33:45.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:33:45.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:33:45.143 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:33:45.143 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:33:45.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:33:45.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:33:45.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:33:45.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:33:45.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:33:45.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:33:45.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:33:45.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:33:45.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:33:45.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:33:45.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:33:45.487 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:33:45.558 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:33:23
2026-06-03T13:33:45.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86153, datetime.datetime(2026, 6, 3, 13, 33, 23), datetime.datetime(2026, 6, 3, 13, 33, 22), 'salt', 7.01, 99.64, None, 36.24, 94.1, 0.05, 822.11, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:33:45.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:33:45.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:33:45.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:33:22, diff=23.566033s, valid=True
2026-06-03T13:33:45.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:33:45.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:33:45.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:33:12, diff=33.569519s, valid=True
2026-06-03T13:33:45.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:33:45.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:33:45.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:33:15, diff=30.577705s, valid=True
2026-06-03T13:33:45.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:33:45.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:33:45.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:33:45.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:33:45.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:33:45.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:33:45.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:33:12, diff=33.581418s, valid=True
2026-06-03T13:33:45.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:33:45.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:33:45.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:33:45.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60622.582228s, valid=False
2026-06-03T13:33:45.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:33:45.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:33:45.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:33:45.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:33:45.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:33:45.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:33:45.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:33:45.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:33:45.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:33:45.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:33:45.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:33:45.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:33:45.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:33:45.903 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:33:46.182 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:33:46.522 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:33:46.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:33:46.625 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:33:46.626 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:33:46.697 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:33:46.698 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:34:16.716 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:34:16.717 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:34:16.717 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:34:16.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:34:16.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:34:17.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:34:17.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:34:17.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:34:17.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:34:17.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:34:17.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:34:17.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:34:17.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:34:19.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:34:19.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:34:19.767 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:34:19.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:34:19.777 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:34:19.790 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:34:19.790 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:34:19.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:34:19.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:34:19.791 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:34:19.792 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:34:19.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:34:19.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T13:34:19.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:34:19.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T13:34:19.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:34:20.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:34:20.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:34:20.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:34:20.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:34:20.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:34:20.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:34:20.084 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:34:20.162 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:33:53
2026-06-03T13:34:20.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86154, datetime.datetime(2026, 6, 3, 13, 33, 53), datetime.datetime(2026, 6, 3, 13, 33, 52), 'salt', 7.04, 99.74, None, 32.74, 97.64, 0.03, 822.11, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:34:20.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:34:20.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T13:34:20.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:33:52, diff=28.169574s, valid=True
2026-06-03T13:34:20.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:34:20.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:34:20.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:34:12, diff=8.172919s, valid=True
2026-06-03T13:34:20.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:34:20.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T13:34:20.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:33:45, diff=35.183549s, valid=True
2026-06-03T13:34:20.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:34:20.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:34:20.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:34:20.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:34:20.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:34:20.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:34:20.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:34:12, diff=8.187175s, valid=True
2026-06-03T13:34:20.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:34:20.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:34:20.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:34:20.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60657.187931s, valid=False
2026-06-03T13:34:20.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:34:20.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:34:20.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:34:20.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:34:20.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:34:20.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:34:20.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:34:20.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:34:20.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:34:20.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:34:20.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:34:20.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:34:20.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:34:20.535 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:34:20.743 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:34:21.085 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:34:21.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:34:21.224 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:34:21.224 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:34:21.406 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:34:21.406 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:34:51.422 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:34:51.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:34:51.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:34:51.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:34:51.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:34:51.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:34:51.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:34:51.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:34:51.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:34:51.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:34:51.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:34:51.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:34:51.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:34:54.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:34:54.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:34:54.676 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:34:54.677 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:34:54.688 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:34:54.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:34:54.700 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:34:54.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:34:54.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:34:54.702 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:34:54.702 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:34:54.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:34:54.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:34:54.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:34:54.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:34:54.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:34:54.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:34:54.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:34:55.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:34:55.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:34:55.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:34:55.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:34:55.013 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:34:55.083 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:34:54
2026-06-03T13:34:55.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86156, datetime.datetime(2026, 6, 3, 13, 34, 54), datetime.datetime(2026, 6, 3, 13, 34, 53), 'salt', 7.01, 99.74, None, 33.59, 98.84, 0.04, 821.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:34:55.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:34:55.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:34:55.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:34:53, diff=2.090487s, valid=True
2026-06-03T13:34:55.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:34:55.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:34:55.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:35:12, diff=-16.906214s, valid=True
2026-06-03T13:34:55.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:34:55.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:34:55.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:34:47, diff=8.101346s, valid=True
2026-06-03T13:34:55.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:34:55.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:34:55.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:34:55.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:34:55.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:34:55.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:34:55.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:35:12, diff=-16.895178s, valid=True
2026-06-03T13:34:55.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:34:55.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:34:55.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:34:55.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60692.105566s, valid=False
2026-06-03T13:34:55.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:34:55.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:34:55.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:34:55.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:34:55.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:34:55.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:34:55.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:34:55.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:34:55.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:34:55.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:34:55.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:34:55.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:34:55.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:34:55.494 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:34:55.699 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:34:56.039 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:34:56.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:34:56.143 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:34:56.143 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:34:56.306 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:34:56.306 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:35:26.315 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:35:26.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:35:26.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:35:26.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:35:26.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:35:26.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:35:26.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:35:26.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:35:26.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:35:26.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:35:26.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:35:26.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:35:26.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:35:29.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:35:29.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:35:29.620 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:35:29.621 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:35:29.631 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:35:29.643 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:35:29.644 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:35:29.644 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:35:29.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:35:29.645 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:35:29.645 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:35:29.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:35:29.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:35:29.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:35:29.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:35:29.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:35:29.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:35:29.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:35:29.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:35:29.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:35:29.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:35:29.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:35:29.996 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:35:30.066 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:35:24
2026-06-03T13:35:30.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86157, datetime.datetime(2026, 6, 3, 13, 35, 24), datetime.datetime(2026, 6, 3, 13, 35, 24), 'salt', 6.94, 99.68, None, 32.25, 90.84, 0.04, 821.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:35:30.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:35:30.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:35:30.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:35:24, diff=6.073755s, valid=True
2026-06-03T13:35:30.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:35:30.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:35:30.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:35:12, diff=18.077137s, valid=True
2026-06-03T13:35:30.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:35:30.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:35:30.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:35:18, diff=12.084793s, valid=True
2026-06-03T13:35:30.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:35:30.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:35:30.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:35:30.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:35:30.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:35:30.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:35:30.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:35:12, diff=18.088315s, valid=True
2026-06-03T13:35:30.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:35:30.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:35:30.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:35:30.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60727.089089s, valid=False
2026-06-03T13:35:30.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:35:30.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:35:30.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:35:30.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:35:30.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:35:30.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:35:30.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:35:30.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:35:30.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:35:30.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:35:30.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:35:30.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:35:30.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:35:30.408 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:35:30.613 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:35:30.950 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:35:31.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:35:31.054 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:35:31.054 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:35:31.211 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:35:31.211 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:36:01.241 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:36:01.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:36:01.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:36:01.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:36:01.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:36:01.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:36:01.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:36:01.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:36:01.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:36:01.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:36:01.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:36:01.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:36:01.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:36:04.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:36:04.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:36:04.714 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:36:04.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:36:04.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:36:04.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:36:04.738 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:36:04.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:36:04.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:36:04.739 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:36:04.739 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:36:04.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:36:04.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:36:04.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:36:04.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:36:04.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:36:05.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:36:05.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:36:05.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:36:05.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:36:05.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:36:05.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:36:05.083 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:36:05.153 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:35:55
2026-06-03T13:36:05.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86158, datetime.datetime(2026, 6, 3, 13, 35, 55), datetime.datetime(2026, 6, 3, 13, 35, 54), 'salt', 7.1, 99.78, None, 36.48, 103.39, 0.02, 821.87, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:36:05.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:36:05.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:36:05.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:35:54, diff=11.161388s, valid=True
2026-06-03T13:36:05.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:36:05.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:36:05.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:36:12, diff=-6.834799s, valid=True
2026-06-03T13:36:05.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:36:05.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:36:05.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:35:49, diff=16.173791s, valid=True
2026-06-03T13:36:05.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:36:05.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:36:05.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:36:05.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:36:05.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:36:05.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:36:05.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:36:12, diff=-6.822444s, valid=True
2026-06-03T13:36:05.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:36:05.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:36:05.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:36:05.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60762.178394s, valid=False
2026-06-03T13:36:05.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:36:05.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:36:05.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:36:05.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:36:05.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:36:05.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:36:05.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:36:05.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:36:05.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:36:05.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:36:05.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:36:05.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:36:05.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:36:05.567 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:36:05.773 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:36:06.120 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:36:06.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:36:06.224 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:36:06.224 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:36:06.379 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:36:06.379 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:36:36.409 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:36:36.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:36:36.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:36:36.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:36:36.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:36:37.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:36:37.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:36:37.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:36:37.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:36:37.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:36:37.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:36:37.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:36:37.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:36:39.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:36:39.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:36:39.729 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:36:39.729 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:36:39.739 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:36:39.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:36:39.752 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:36:39.753 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:36:39.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:36:39.753 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:36:39.754 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:36:39.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:36:39.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:36:39.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:36:39.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:36:39.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:36:40.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:36:40.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:36:40.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:36:40.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:36:40.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:36:40.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:36:40.048 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:36:40.123 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:36:25
2026-06-03T13:36:40.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86159, datetime.datetime(2026, 6, 3, 13, 36, 25), datetime.datetime(2026, 6, 3, 13, 36, 24), 'salt', 6.97, 99.74, None, 39.83, 101.68, 0.03, 821.87, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:36:40.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:36:40.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:36:40.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:36:24, diff=16.130218s, valid=True
2026-06-03T13:36:40.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:36:40.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:36:40.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:36:12, diff=28.133146s, valid=True
2026-06-03T13:36:40.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:36:40.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:36:40.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:36:21, diff=19.139851s, valid=True
2026-06-03T13:36:40.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:36:40.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:36:40.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:36:40.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:36:40.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:36:40.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:36:40.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:36:12, diff=28.142888s, valid=True
2026-06-03T13:36:40.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:36:40.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:36:40.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:36:40.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60797.143538s, valid=False
2026-06-03T13:36:40.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:36:40.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:36:40.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:36:40.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:36:40.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:36:40.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:36:40.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:36:40.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:36:40.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:36:40.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:36:40.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:36:40.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:36:40.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:36:40.459 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:36:40.666 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:36:41.012 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:36:41.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:36:41.117 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:36:41.117 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:36:41.384 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:36:41.384 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:37:11.386 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:37:11.386 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:37:11.387 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:37:11.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:37:11.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:37:11.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:37:11.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:37:11.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:37:11.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:37:11.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:37:11.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:37:11.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:37:11.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:37:14.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:37:14.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:37:14.761 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:37:14.761 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:37:14.772 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:37:14.784 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:37:14.785 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:37:14.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:37:14.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:37:14.786 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:37:14.786 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:37:14.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:37:14.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:37:14.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:37:15.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:37:15.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:37:15.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:37:15.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:37:15.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:37:15.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:37:15.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:37:15.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:37:15.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:37:15.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:36:55
2026-06-03T13:37:15.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86160, datetime.datetime(2026, 6, 3, 13, 36, 55), datetime.datetime(2026, 6, 3, 13, 36, 54), 'salt', 6.97, 99.81, None, 31.76, 101.56, 0.02, 821.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:37:15.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:37:15.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:37:15.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:36:54, diff=21.195089s, valid=True
2026-06-03T13:37:15.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:37:15.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:37:15.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:37:12, diff=3.198565s, valid=True
2026-06-03T13:37:15.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:37:15.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:37:15.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:36:53, diff=22.206749s, valid=True
2026-06-03T13:37:15.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:37:15.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:37:15.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:37:15.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:37:15.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:37:15.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:37:15.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:37:12, diff=3.210443s, valid=True
2026-06-03T13:37:15.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:37:15.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:37:15.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:37:15.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60832.211257s, valid=False
2026-06-03T13:37:15.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:37:15.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:37:15.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:37:15.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:37:15.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:37:15.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:37:15.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:37:15.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:37:15.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:37:15.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:37:15.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:37:15.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:37:15.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:37:15.531 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:37:15.765 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:37:16.111 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:37:16.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:37:16.215 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:37:16.215 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:37:16.379 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:37:16.380 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:37:46.409 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:37:46.409 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:37:46.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:37:46.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:37:46.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:37:46.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:37:46.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:37:46.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:37:46.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:37:46.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:37:46.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:37:46.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:37:46.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:37:49.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:37:49.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:37:49.640 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:37:49.640 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:37:49.649 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:37:49.661 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:37:49.662 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:37:49.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:37:49.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:37:49.663 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:37:49.663 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:37:49.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:37:49.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T13:37:49.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:37:49.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T13:37:49.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:37:49.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T13:37:49.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:37:49.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T13:37:49.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:37:49.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:37:49.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:37:49.939 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:37:50.007 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:37:25
2026-06-03T13:37:50.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86161, datetime.datetime(2026, 6, 3, 13, 37, 25), datetime.datetime(2026, 6, 3, 13, 37, 25), 'salt', 6.94, 99.71, None, 31.01, 98.96, 0.04, 822.05, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:37:50.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:37:50.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T13:37:50.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:37:25, diff=25.017691s, valid=True
2026-06-03T13:37:50.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:37:50.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T13:37:50.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:37:12, diff=38.024593s, valid=True
2026-06-03T13:37:50.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:37:50.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T13:37:50.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:37:24, diff=26.034731s, valid=True
2026-06-03T13:37:50.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:37:50.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:37:50.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:37:50.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:37:50.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:37:50.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T13:37:50.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:37:12, diff=38.038452s, valid=True
2026-06-03T13:37:50.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:37:50.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:37:50.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:37:50.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60867.039234s, valid=False
2026-06-03T13:37:50.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:37:50.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:37:50.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:37:50.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:37:50.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:37:50.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:37:50.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:37:50.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:37:50.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:37:50.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:37:50.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:37:50.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:37:50.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:37:50.363 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:37:50.561 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:37:50.893 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:37:51.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:37:51.054 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:37:51.054 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:37:52.498 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:37:52.499 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:38:22.529 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:38:22.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:38:22.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:38:22.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:38:23.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:38:23.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:38:23.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:38:23.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:38:23.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:38:23.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:38:23.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:38:23.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:38:23.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:38:26.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:38:26.281 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:38:26.282 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:38:26.282 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:38:26.292 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:38:26.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:38:26.305 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:38:26.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:38:26.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:38:26.306 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:38:26.306 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:38:26.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:38:26.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:38:26.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:38:26.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:38:26.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:38:26.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:38:26.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:38:26.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:38:26.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:38:26.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:38:26.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:38:26.633 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:38:26.703 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:38:26
2026-06-03T13:38:26.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86163, datetime.datetime(2026, 6, 3, 13, 38, 26), datetime.datetime(2026, 6, 3, 13, 38, 25), 'salt', 7.17, 99.81, None, 30.49, 93.51, 0.02, 821.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T13:38:26.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:38:26.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:38:26.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:38:25, diff=1.710974s, valid=True
2026-06-03T13:38:26.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:38:26.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:38:26.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:38:12, diff=14.714483s, valid=True
2026-06-03T13:38:26.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:38:26.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:38:26.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:38:17, diff=9.722531s, valid=True
2026-06-03T13:38:26.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:38:26.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:38:26.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:38:26.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:38:26.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:38:26.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:38:26.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:38:12, diff=14.726264s, valid=True
2026-06-03T13:38:26.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:38:26.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:38:26.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:38:26.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60903.727071s, valid=False
2026-06-03T13:38:26.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:38:26.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:38:26.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:38:26.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:38:26.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:38:26.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:38:26.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:38:26.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:38:26.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:38:26.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:38:26.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:38:26.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:38:27.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:38:27.050 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:38:27.249 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:38:27.583 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:38:27.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:38:27.684 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:38:27.684 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:38:27.855 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:38:27.855 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:38:57.868 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:38:57.868 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:38:57.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:38:58.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:38:58.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:38:58.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:38:58.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:38:58.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:38:58.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:38:58.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:38:58.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:38:58.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:38:58.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:39:00.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:39:00.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:39:00.965 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:39:00.965 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:39:00.976 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:39:00.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:39:00.989 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:39:00.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:39:00.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:39:00.990 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:39:00.990 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:39:00.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:39:01.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:39:01.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:39:01.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:39:01.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:39:01.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:39:01.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:39:01.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:39:01.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:39:01.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:39:01.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:39:01.326 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:39:01.401 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:38:56
2026-06-03T13:39:01.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86164, datetime.datetime(2026, 6, 3, 13, 38, 56), datetime.datetime(2026, 6, 3, 13, 38, 55), 'salt', 7.1, 99.74, None, 28.97, 97.17, 0.03, 822.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T13:39:01.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:39:01.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:39:01.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:38:55, diff=6.408965s, valid=True
2026-06-03T13:39:01.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:39:01.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:39:01.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:39:12, diff=-10.587646s, valid=True
2026-06-03T13:39:01.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:39:01.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:39:01.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:38:48, diff=13.42018s, valid=True
2026-06-03T13:39:01.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:39:01.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:39:01.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:39:01.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:39:01.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:39:01.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:39:01.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:39:12, diff=-10.576225s, valid=True
2026-06-03T13:39:01.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:39:01.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:39:01.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:39:01.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60938.42454s, valid=False
2026-06-03T13:39:01.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:39:01.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:39:01.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:39:01.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:39:01.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:39:01.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:39:01.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:39:01.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:39:01.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:39:01.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:39:01.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:39:01.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:39:01.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:39:01.780 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:39:02.050 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:39:02.392 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:39:02.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:39:02.493 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:39:02.493 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:39:02.674 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:39:02.674 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:39:32.679 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:39:32.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:39:32.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:39:32.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:39:33.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:39:33.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:39:33.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:39:33.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:39:33.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:39:33.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:39:33.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:39:33.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:39:33.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:39:35.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:39:35.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:39:35.995 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:39:35.995 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:39:36.006 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:39:36.019 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:39:36.019 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:39:36.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:39:36.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:39:36.021 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:39:36.021 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:39:36.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:39:36.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:39:36.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:39:36.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:39:36.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:39:36.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:39:36.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:39:36.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:39:36.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:39:36.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:39:36.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:39:36.378 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:39:36.448 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:39:26
2026-06-03T13:39:36.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86165, datetime.datetime(2026, 6, 3, 13, 39, 26), datetime.datetime(2026, 6, 3, 13, 39, 26), 'salt', 7.14, 99.81, None, 35.25, 98.56, 0.02, 821.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T13:39:36.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:39:36.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:39:36.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:39:26, diff=10.455279s, valid=True
2026-06-03T13:39:36.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:39:36.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:39:36.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:39:12, diff=24.458557s, valid=True
2026-06-03T13:39:36.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:39:36.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:39:36.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:39:19, diff=17.466255s, valid=True
2026-06-03T13:39:36.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:39:36.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:39:36.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:39:36.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:39:36.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:39:36.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:39:36.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:39:12, diff=24.469718s, valid=True
2026-06-03T13:39:36.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:39:36.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:39:36.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:39:36.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=60973.470485s, valid=False
2026-06-03T13:39:36.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:39:36.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:39:36.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:39:36.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:39:36.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:39:36.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:39:36.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:39:36.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:39:36.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:39:36.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:39:36.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:39:36.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:39:36.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:39:36.789 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:39:36.990 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:39:37.337 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:39:37.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:39:37.438 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:39:37.438 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:39:37.628 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:39:37.628 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:40:07.658 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:40:07.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:40:07.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:40:08.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:40:08.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:40:08.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:40:08.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:40:08.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:40:08.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:40:08.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:40:08.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:40:08.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:40:08.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:40:10.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:40:10.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:40:10.884 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:40:10.885 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:40:10.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:40:10.906 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:40:10.906 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:40:10.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:40:10.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:40:10.906 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:40:10.906 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:40:10.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:40:11.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:40:11.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:40:11.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:40:11.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:40:11.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:40:11.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:40:11.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:40:11.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:40:11.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:40:11.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:40:11.211 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:40:11.280 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:39:57
2026-06-03T13:40:11.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86166, datetime.datetime(2026, 6, 3, 13, 39, 57), datetime.datetime(2026, 6, 3, 13, 39, 56), 'salt', 7.07, 99.78, None, 40.05, 98.79, 0.02, 822.11, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T13:40:11.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:40:11.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:40:11.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:39:56, diff=15.287246s, valid=True
2026-06-03T13:40:11.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:40:11.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:40:11.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:40:12, diff=-0.709481s, valid=True
2026-06-03T13:40:11.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:40:11.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:40:11.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:39:51, diff=20.298346s, valid=True
2026-06-03T13:40:11.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:40:11.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:40:11.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:40:11.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:40:11.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:40:11.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:40:11.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:40:12, diff=-0.698173s, valid=True
2026-06-03T13:40:11.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:40:11.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:40:11.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:40:11.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61008.302566s, valid=False
2026-06-03T13:40:11.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:40:11.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:40:11.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:40:11.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:40:11.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:40:11.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:40:11.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:40:11.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:40:11.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:40:11.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:40:11.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:40:11.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:40:11.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:40:11.689 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:40:11.885 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:40:12.214 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:40:12.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:40:12.313 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:40:12.313 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:40:12.589 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:40:12.590 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:40:42.592 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:40:42.592 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:40:42.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:40:43.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:40:43.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:40:43.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:40:43.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:40:43.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:40:43.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:40:43.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:40:43.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:40:43.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:40:43.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:40:46.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:40:46.129 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:40:46.130 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:40:46.130 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:40:46.140 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:40:46.152 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:40:46.153 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:40:46.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:40:46.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:40:46.154 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:40:46.154 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:40:46.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:40:46.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:40:46.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:40:46.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:40:46.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:40:46.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:40:46.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:40:46.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:40:46.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:40:46.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:40:46.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:40:46.480 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:40:46.551 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:40:27
2026-06-03T13:40:46.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86167, datetime.datetime(2026, 6, 3, 13, 40, 27), datetime.datetime(2026, 6, 3, 13, 40, 26), 'salt', 7.01, 99.74, None, 36.91, 103.91, 0.04, 821.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:40:46.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:40:46.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:40:46.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:40:26, diff=20.559542s, valid=True
2026-06-03T13:40:46.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:40:46.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:40:46.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:40:12, diff=34.563086s, valid=True
2026-06-03T13:40:46.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:40:46.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:40:46.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:40:22, diff=24.571252s, valid=True
2026-06-03T13:40:46.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:40:46.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:40:46.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:40:46.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:40:46.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:40:46.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:40:46.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:40:12, diff=34.57499s, valid=True
2026-06-03T13:40:46.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:40:46.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:40:46.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:40:46.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61043.575815s, valid=False
2026-06-03T13:40:46.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:40:46.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:40:46.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:40:46.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:40:46.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:40:46.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:40:46.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:40:46.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:40:46.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:40:46.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:40:46.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:40:46.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:40:46.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:40:46.898 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:40:47.097 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:40:47.426 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:40:47.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:40:47.526 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:40:47.526 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:40:47.696 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:40:47.697 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:41:17.718 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:41:17.718 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:41:17.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:41:17.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:41:17.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:41:18.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:41:18.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:41:18.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:41:18.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:41:18.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:41:18.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:41:18.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:41:18.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:41:21.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:41:21.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:41:21.101 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:41:21.101 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:41:21.112 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:41:21.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:41:21.126 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:41:21.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:41:21.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:41:21.127 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:41:21.127 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:41:21.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:41:21.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T13:41:21.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:41:21.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T13:41:21.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:41:21.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:41:21.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:41:21.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:41:21.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:41:21.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:41:21.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:41:21.472 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:41:21.545 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:40:57
2026-06-03T13:41:21.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86168, datetime.datetime(2026, 6, 3, 13, 40, 57), datetime.datetime(2026, 6, 3, 13, 40, 56), 'salt', 7.07, 99.78, None, 38.25, 97.74, 0.02, 821.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:41:21.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:41:21.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T13:41:21.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:40:56, diff=25.55577s, valid=True
2026-06-03T13:41:21.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:41:21.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:41:21.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:41:12, diff=9.560826s, valid=True
2026-06-03T13:41:21.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:41:21.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T13:41:21.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:40:53, diff=28.571691s, valid=True
2026-06-03T13:41:21.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:41:21.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:41:21.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:41:21.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:41:21.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:41:21.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:41:21.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:41:12, diff=9.577097s, valid=True
2026-06-03T13:41:21.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:41:21.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:41:21.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:41:21.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61078.578398s, valid=False
2026-06-03T13:41:21.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:41:21.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:41:21.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:41:21.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:41:21.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:41:21.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:41:21.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:41:21.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:41:21.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:41:21.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:41:21.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:41:21.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:41:21.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:41:21.973 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:41:22.169 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:41:22.500 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:41:22.600 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:41:22.601 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:41:22.601 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:41:22.672 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:41:22.672 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:41:52.686 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:41:52.686 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:41:52.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:41:52.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:41:52.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:41:53.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:41:53.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:41:53.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:41:53.084 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:41:53.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:41:53.090 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:41:53.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:41:53.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:41:55.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:41:55.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:41:55.748 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:41:55.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:41:55.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:41:55.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:41:55.777 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:41:55.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:41:55.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:41:55.778 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:41:55.778 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:41:55.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:41:55.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T13:41:55.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:41:56.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T13:41:56.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:41:56.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T13:41:56.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:41:56.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T13:41:56.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:41:56.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:41:56.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:41:56.126 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:41:56.205 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:41:27
2026-06-03T13:41:56.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86169, datetime.datetime(2026, 6, 3, 13, 41, 27), datetime.datetime(2026, 6, 3, 13, 41, 27), 'salt', 7.17, 99.78, None, 37.19, 97.74, 0.03, 821.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:41:56.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:41:56.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T13:41:56.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:41:27, diff=29.213604s, valid=True
2026-06-03T13:41:56.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:41:56.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T13:41:56.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:41:12, diff=44.217233s, valid=True
2026-06-03T13:41:56.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:41:56.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T13:41:56.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:41:25, diff=31.225879s, valid=True
2026-06-03T13:41:56.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:41:56.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:41:56.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:41:56.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:41:56.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:41:56.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T13:41:56.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:41:12, diff=44.229671s, valid=True
2026-06-03T13:41:56.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:41:56.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:41:56.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:41:56.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61113.230483s, valid=False
2026-06-03T13:41:56.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:41:56.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:41:56.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:41:56.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:41:56.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:41:56.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:41:56.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:41:56.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:41:56.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:41:56.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:41:56.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:41:56.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:41:56.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:41:56.553 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:41:56.749 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:41:57.079 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:41:57.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:41:57.180 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:41:57.180 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:41:57.342 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:41:57.342 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:42:27.344 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:42:27.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:42:27.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:42:27.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:42:27.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:42:27.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:42:27.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:42:27.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:42:27.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:42:28.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:42:28.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:42:28.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:42:28.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:42:30.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:42:30.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:42:30.636 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:42:30.636 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:42:30.646 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:42:30.659 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:42:30.659 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:42:30.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:42:30.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:42:30.661 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:42:30.661 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:42:30.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:42:30.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:42:30.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:42:30.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:42:30.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:42:30.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:42:30.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:42:31.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:42:31.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:42:31.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:42:31.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:42:31.005 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:42:31.078 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:42:28
2026-06-03T13:42:31.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86171, datetime.datetime(2026, 6, 3, 13, 42, 28), datetime.datetime(2026, 6, 3, 13, 42, 27), 'salt', 7.14, 99.78, None, 35.67, 93.51, 0.03, 821.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:42:31.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:42:31.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:42:31.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:42:27, diff=4.086541s, valid=True
2026-06-03T13:42:31.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:42:31.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:42:31.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:42:12, diff=19.090331s, valid=True
2026-06-03T13:42:31.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:42:31.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:42:31.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:42:19, diff=12.099003s, valid=True
2026-06-03T13:42:31.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:42:31.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:42:31.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:42:31.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:42:31.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:42:31.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:42:31.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:42:12, diff=19.102914s, valid=True
2026-06-03T13:42:31.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:42:31.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:42:31.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:42:31.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61148.10379s, valid=False
2026-06-03T13:42:31.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:42:31.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:42:31.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:42:31.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:42:31.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:42:31.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:42:31.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:42:31.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:42:31.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:42:31.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:42:31.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:42:31.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:42:31.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:42:31.500 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:42:31.701 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:42:32.034 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:42:32.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:42:32.137 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:42:32.137 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:42:32.339 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:42:32.340 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:43:02.370 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:43:02.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:43:02.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:43:02.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:43:02.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:43:02.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:43:02.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:43:02.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:43:02.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:43:02.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:43:02.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:43:02.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:43:02.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:43:05.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:43:05.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:43:05.487 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:43:05.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:43:05.498 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:43:05.511 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:43:05.512 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:43:05.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:43:05.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:43:05.513 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:43:05.513 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:43:05.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:43:05.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:43:05.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:43:05.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:43:05.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:43:05.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:43:05.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:43:05.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:43:05.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:43:05.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:43:05.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:43:05.874 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:43:05.949 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:42:58
2026-06-03T13:43:05.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86172, datetime.datetime(2026, 6, 3, 13, 42, 58), datetime.datetime(2026, 6, 3, 13, 42, 57), 'salt', 7.14, 99.78, None, 37.29, 103.35, 0.03, 821.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:43:05.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:43:05.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:43:05.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:42:57, diff=8.956915s, valid=True
2026-06-03T13:43:05.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:43:05.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:43:05.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:43:12, diff=-6.039629s, valid=True
2026-06-03T13:43:05.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:43:05.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:43:05.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:42:49, diff=16.968562s, valid=True
2026-06-03T13:43:05.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:43:05.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:43:05.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:43:05.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:43:05.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:43:05.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:43:05.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:43:12, diff=-6.027671s, valid=True
2026-06-03T13:43:05.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:43:05.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:43:05.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:43:05.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61182.973148s, valid=False
2026-06-03T13:43:05.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:43:05.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:43:05.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:43:05.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:43:05.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:43:06.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:43:06.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:43:06.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:43:06.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:43:06.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:43:06.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:43:06.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:43:06.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:43:06.295 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:43:06.493 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:43:06.827 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:43:06.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:43:06.930 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:43:06.930 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:43:06.999 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:43:06.999 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:43:37.029 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:43:37.029 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:43:37.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:43:37.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:43:37.169 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:43:37.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:43:37.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:43:37.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:43:37.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:43:37.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:43:37.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:43:37.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:43:37.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:43:40.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:43:40.213 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:43:40.215 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:43:40.215 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:43:40.225 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:43:40.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:43:40.239 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:43:40.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:43:40.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:43:40.240 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:43:40.240 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:43:40.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:43:40.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:43:40.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:43:40.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:43:40.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:43:40.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:43:40.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:43:40.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:43:40.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:43:40.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:43:40.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:43:40.590 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:43:40.676 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:43:28
2026-06-03T13:43:40.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86173, datetime.datetime(2026, 6, 3, 13, 43, 28), datetime.datetime(2026, 6, 3, 13, 43, 28), 'salt', 7.2, 99.81, None, 38.28, 89.57, 0.02, 822.05, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:43:40.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:43:40.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:43:40.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:43:28, diff=12.683598s, valid=True
2026-06-03T13:43:40.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:43:40.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:43:40.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:43:12, diff=28.687227s, valid=True
2026-06-03T13:43:40.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:43:40.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:43:40.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:43:20, diff=20.695639s, valid=True
2026-06-03T13:43:40.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:43:40.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:43:40.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:43:40.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:43:40.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:43:40.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:43:40.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:43:12, diff=28.699488s, valid=True
2026-06-03T13:43:40.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:43:40.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:43:40.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:43:40.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61217.70033s, valid=False
2026-06-03T13:43:40.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:43:40.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:43:40.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:43:40.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:43:40.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:43:40.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:43:40.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:43:40.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:43:40.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:43:40.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:43:40.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:43:40.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:43:40.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:43:41.022 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:43:41.222 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:43:41.556 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:43:41.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:43:41.657 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:43:41.657 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:43:41.835 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:43:41.835 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:44:11.852 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:44:11.852 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:44:11.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:44:12.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:44:12.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:44:12.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:44:12.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:44:12.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:44:12.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:44:12.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:44:12.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:44:12.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:44:12.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:44:15.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:44:15.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:44:15.327 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:44:15.327 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:44:15.338 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:44:15.351 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:44:15.351 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:44:15.352 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:44:15.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:44:15.352 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:44:15.352 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:44:15.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:44:15.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:44:15.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:44:15.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:44:15.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:44:15.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:44:15.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:44:15.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:44:15.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:44:15.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:44:15.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:44:15.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:44:15.795 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:43:59
2026-06-03T13:44:15.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86174, datetime.datetime(2026, 6, 3, 13, 43, 59), datetime.datetime(2026, 6, 3, 13, 43, 58), 'salt', 7.14, 99.81, None, 35.95, 99.8, 0.02, 821.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:44:15.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:44:15.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:44:15.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:43:58, diff=17.803157s, valid=True
2026-06-03T13:44:15.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:44:15.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:44:15.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:44:12, diff=3.806711s, valid=True
2026-06-03T13:44:15.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:44:15.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:44:15.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:43:52, diff=23.814965s, valid=True
2026-06-03T13:44:15.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:44:15.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:44:15.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:44:15.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:44:15.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:44:15.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:44:15.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:44:12, diff=3.818723s, valid=True
2026-06-03T13:44:15.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:44:15.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:44:15.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:44:15.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61252.819522s, valid=False
2026-06-03T13:44:15.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:44:15.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:44:15.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:44:15.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:44:15.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:44:15.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:44:15.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:44:15.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:44:15.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:44:15.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:44:16.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:44:16.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:44:16.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:44:16.140 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:44:16.352 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:44:16.746 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:44:16.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:44:16.848 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:44:16.848 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:44:17.019 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:44:17.020 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:44:47.049 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:44:47.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:44:47.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:44:47.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:44:47.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:44:47.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:44:47.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:44:47.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:44:47.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:44:47.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:44:47.778 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:44:47.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:44:47.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:44:50.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:44:50.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:44:50.482 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:44:50.482 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:44:50.491 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:44:50.504 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:44:50.505 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:44:50.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:44:50.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:44:50.506 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:44:50.506 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:44:50.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:44:50.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:44:50.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:44:50.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:44:50.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:44:50.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:44:50.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:44:50.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:44:50.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:44:50.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:44:50.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:44:50.861 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:44:50.944 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:44:29
2026-06-03T13:44:50.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86175, datetime.datetime(2026, 6, 3, 13, 44, 29), datetime.datetime(2026, 6, 3, 13, 44, 28), 'salt', 7.14, 99.81, None, 37.12, 92.22, 0.02, 822.11, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:44:50.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:44:50.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:44:50.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:44:28, diff=22.951519s, valid=True
2026-06-03T13:44:50.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:44:50.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:44:50.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:44:12, diff=38.955054s, valid=True
2026-06-03T13:44:50.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:44:50.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:44:50.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:44:23, diff=27.963217s, valid=True
2026-06-03T13:44:50.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:44:50.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:44:50.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:44:50.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:44:50.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:44:50.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:44:50.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:44:12, diff=38.96697s, valid=True
2026-06-03T13:44:50.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:44:50.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:44:50.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:44:50.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61287.967779s, valid=False
2026-06-03T13:44:50.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:44:50.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:44:50.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:44:50.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:44:50.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:44:51.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:44:51.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:44:51.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:44:51.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:44:51.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:44:51.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:44:51.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:44:51.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:44:51.288 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:44:51.485 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:44:51.817 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:44:51.917 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:44:51.917 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:44:51.917 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:44:52.076 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:44:52.076 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:45:22.098 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:45:22.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:45:22.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:45:22.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:45:22.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:45:22.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:45:22.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:45:22.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:45:22.444 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:45:22.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:45:22.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:45:22.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:45:22.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:45:25.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:45:25.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:45:25.187 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:45:25.187 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:45:25.197 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:45:25.210 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:45:25.210 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:45:25.211 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:45:25.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:45:25.211 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:45:25.212 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:45:25.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:45:25.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T13:45:25.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:45:25.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T13:45:25.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:45:25.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:45:25.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:45:25.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:45:25.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:45:25.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:45:25.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:45:25.550 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:45:25.664 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:44:59
2026-06-03T13:45:25.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86176, datetime.datetime(2026, 6, 3, 13, 44, 59), datetime.datetime(2026, 6, 3, 13, 44, 58), 'salt', 7.1, 99.84, None, 32.71, 102.17, 0.01, 821.81, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:45:25.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:45:25.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T13:45:25.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:44:58, diff=27.673884s, valid=True
2026-06-03T13:45:25.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:45:25.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:45:25.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:45:12, diff=13.679193s, valid=True
2026-06-03T13:45:25.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:45:25.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T13:45:25.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:44:55, diff=30.688599s, valid=True
2026-06-03T13:45:25.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:45:25.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:45:25.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:45:25.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:45:25.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:45:25.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:45:25.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:45:12, diff=13.692393s, valid=True
2026-06-03T13:45:25.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:45:25.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:45:25.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:45:25.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61322.693219s, valid=False
2026-06-03T13:45:25.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:45:25.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:45:25.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:45:25.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:45:25.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:45:25.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:45:25.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:45:25.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:45:25.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:45:25.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:45:25.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:45:25.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:45:25.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:45:26.014 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:45:26.283 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:45:26.612 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:45:26.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:45:26.713 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:45:26.713 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:45:26.933 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:45:26.933 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:45:56.955 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:45:56.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:45:56.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:45:57.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:45:57.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:45:57.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:45:57.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:45:57.719 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:45:57.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:45:57.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:45:57.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:45:57.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:45:57.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:46:00.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:46:00.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:46:00.420 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:46:00.420 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:46:00.430 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:46:00.443 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:46:00.443 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:46:00.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:46:00.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:46:00.444 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:46:00.445 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:46:00.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:46:00.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:46:00.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:46:00.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:46:00.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:46:00.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:46:00.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:46:00.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:46:00.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:46:00.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:46:00.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:46:00.807 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:46:00.883 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:46:00
2026-06-03T13:46:00.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86178, datetime.datetime(2026, 6, 3, 13, 46), datetime.datetime(2026, 6, 3, 13, 45, 59), 'salt', 7.14, 99.81, None, 32.5, 102.2, 0.02, 821.87, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:46:00.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:46:00.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:46:00.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:45:59, diff=1.890956s, valid=True
2026-06-03T13:46:00.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:46:00.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:46:00.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:46:12, diff=-11.105553s, valid=True
2026-06-03T13:46:00.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:46:00.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:46:00.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:45:57, diff=3.902614s, valid=True
2026-06-03T13:46:00.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:46:00.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:46:00.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:46:00.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:46:00.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:46:00.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:46:00.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:46:12, diff=-11.093642s, valid=True
2026-06-03T13:46:00.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:46:00.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:46:00.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:46:00.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61357.907175s, valid=False
2026-06-03T13:46:00.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:46:00.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:46:00.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:46:00.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:46:00.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:46:00.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:46:00.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:46:00.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:46:00.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:46:01.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:46:01.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:46:01.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:46:01.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:46:01.226 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:46:01.421 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:46:01.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:46:01.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:46:01.891 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:46:01.891 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:46:02.071 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:46:02.071 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:46:32.095 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:46:32.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:46:32.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:46:32.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:46:32.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:46:32.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:46:32.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:46:32.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:46:32.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:46:32.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:46:32.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:46:32.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:46:32.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:46:35.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:46:35.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:46:35.365 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:46:35.366 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:46:35.376 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:46:35.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:46:35.389 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:46:35.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:46:35.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:46:35.390 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:46:35.390 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:46:35.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:46:35.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:46:35.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:46:35.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:46:35.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:46:35.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:46:35.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:46:35.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:46:35.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:46:35.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:46:35.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:46:35.737 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:46:35.807 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:46:30
2026-06-03T13:46:35.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86179, datetime.datetime(2026, 6, 3, 13, 46, 30), datetime.datetime(2026, 6, 3, 13, 46, 29), 'salt', 7.17, 99.78, None, 37.22, 86.07, 0.03, 822.11, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:46:35.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:46:35.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:46:35.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:46:29, diff=6.815025s, valid=True
2026-06-03T13:46:35.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:46:35.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:46:35.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:46:12, diff=23.818556s, valid=True
2026-06-03T13:46:35.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:46:35.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:46:35.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:46:29, diff=6.82671s, valid=True
2026-06-03T13:46:35.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:46:35.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:46:35.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:46:35.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:46:35.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:46:35.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:46:35.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:46:12, diff=23.830424s, valid=True
2026-06-03T13:46:35.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:46:35.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:46:35.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:46:35.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61392.831236s, valid=False
2026-06-03T13:46:35.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:46:35.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:46:35.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:46:35.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:46:35.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:46:35.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:46:35.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:46:35.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:46:35.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:46:35.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:46:36.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:46:36.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:46:36.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:46:36.223 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:46:36.417 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:46:36.748 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:46:36.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:46:36.848 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:46:36.848 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:46:37.038 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:46:37.039 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:47:07.069 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:47:07.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:47:07.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:47:07.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:47:07.230 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:47:07.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:47:07.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:47:07.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:47:07.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:47:07.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:47:07.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:47:07.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:47:07.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:47:09.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:47:09.897 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:47:09.897 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:47:09.897 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:47:09.907 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:47:09.919 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:47:09.920 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:47:09.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:47:09.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:47:09.920 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:47:09.920 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:47:09.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:47:10.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:47:10.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:47:10.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:47:10.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:47:10.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:47:10.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:47:10.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:47:10.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:47:10.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:47:10.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:47:10.206 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:47:10.278 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:47:00
2026-06-03T13:47:10.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86180, datetime.datetime(2026, 6, 3, 13, 47), datetime.datetime(2026, 6, 3, 13, 46, 59), 'salt', 7.07, 99.78, None, 38.35, 96.16, 0.02, 821.87, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:47:10.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:47:10.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:47:10.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:46:59, diff=11.285479s, valid=True
2026-06-03T13:47:10.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:47:10.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:47:10.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:47:12, diff=-1.711302s, valid=True
2026-06-03T13:47:10.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:47:10.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:47:10.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:46:51, diff=19.296238s, valid=True
2026-06-03T13:47:10.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:47:10.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:47:10.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:47:10.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:47:10.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:47:10.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:47:10.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:47:12, diff=-1.70036s, valid=True
2026-06-03T13:47:10.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:47:10.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:47:10.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:47:10.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61427.30036s, valid=False
2026-06-03T13:47:10.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:47:10.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:47:10.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:47:10.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:47:10.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:47:10.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:47:10.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:47:10.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:47:10.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:47:10.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:47:10.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:47:10.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:47:10.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:47:10.619 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:47:10.818 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:47:11.155 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:47:11.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:47:11.256 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:47:11.256 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:47:11.465 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:47:11.465 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:47:41.495 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:47:41.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:47:41.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:47:41.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:47:41.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:47:41.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:47:41.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:47:41.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:47:41.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:47:41.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:47:41.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:47:41.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:47:41.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:47:44.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:47:44.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:47:44.562 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:47:44.563 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:47:44.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:47:44.585 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:47:44.586 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:47:44.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:47:44.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:47:44.587 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:47:44.587 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:47:44.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:47:44.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:47:44.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:47:44.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:47:44.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:47:44.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:47:44.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:47:44.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:47:44.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:47:44.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:47:44.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:47:44.939 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:47:45.052 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:47:30
2026-06-03T13:47:45.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86181, datetime.datetime(2026, 6, 3, 13, 47, 30), datetime.datetime(2026, 6, 3, 13, 47, 30), 'salt', 7.1, 99.84, None, 37.15, 91.49, 0.01, 821.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T13:47:45.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:47:45.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:47:45.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:47:30, diff=15.059553s, valid=True
2026-06-03T13:47:45.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:47:45.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:47:45.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:47:12, diff=33.063048s, valid=True
2026-06-03T13:47:45.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:47:45.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:47:45.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:47:21, diff=24.071206s, valid=True
2026-06-03T13:47:45.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:47:45.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:47:45.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:47:45.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:47:45.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:47:45.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:47:45.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:47:12, diff=33.07495s, valid=True
2026-06-03T13:47:45.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:47:45.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:47:45.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:47:45.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61462.075761s, valid=False
2026-06-03T13:47:45.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:47:45.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:47:45.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:47:45.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:47:45.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:47:45.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:47:45.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:47:45.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:47:45.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:47:45.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:47:45.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:47:45.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:47:45.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:47:45.467 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:47:45.666 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:47:46.007 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:47:46.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:47:46.111 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:47:46.111 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:47:46.285 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:47:46.285 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:48:16.291 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:48:16.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:48:16.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:48:16.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:48:16.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:48:16.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:48:16.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:48:16.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:48:16.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:48:16.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:48:16.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:48:16.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:48:16.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:48:19.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:48:19.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:48:19.138 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:48:19.138 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:48:19.148 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:48:19.161 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:48:19.162 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:48:19.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:48:19.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:48:19.163 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:48:19.163 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:48:19.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:48:19.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:48:19.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:48:19.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:48:19.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:48:19.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:48:19.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:48:19.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:48:19.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:48:19.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:48:19.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:48:19.501 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:48:19.572 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:48:01
2026-06-03T13:48:19.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86182, datetime.datetime(2026, 6, 3, 13, 48, 1), datetime.datetime(2026, 6, 3, 13, 48), 'salt', 7.07, 99.78, None, 31.23, 85.32, 0.02, 822.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T13:48:19.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:48:19.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:48:19.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:48:00, diff=19.579432s, valid=True
2026-06-03T13:48:19.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:48:19.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:48:19.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:48:12, diff=7.582916s, valid=True
2026-06-03T13:48:19.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:48:19.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:48:19.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:47:53, diff=26.591098s, valid=True
2026-06-03T13:48:19.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:48:19.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:48:19.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:48:19.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:48:19.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:48:19.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:48:19.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:48:12, diff=7.594833s, valid=True
2026-06-03T13:48:19.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:48:19.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:48:19.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:48:19.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61496.595642s, valid=False
2026-06-03T13:48:19.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:48:19.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:48:19.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:48:19.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:48:19.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:48:19.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:48:19.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:48:19.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:48:19.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:48:19.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:48:19.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:48:19.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:48:19.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:48:19.925 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:48:20.145 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:48:20.478 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:48:20.578 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:48:20.579 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:48:20.579 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:48:20.651 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:48:20.651 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:48:50.681 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:48:50.682 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:48:50.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:48:51.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:48:51.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:48:51.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:48:51.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:48:51.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:48:51.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:48:51.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:48:51.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:48:51.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:48:51.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:48:53.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:48:53.722 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:48:53.723 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:48:53.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:48:53.734 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:48:53.746 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:48:53.747 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:48:53.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:48:53.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:48:53.748 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:48:53.748 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:48:53.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:48:53.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T13:48:53.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:48:53.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T13:48:53.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:48:54.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T13:48:54.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:48:54.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T13:48:54.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:48:54.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:48:54.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:48:54.158 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:48:54.232 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:48:31
2026-06-03T13:48:54.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86183, datetime.datetime(2026, 6, 3, 13, 48, 31), datetime.datetime(2026, 6, 3, 13, 48, 30), 'salt', 7.17, 99.78, None, 31.44, 87.99, 0.03, 821.75, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T13:48:54.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:48:54.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T13:48:54.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:48:30, diff=24.238847s, valid=True
2026-06-03T13:48:54.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:48:54.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T13:48:54.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:48:12, diff=42.241685s, valid=True
2026-06-03T13:48:54.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:48:54.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T13:48:54.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:48:24, diff=30.248229s, valid=True
2026-06-03T13:48:54.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:48:54.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:48:54.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:48:54.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:48:54.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:48:54.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T13:48:54.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:48:12, diff=42.251261s, valid=True
2026-06-03T13:48:54.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:48:54.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:48:54.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:48:54.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61531.251927s, valid=False
2026-06-03T13:48:54.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:48:54.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:48:54.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:48:54.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:48:54.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:48:54.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:48:54.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:48:54.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:48:54.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:48:54.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:48:54.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:48:54.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:48:54.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:48:54.566 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:48:54.763 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:48:55.117 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:48:55.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:48:55.222 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:48:55.222 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:48:55.379 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:48:55.379 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:49:25.383 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:49:25.383 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:49:25.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:49:25.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:49:25.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:49:25.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:49:25.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:49:25.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:49:25.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:49:25.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:49:25.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:49:25.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:49:25.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:49:28.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:49:28.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:49:28.818 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:49:28.818 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:49:28.833 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:49:28.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:49:28.847 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:49:28.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:49:28.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:49:28.848 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:49:28.848 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:49:28.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:49:28.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T13:49:28.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:49:29.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T13:49:29.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:49:29.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:49:29.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:49:29.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:49:29.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:49:29.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:49:29.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:49:29.122 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:49:29.192 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:49:01
2026-06-03T13:49:29.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86184, datetime.datetime(2026, 6, 3, 13, 49, 1), datetime.datetime(2026, 6, 3, 13, 49), 'salt', 7.2, 99.81, None, 33.87, 96.66, 0.02, 821.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T13:49:29.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:49:29.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T13:49:29.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:49:00, diff=29.198813s, valid=True
2026-06-03T13:49:29.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:49:29.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:49:29.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:49:12, diff=17.201859s, valid=True
2026-06-03T13:49:29.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:49:29.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T13:49:29.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:48:56, diff=33.208929s, valid=True
2026-06-03T13:49:29.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:49:29.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:49:29.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:49:29.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:49:29.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:49:29.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:49:29.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:49:12, diff=17.21221s, valid=True
2026-06-03T13:49:29.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:49:29.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:49:29.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:49:29.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61566.212919s, valid=False
2026-06-03T13:49:29.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:49:29.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:49:29.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:49:29.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:49:29.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:49:29.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:49:29.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:49:29.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:49:29.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:49:29.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:49:29.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:49:29.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:49:29.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:49:29.529 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:49:29.725 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:49:30.081 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:49:30.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:49:30.190 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:49:30.190 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:49:30.261 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:49:30.261 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:50:00.292 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:50:00.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:50:00.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:50:00.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:50:00.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:50:00.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:50:00.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:50:00.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:50:00.698 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:50:00.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:50:00.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:50:00.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:50:00.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:50:03.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:50:03.339 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:50:03.340 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:50:03.340 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:50:03.351 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:50:03.363 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:50:03.363 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:50:03.363 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:50:03.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:50:03.364 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:50:03.364 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:50:03.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:50:03.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:50:03.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:50:03.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:50:03.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:50:03.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:50:03.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:50:03.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:50:03.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:50:03.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:50:03.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:50:03.638 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:50:03.709 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:50:02
2026-06-03T13:50:03.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86186, datetime.datetime(2026, 6, 3, 13, 50, 2), datetime.datetime(2026, 6, 3, 13, 50, 1), 'salt', 7.24, 99.81, None, 32.36, 97.95, 0.02, 822.05, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:50:03.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:50:03.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:50:03.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:50:01, diff=2.716019s, valid=True
2026-06-03T13:50:03.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:50:03.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:50:03.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:50:12, diff=-8.28072s, valid=True
2026-06-03T13:50:03.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:50:03.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:50:03.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:49:58, diff=5.726898s, valid=True
2026-06-03T13:50:03.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:50:03.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:50:03.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:50:03.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:50:03.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:50:03.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:50:03.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:50:12, diff=-8.269584s, valid=True
2026-06-03T13:50:03.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:50:03.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:50:03.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:50:03.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61600.731186s, valid=False
2026-06-03T13:50:03.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:50:03.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:50:03.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:50:03.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:50:03.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:50:03.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:50:03.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:50:03.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:50:03.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:50:03.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:50:03.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:50:03.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:50:04.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:50:04.048 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:50:04.244 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:50:04.574 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:50:04.674 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:50:04.674 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:50:04.675 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:50:04.845 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:50:04.845 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:50:34.846 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:50:34.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:50:34.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:50:35.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:50:35.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:50:35.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:50:35.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:50:35.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:50:35.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:50:35.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:50:35.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:50:35.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:50:35.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:50:38.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:50:38.038 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:50:38.038 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:50:38.039 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:50:38.049 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:50:38.061 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:50:38.062 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:50:38.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:50:38.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:50:38.063 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:50:38.063 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:50:38.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:50:38.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:50:38.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:50:38.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:50:38.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:50:38.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:50:38.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:50:38.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T13:50:38.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:50:38.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:50:38.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:50:38.401 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:50:38.479 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:50:32
2026-06-03T13:50:38.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86187, datetime.datetime(2026, 6, 3, 13, 50, 32), datetime.datetime(2026, 6, 3, 13, 50, 31), 'salt', 7.14, 99.78, None, 31.58, 94.73, 0.03, 821.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T13:50:38.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:50:38.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:50:38.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:50:31, diff=7.486628s, valid=True
2026-06-03T13:50:38.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:50:38.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:50:38.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:50:12, diff=26.490119s, valid=True
2026-06-03T13:50:38.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:50:38.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:50:38.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:50:30, diff=8.498205s, valid=True
2026-06-03T13:50:38.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:50:38.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:50:38.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:50:38.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:50:38.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:50:38.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T13:50:38.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:50:12, diff=26.501934s, valid=True
2026-06-03T13:50:38.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:50:38.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:50:38.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:50:38.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61635.502787s, valid=False
2026-06-03T13:50:38.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:50:38.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:50:38.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:50:38.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:50:38.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:50:38.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:50:38.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:50:38.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:50:38.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:50:38.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:50:38.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:50:38.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:50:38.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:50:38.825 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:50:39.048 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:50:39.448 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:50:39.551 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:50:39.551 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:50:39.551 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:50:39.706 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:50:39.706 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:51:09.729 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:51:09.729 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:51:09.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:51:09.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:51:09.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:51:10.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:51:10.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:51:10.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:51:10.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:51:10.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:51:10.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:51:10.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:51:10.147 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:51:13.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:51:13.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:51:13.799 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:51:13.799 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:51:13.810 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:51:13.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:51:13.824 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:51:13.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:51:13.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:51:13.825 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:51:13.825 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:51:13.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:51:13.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:51:13.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:51:14.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:51:14.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:51:14.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T13:51:14.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:51:14.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T13:51:14.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:51:14.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:51:14.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:51:14.151 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:51:14.221 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:51:02
2026-06-03T13:51:14.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86188, datetime.datetime(2026, 6, 3, 13, 51, 2), datetime.datetime(2026, 6, 3, 13, 51, 1), 'salt', 7.14, 99.74, None, 37.89, 92.53, 0.03, 821.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T13:51:14.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:51:14.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:51:14.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:51:01, diff=13.228309s, valid=True
2026-06-03T13:51:14.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:51:14.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T13:51:14.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:50:12, diff=62.231653s, valid=True
2026-06-03T13:51:14.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:51:14.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:51:14.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:51:01, diff=13.23961s, valid=True
2026-06-03T13:51:14.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:51:14.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:51:14.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:51:14.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:51:14.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:51:14.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T13:51:14.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:50:12, diff=62.243153s, valid=True
2026-06-03T13:51:14.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:51:14.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:51:14.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:51:14.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61671.243943s, valid=False
2026-06-03T13:51:14.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:51:14.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:51:14.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:51:14.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:51:14.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:51:14.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:51:14.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:51:14.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:51:14.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:51:14.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:51:14.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:51:14.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:51:14.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:51:14.563 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:51:14.771 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:51:15.114 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:51:15.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:51:15.217 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:51:15.217 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:51:15.390 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:51:15.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:51:45.421 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:51:45.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:51:45.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:51:45.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:51:45.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:51:46.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:51:46.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:51:46.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:51:46.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:51:46.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:51:46.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:51:46.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:51:46.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:51:48.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:51:48.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:51:48.724 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:51:48.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:51:48.733 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:51:48.746 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:51:48.746 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:51:48.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:51:48.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:51:48.747 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:51:48.748 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:51:48.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:51:48.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:51:48.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:51:48.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:51:48.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:51:49.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T13:51:49.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:51:49.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T13:51:49.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:51:49.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:51:49.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:51:49.064 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:51:49.135 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:51:32
2026-06-03T13:51:49.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86189, datetime.datetime(2026, 6, 3, 13, 51, 32), datetime.datetime(2026, 6, 3, 13, 51, 32), 'salt', 7.17, 99.74, None, 30.91, 104.12, 0.03, 821.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T13:51:49.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:51:49.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:51:49.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:51:32, diff=17.142991s, valid=True
2026-06-03T13:51:49.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:51:49.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T13:51:49.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:50:12, diff=97.146362s, valid=True
2026-06-03T13:51:49.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:51:49.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:51:49.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:51:24, diff=25.154358s, valid=True
2026-06-03T13:51:49.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:51:49.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:51:49.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:51:49.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:51:49.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:51:49.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T13:51:49.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:50:12, diff=97.15798s, valid=True
2026-06-03T13:51:49.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:51:49.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:51:49.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:51:49.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61706.158767s, valid=False
2026-06-03T13:51:49.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:51:49.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:51:49.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:51:49.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:51:49.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:51:49.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:51:49.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:51:49.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:51:49.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:51:49.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:51:49.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:51:49.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:51:49.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:51:49.479 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:51:49.759 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:51:50.117 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:51:50.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:51:50.223 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:51:50.223 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:51:50.341 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:51:50.341 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:52:20.342 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:52:20.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:52:20.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:52:20.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:52:20.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:52:20.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:52:20.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:52:20.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:52:20.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:52:20.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:52:20.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:52:20.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:52:20.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:52:23.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:52:23.460 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:52:23.461 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:52:23.461 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:52:23.473 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:52:23.485 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:52:23.486 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:52:23.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:52:23.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:52:23.487 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:52:23.487 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:52:23.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:52:23.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:52:23.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:52:23.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:52:23.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:52:23.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T13:52:23.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:52:23.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T13:52:23.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:52:23.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:52:23.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:52:23.807 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:52:23.876 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:52:03
2026-06-03T13:52:23.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86190, datetime.datetime(2026, 6, 3, 13, 52, 3), datetime.datetime(2026, 6, 3, 13, 52, 2), 'salt', 7.01, 99.74, None, 34.01, 108.77, 0.04, 821.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T13:52:23.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:52:23.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:52:23.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:52:02, diff=21.883011s, valid=True
2026-06-03T13:52:23.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:52:23.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T13:52:23.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:50:12, diff=131.885957s, valid=True
2026-06-03T13:52:23.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:52:23.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:52:23.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:51:54, diff=29.892724s, valid=True
2026-06-03T13:52:23.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:52:23.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:52:23.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:52:23.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:52:23.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:52:23.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T13:52:23.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:50:12, diff=131.895852s, valid=True
2026-06-03T13:52:23.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:52:23.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:52:23.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:52:23.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61740.896529s, valid=False
2026-06-03T13:52:23.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:52:23.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:52:23.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:52:23.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:52:23.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:52:23.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:52:23.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:52:23.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:52:23.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:52:24.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:52:24.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:52:24.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:52:24.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:52:24.212 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:52:24.419 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:52:24.762 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:52:24.865 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:52:24.865 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:52:24.865 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:52:25.018 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:52:25.019 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:52:55.049 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:52:55.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:52:55.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:52:55.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:52:55.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:52:55.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:52:55.461 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:52:55.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:52:55.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:52:55.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:52:55.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:52:55.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:52:55.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:52:58.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:52:58.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:52:58.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:52:58.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:52:58.747 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:52:58.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:52:58.760 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:52:58.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:52:58.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:52:58.762 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:52:58.762 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:52:58.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:52:58.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T13:52:58.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:52:58.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T13:52:58.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:52:59.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:52:59.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:52:59.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:52:59.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:52:59.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:52:59.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:52:59.064 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:52:59.134 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:52:33
2026-06-03T13:52:59.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86191, datetime.datetime(2026, 6, 3, 13, 52, 33), datetime.datetime(2026, 6, 3, 13, 52, 32), 'salt', 7.27, 99.78, None, 33.41, 98.23, 0.03, 822.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T13:52:59.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:52:59.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T13:52:59.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:52:32, diff=27.140932s, valid=True
2026-06-03T13:52:59.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:52:59.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:52:59.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:50:12, diff=167.144165s, valid=True
2026-06-03T13:52:59.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:52:59.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T13:52:59.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:52:25, diff=34.151832s, valid=True
2026-06-03T13:52:59.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:52:59.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:52:59.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:52:59.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:52:59.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:52:59.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:52:59.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:50:12, diff=167.155273s, valid=True
2026-06-03T13:52:59.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:52:59.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:52:59.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:52:59.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61776.156029s, valid=False
2026-06-03T13:52:59.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:52:59.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:52:59.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:52:59.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:52:59.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:52:59.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:52:59.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:52:59.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:52:59.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:52:59.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:52:59.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:52:59.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:52:59.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:52:59.546 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:52:59.754 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:53:00.111 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:53:00.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:53:00.216 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:53:00.217 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:53:00.440 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:53:00.440 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:53:30.455 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:53:30.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:53:30.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:53:30.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:53:30.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:53:30.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:53:30.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:53:30.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:53:30.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:53:30.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:53:30.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:53:30.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:53:30.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:53:33.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:53:33.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:53:33.523 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:53:33.523 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:53:33.532 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:53:33.545 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:53:33.545 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:53:33.546 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:53:33.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:53:33.546 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:53:33.547 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:53:33.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:53:33.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T13:53:33.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:53:33.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T13:53:33.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:53:33.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:53:33.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:53:33.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:53:33.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:53:33.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:53:33.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:53:33.888 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:53:33.958 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:53:04
2026-06-03T13:53:33.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86192, datetime.datetime(2026, 6, 3, 13, 53, 4), datetime.datetime(2026, 6, 3, 13, 53, 3), 'salt', 7.27, 99.71, None, 31.3, 103.42, 0.04, 822.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T13:53:33.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:53:33.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T13:53:33.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:53:03, diff=30.96621s, valid=True
2026-06-03T13:53:33.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:53:33.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:53:33.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:50:12, diff=201.969748s, valid=True
2026-06-03T13:53:33.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:53:33.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T13:53:33.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:52:56, diff=37.978891s, valid=True
2026-06-03T13:53:33.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:53:33.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:53:33.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:53:33.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:53:33.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:53:33.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:53:33.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:50:12, diff=201.986178s, valid=True
2026-06-03T13:53:33.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:53:33.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:53:33.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:53:33.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61810.987022s, valid=False
2026-06-03T13:53:33.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:53:33.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:53:33.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:53:33.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:53:33.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:53:34.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:53:34.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:53:34.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:53:34.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:53:34.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:53:34.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:53:34.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:53:34.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:53:34.313 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:53:34.524 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:53:34.869 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:53:34.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:53:34.974 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:53:34.974 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:53:35.197 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:53:35.197 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:54:05.224 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:54:05.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:54:05.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:54:05.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:54:05.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:54:05.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:54:05.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:54:05.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:54:05.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:54:05.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:54:05.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:54:05.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:54:05.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:54:08.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:54:08.445 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:54:08.446 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:54:08.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:54:08.457 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:54:08.469 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:54:08.470 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:54:08.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:54:08.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:54:08.471 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:54:08.471 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:54:08.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:54:08.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:54:08.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:54:08.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:54:08.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:54:08.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:54:08.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:54:08.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:54:08.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:54:08.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:54:08.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:54:08.815 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:54:08.889 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:54:04
2026-06-03T13:54:08.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86194, datetime.datetime(2026, 6, 3, 13, 54, 4), datetime.datetime(2026, 6, 3, 13, 54, 3), 'salt', 7.1, 99.74, None, 28.4, 98.56, 0.03, 822.11, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T13:54:08.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:54:08.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:54:08.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:54:03, diff=5.896999s, valid=True
2026-06-03T13:54:08.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:54:08.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:54:08.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:50:12, diff=236.900525s, valid=True
2026-06-03T13:54:08.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:54:08.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:54:08.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:53:59, diff=9.908783s, valid=True
2026-06-03T13:54:08.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:54:08.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:54:08.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:54:08.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:54:08.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:54:08.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:54:08.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:50:12, diff=236.912515s, valid=True
2026-06-03T13:54:08.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:54:08.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:54:08.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:54:08.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61845.913328s, valid=False
2026-06-03T13:54:08.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:54:08.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:54:08.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:54:08.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:54:08.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:54:08.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:54:08.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:54:08.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:54:09.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:54:09.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:54:09.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:54:09.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:54:09.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:54:09.303 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:54:09.508 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:54:09.904 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:54:10.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:54:10.024 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:54:10.024 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:54:10.172 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:54:10.172 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:54:40.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:54:40.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:54:40.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:54:40.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:54:40.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:54:40.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:54:40.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:54:40.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:54:40.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:54:40.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:54:40.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:54:40.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:54:40.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:54:43.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:54:43.170 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:54:43.171 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:54:43.171 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:54:43.180 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:54:43.193 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:54:43.193 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:54:43.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:54:43.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:54:43.195 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:54:43.195 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:54:43.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:54:43.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:54:43.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:54:43.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:54:43.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:54:43.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:54:43.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:54:43.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:54:43.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:54:43.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:54:43.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:54:43.531 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:54:43.611 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:54:34
2026-06-03T13:54:43.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86195, datetime.datetime(2026, 6, 3, 13, 54, 34), datetime.datetime(2026, 6, 3, 13, 54, 34), 'salt', 7.2, 99.84, None, 35.07, 96.99, 0.01, 822.05, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:54:43.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:54:43.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:54:43.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:54:34, diff=9.618593s, valid=True
2026-06-03T13:54:43.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:54:43.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:54:43.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:55:12, diff=-28.37793s, valid=True
2026-06-03T13:54:43.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:54:43.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:54:43.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:54:31, diff=12.630267s, valid=True
2026-06-03T13:54:43.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:54:43.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:54:43.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:54:43.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:54:43.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:54:43.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:54:43.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:55:12, diff=-28.365981s, valid=True
2026-06-03T13:54:43.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:54:43.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:54:43.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:54:43.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61880.634841s, valid=False
2026-06-03T13:54:43.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:54:43.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:54:43.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:54:43.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:54:43.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:54:43.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:54:43.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:54:43.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:54:43.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:54:43.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:54:43.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:54:43.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:54:43.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:54:43.955 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:54:44.160 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:54:44.498 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:54:44.600 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:54:44.600 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:54:44.600 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:54:44.819 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:54:44.819 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:55:14.820 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:55:14.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:55:14.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:55:15.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:55:15.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:55:15.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:55:15.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:55:15.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:55:15.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:55:15.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:55:15.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:55:15.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:55:15.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:55:18.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:55:18.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:55:18.250 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:55:18.251 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:55:18.262 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:55:18.275 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:55:18.275 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:55:18.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:55:18.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:55:18.277 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:55:18.277 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:55:18.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:55:18.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:55:18.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:55:18.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:55:18.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:55:18.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:55:18.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:55:18.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:55:18.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:55:18.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:55:18.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:55:18.674 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:55:18.747 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:55:05
2026-06-03T13:55:18.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86196, datetime.datetime(2026, 6, 3, 13, 55, 5), datetime.datetime(2026, 6, 3, 13, 55, 4), 'salt', 7.1, 99.74, None, 32.11, 112.01, 0.03, 821.81, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:55:18.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:55:18.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:55:18.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:55:04, diff=14.753667s, valid=True
2026-06-03T13:55:18.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:55:18.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:55:18.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:55:12, diff=6.756514s, valid=True
2026-06-03T13:55:18.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:55:18.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:55:18.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:55:02, diff=16.763123s, valid=True
2026-06-03T13:55:18.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:55:18.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:55:18.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:55:18.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:55:18.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:55:18.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:55:18.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:55:12, diff=6.766147s, valid=True
2026-06-03T13:55:18.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:55:18.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:55:18.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:55:18.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61915.766808s, valid=False
2026-06-03T13:55:18.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:55:18.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:55:18.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:55:18.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:55:18.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:55:18.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:55:18.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:55:18.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:55:18.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:55:18.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:55:18.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:55:18.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:55:19.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:55:19.079 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:55:19.288 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:55:19.628 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:55:19.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:55:19.730 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:55:19.730 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:55:19.895 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:55:19.895 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:55:49.925 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:55:49.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:55:49.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:55:50.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:55:50.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:55:50.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:55:50.268 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:55:50.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:55:50.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:55:50.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:55:50.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:55:50.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:55:50.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:55:52.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:55:52.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:55:52.895 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:55:52.895 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:55:52.903 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:55:52.917 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:55:52.917 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:55:52.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:55:52.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:55:52.918 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:55:52.919 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:55:52.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:55:53.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:55:53.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:55:53.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:55:53.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:55:53.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:55:53.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:55:53.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:55:53.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:55:53.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:55:53.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:55:53.248 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:55:53.317 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:55:35
2026-06-03T13:55:53.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86197, datetime.datetime(2026, 6, 3, 13, 55, 35), datetime.datetime(2026, 6, 3, 13, 55, 34), 'salt', 7.2, 99.81, None, 38.32, 104.22, 0.02, 821.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:55:53.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:55:53.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:55:53.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:55:34, diff=19.324958s, valid=True
2026-06-03T13:55:53.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:55:53.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:55:53.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:56:12, diff=-18.671515s, valid=True
2026-06-03T13:55:53.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:55:53.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:55:53.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:55:33, diff=20.336588s, valid=True
2026-06-03T13:55:53.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:55:53.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:55:53.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:55:53.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:55:53.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:55:53.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:55:53.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:56:12, diff=-18.659701s, valid=True
2026-06-03T13:55:53.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:55:53.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:55:53.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:55:53.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61950.341295s, valid=False
2026-06-03T13:55:53.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:55:53.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:55:53.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:55:53.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:55:53.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:55:53.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:55:53.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:55:53.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:55:53.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:55:53.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:55:53.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:55:53.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:55:53.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:55:53.668 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:55:53.872 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:55:54.211 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:55:54.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:55:54.313 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:55:54.313 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:55:54.478 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:55:54.479 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:56:24.509 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:56:24.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:56:24.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:56:24.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:56:24.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:56:25.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:56:25.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:56:25.132 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:56:25.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:56:25.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:56:25.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:56:25.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:56:25.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:56:27.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:56:27.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:56:27.599 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:56:27.599 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:56:27.611 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:56:27.624 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:56:27.624 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:56:27.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:56:27.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:56:27.626 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:56:27.626 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:56:27.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:56:27.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T13:56:27.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:56:27.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T13:56:27.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:56:27.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:56:27.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:56:27.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:56:27.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:56:27.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:56:27.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:56:27.956 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:56:28.027 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:56:05
2026-06-03T13:56:28.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86198, datetime.datetime(2026, 6, 3, 13, 56, 5), datetime.datetime(2026, 6, 3, 13, 56, 4), 'salt', 7.07, 99.74, None, 40.72, 103.75, 0.03, 821.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:56:28.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:56:28.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T13:56:28.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:56:04, diff=24.034939s, valid=True
2026-06-03T13:56:28.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:56:28.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:56:28.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:56:12, diff=16.038383s, valid=True
2026-06-03T13:56:28.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:56:28.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T13:56:28.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:56:05, diff=23.046558s, valid=True
2026-06-03T13:56:28.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:56:28.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:56:28.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:56:28.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:56:28.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:56:28.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:56:28.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:56:12, diff=16.050427s, valid=True
2026-06-03T13:56:28.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:56:28.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:56:28.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:56:28.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=61985.051261s, valid=False
2026-06-03T13:56:28.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:56:28.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:56:28.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:56:28.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:56:28.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:56:28.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:56:28.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:56:28.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:56:28.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:56:28.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:56:28.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:56:28.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:56:28.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:56:28.371 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:56:28.576 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:56:28.916 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:56:29.018 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:56:29.019 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:56:29.019 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:56:29.247 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:56:29.247 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:56:59.251 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:56:59.251 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:56:59.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:56:59.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:56:59.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:57:00.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:57:00.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:57:00.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:57:00.012 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:57:00.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:57:00.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:57:00.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:57:00.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:57:02.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:57:02.462 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:57:02.463 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:57:02.463 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:57:02.473 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:57:02.486 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:57:02.487 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:57:02.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:57:02.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:57:02.488 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:57:02.488 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:57:02.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:57:02.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T13:57:02.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:57:02.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T13:57:02.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:57:02.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:57:02.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:57:02.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:57:02.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:57:02.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:57:02.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:57:02.817 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:57:02.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:56:35
2026-06-03T13:57:02.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86199, datetime.datetime(2026, 6, 3, 13, 56, 35), datetime.datetime(2026, 6, 3, 13, 56, 35), 'salt', 7.07, 99.74, None, 32.6, 110.95, 0.03, 821.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:57:02.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:57:02.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T13:57:02.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:56:35, diff=27.893053s, valid=True
2026-06-03T13:57:02.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:57:02.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:57:02.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:57:12, diff=-9.103566s, valid=True
2026-06-03T13:57:02.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:57:02.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T13:57:02.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:56:26, diff=36.9045s, valid=True
2026-06-03T13:57:02.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:57:02.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:57:02.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:57:02.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:57:02.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:57:02.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:57:02.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:57:12, diff=-9.091877s, valid=True
2026-06-03T13:57:02.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:57:02.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:57:02.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:57:02.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62019.908907s, valid=False
2026-06-03T13:57:02.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:57:02.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:57:02.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:57:02.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:57:02.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:57:02.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:57:02.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:57:02.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:57:02.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:57:03.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:57:03.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:57:03.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:57:03.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:57:03.228 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:57:03.438 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:57:03.775 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:57:03.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:57:03.936 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:57:03.936 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:57:05.735 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:57:05.735 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:57:35.765 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:57:35.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:57:35.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:57:35.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:57:35.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:57:36.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:57:36.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:57:36.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:57:36.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:57:36.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:57:36.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:57:36.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:57:36.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:57:38.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:57:38.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:57:38.866 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:57:38.866 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:57:38.875 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:57:38.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:57:38.889 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:57:38.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:57:38.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:57:38.890 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:57:38.890 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:57:38.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:57:39.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:57:39.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:57:39.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:57:39.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:57:39.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:57:39.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:57:39.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:57:39.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:57:39.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:57:39.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:57:39.216 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:57:39.286 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:57:36
2026-06-03T13:57:39.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86201, datetime.datetime(2026, 6, 3, 13, 57, 36), datetime.datetime(2026, 6, 3, 13, 57, 35), 'salt', 7.3, 99.94, None, 33.31, 110.63, 0.0, 821.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:57:39.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:57:39.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:57:39.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:57:35, diff=4.293768s, valid=True
2026-06-03T13:57:39.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:57:39.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:57:39.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:58:12, diff=-32.702765s, valid=True
2026-06-03T13:57:39.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:57:39.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:57:39.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:57:29, diff=10.305448s, valid=True
2026-06-03T13:57:39.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:57:39.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:57:39.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:57:39.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:57:39.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:57:39.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:57:39.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:58:12, diff=-32.690843s, valid=True
2026-06-03T13:57:39.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:57:39.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:57:39.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:57:39.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62056.309967s, valid=False
2026-06-03T13:57:39.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:57:39.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:57:39.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:57:39.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:57:39.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:57:39.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:57:39.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:57:39.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:57:39.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:57:39.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:57:39.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:57:39.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:57:39.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:57:39.636 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:57:39.843 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:57:40.208 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:57:40.310 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:57:40.310 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:57:40.310 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:57:40.534 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:57:40.535 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:58:10.565 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:58:10.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:58:10.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:58:11.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:58:11.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:58:11.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:58:11.545 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:58:11.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:58:11.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:58:11.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:58:11.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:58:11.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:58:11.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:58:14.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:58:14.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:58:14.238 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:58:14.239 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:58:14.251 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:58:14.264 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:58:14.265 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:58:14.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:58:14.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:58:14.266 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:58:14.266 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:58:14.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:58:14.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:58:14.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:58:14.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:58:14.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:58:14.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:58:14.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:58:14.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:58:14.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:58:14.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:58:14.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:58:14.594 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:58:14.670 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:58:06
2026-06-03T13:58:14.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86202, datetime.datetime(2026, 6, 3, 13, 58, 6), datetime.datetime(2026, 6, 3, 13, 58, 6), 'salt', 7.2, 99.81, None, 36.59, 92.71, 0.02, 821.81, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:58:14.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:58:14.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:58:14.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:58:06, diff=8.677449s, valid=True
2026-06-03T13:58:14.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:58:14.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:58:14.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:58:12, diff=2.680904s, valid=True
2026-06-03T13:58:14.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:58:14.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:58:14.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:58:00, diff=14.688986s, valid=True
2026-06-03T13:58:14.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:58:14.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:58:14.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:58:14.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:58:14.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:58:14.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:58:14.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:58:12, diff=2.692661s, valid=True
2026-06-03T13:58:14.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:58:14.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:58:14.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:58:14.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62091.693453s, valid=False
2026-06-03T13:58:14.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:58:14.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:58:14.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:58:14.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:58:14.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:58:14.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:58:14.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:58:14.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:58:14.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:58:14.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:58:14.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:58:14.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:58:14.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:58:15.014 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:58:15.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:58:15.627 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:58:15.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:58:15.730 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:58:15.731 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:58:15.946 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:58:15.946 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:58:45.976 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:58:45.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:58:45.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:58:46.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:58:46.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:58:46.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:58:46.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:58:46.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:58:46.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:58:46.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:58:46.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:58:46.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:58:46.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:58:49.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:58:49.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:58:49.061 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:58:49.061 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:58:49.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:58:49.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:58:49.086 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:58:49.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:58:49.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:58:49.087 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:58:49.087 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:58:49.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:58:49.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:58:49.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:58:49.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:58:49.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:58:49.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:58:49.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:58:49.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:58:49.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:58:49.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:58:49.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:58:49.419 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:58:49.490 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:58:37
2026-06-03T13:58:49.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86203, datetime.datetime(2026, 6, 3, 13, 58, 37), datetime.datetime(2026, 6, 3, 13, 58, 36), 'salt', 7.2, 99.88, None, 35.11, 100.81, 0.01, 822.05, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:58:49.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:58:49.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:58:49.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:58:36, diff=13.49759s, valid=True
2026-06-03T13:58:49.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:58:49.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:58:49.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:59:12, diff=-22.498907s, valid=True
2026-06-03T13:58:49.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:58:49.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:58:49.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:58:32, diff=17.509279s, valid=True
2026-06-03T13:58:49.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:58:49.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:58:49.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:58:49.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:58:49.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:58:49.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:58:49.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:59:12, diff=-22.487124s, valid=True
2026-06-03T13:58:49.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:58:49.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:58:49.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:58:49.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62126.513658s, valid=False
2026-06-03T13:58:49.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:58:49.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:58:49.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:58:49.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:58:49.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:58:49.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:58:49.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:58:49.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:58:49.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:58:49.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:58:49.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:58:49.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:58:49.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:58:49.835 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:58:50.063 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:58:50.409 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:58:50.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:58:50.511 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:58:50.511 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:58:50.692 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:58:50.692 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:59:20.692 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:59:20.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:59:20.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:59:20.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:59:20.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:59:21.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:59:21.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:59:21.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:59:21.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:59:21.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:59:21.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:59:21.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:59:21.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:59:23.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:59:23.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:59:23.764 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:59:23.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:59:23.778 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:59:23.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:59:23.791 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:59:23.792 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:59:23.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:59:23.792 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:59:23.793 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:59:23.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:59:23.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:59:23.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:59:24.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:59:24.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:59:24.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:59:24.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:59:24.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T13:59:24.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:59:24.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:59:24.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:59:24.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:59:24.185 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:59:07
2026-06-03T13:59:24.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86204, datetime.datetime(2026, 6, 3, 13, 59, 7), datetime.datetime(2026, 6, 3, 13, 59, 6), 'salt', 7.1, 99.74, None, 32.67, 117.39, 0.03, 821.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:59:24.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:59:24.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:59:24.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:59:06, diff=18.191584s, valid=True
2026-06-03T13:59:24.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:59:24.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:59:24.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:59:12, diff=12.194543s, valid=True
2026-06-03T13:59:24.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:59:24.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:59:24.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:59:07, diff=17.201211s, valid=True
2026-06-03T13:59:24.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:59:24.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:59:24.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:59:24.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:59:24.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:59:24.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T13:59:24.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:59:12, diff=12.204392s, valid=True
2026-06-03T13:59:24.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:59:24.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:59:24.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:59:24.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62161.205081s, valid=False
2026-06-03T13:59:24.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:59:24.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:59:24.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:59:24.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:59:24.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:59:24.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:59:24.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:59:24.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:59:24.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:59:24.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:59:24.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:59:24.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:59:24.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:59:24.601 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:59:24.806 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:59:25.145 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:59:25.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:59:25.247 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:59:25.247 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T13:59:25.319 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T13:59:25.319 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T13:59:55.349 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T13:59:55.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T13:59:55.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T13:59:55.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T13:59:55.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T13:59:55.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T13:59:55.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T13:59:55.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T13:59:55.744 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T13:59:55.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T13:59:55.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T13:59:55.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T13:59:55.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T13:59:58.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T13:59:58.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T13:59:58.409 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T13:59:58.409 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T13:59:58.420 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T13:59:58.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T13:59:58.434 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T13:59:58.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T13:59:58.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T13:59:58.435 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T13:59:58.435 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T13:59:58.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T13:59:58.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T13:59:58.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T13:59:58.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T13:59:58.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:59:58.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:59:58.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T13:59:58.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T13:59:58.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T13:59:58.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T13:59:58.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T13:59:58.781 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T13:59:58.852 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 13:59:37
2026-06-03T13:59:58.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86205, datetime.datetime(2026, 6, 3, 13, 59, 37), datetime.datetime(2026, 6, 3, 13, 59, 37), 'salt', 7.2, 99.81, None, 31.86, 105.13, 0.02, 821.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T13:59:58.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T13:59:58.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T13:59:58.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:59:37, diff=21.858571s, valid=True
2026-06-03T13:59:58.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T13:59:58.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:59:58.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:00:12, diff=-13.138444s, valid=True
2026-06-03T13:59:58.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T13:59:58.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T13:59:58.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 13:59:37, diff=21.868715s, valid=True
2026-06-03T13:59:58.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T13:59:58.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:59:58.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T13:59:58.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T13:59:58.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T13:59:58.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T13:59:58.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:00:12, diff=-13.127855s, valid=True
2026-06-03T13:59:58.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T13:59:58.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T13:59:58.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T13:59:58.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62195.872843s, valid=False
2026-06-03T13:59:58.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T13:59:58.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T13:59:58.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T13:59:58.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T13:59:58.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T13:59:58.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T13:59:58.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T13:59:58.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T13:59:58.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T13:59:59.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T13:59:59.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T13:59:59.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T13:59:59.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T13:59:59.213 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T13:59:59.430 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:59:59.777 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T13:59:59.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T13:59:59.891 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T13:59:59.891 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:00:00.060 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:00:00.060 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:00:30.078 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:00:30.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:00:30.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:00:30.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:00:30.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:00:30.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:00:30.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:00:30.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:00:30.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:00:30.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:00:30.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:00:30.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:00:30.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:00:33.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:00:33.476 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:00:33.477 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:00:33.477 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:00:33.486 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:00:33.499 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:00:33.499 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:00:33.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:00:33.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:00:33.501 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:00:33.501 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:00:33.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:00:33.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:00:33.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:00:33.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:00:33.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:00:33.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:00:33.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:00:33.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:00:33.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:00:33.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:00:33.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:00:33.829 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:00:33.902 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:00:08
2026-06-03T14:00:33.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86206, datetime.datetime(2026, 6, 3, 14, 0, 8), datetime.datetime(2026, 6, 3, 14, 0, 7), 'salt', 7.3, 99.84, None, 40.82, 105.55, 0.01, 821.75, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:00:33.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:00:33.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:00:33.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:00:07, diff=26.908555s, valid=True
2026-06-03T14:00:33.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:00:33.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:00:33.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:00:12, diff=21.911484s, valid=True
2026-06-03T14:00:33.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:00:33.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:00:33.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:00:07, diff=26.918195s, valid=True
2026-06-03T14:00:33.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:00:33.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:00:33.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:00:33.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:00:33.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:00:33.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:00:33.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:00:12, diff=21.921375s, valid=True
2026-06-03T14:00:33.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:00:33.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:00:33.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:00:33.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62230.922057s, valid=False
2026-06-03T14:00:33.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:00:33.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:00:33.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:00:33.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:00:33.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:00:33.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:00:33.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:00:33.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:00:34.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:00:34.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:00:34.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:00:34.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:00:34.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:00:34.310 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:00:34.514 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:00:34.854 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:00:34.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:00:34.958 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:00:34.958 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:00:35.137 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:00:35.138 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:01:05.154 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:01:05.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:01:05.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:01:05.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:01:05.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:01:05.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:01:05.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:01:05.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:01:05.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:01:05.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:01:05.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:01:05.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:01:05.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:01:08.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:01:08.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:01:08.176 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:01:08.176 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:01:08.186 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:01:08.198 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:01:08.199 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:01:08.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:01:08.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:01:08.200 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:01:08.200 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:01:08.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:01:08.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:01:08.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:01:08.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:01:08.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:01:08.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:01:08.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:01:08.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:01:08.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:01:08.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:01:08.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:01:08.540 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:01:08.612 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:00:38
2026-06-03T14:01:08.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86207, datetime.datetime(2026, 6, 3, 14, 0, 38), datetime.datetime(2026, 6, 3, 14, 0, 37), 'salt', 7.24, 99.88, None, 37.65, 100.6, 0.01, 821.75, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:01:08.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:01:08.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:01:08.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:00:37, diff=31.620009s, valid=True
2026-06-03T14:01:08.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:01:08.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:01:08.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:01:12, diff=-3.376499s, valid=True
2026-06-03T14:01:08.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:01:08.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:01:08.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:00:38, diff=30.6316s, valid=True
2026-06-03T14:01:08.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:01:08.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:01:08.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:01:08.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:01:08.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:01:08.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:01:08.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:01:12, diff=-3.364703s, valid=True
2026-06-03T14:01:08.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:01:08.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:01:08.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:01:08.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62265.6361s, valid=False
2026-06-03T14:01:08.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:01:08.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:01:08.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:01:08.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:01:08.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:01:08.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:01:08.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:01:08.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:01:08.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:01:08.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:01:08.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:01:08.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:01:08.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:01:08.956 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:01:09.160 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:01:09.499 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:01:09.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:01:09.603 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:01:09.603 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:01:09.773 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:01:09.773 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:01:39.787 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:01:39.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:01:39.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:01:40.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:01:40.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:01:40.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:01:40.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:01:40.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:01:40.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:01:40.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:01:40.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:01:40.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:01:40.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:01:43.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:01:43.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:01:43.020 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:01:43.020 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:01:43.030 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:01:43.043 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:01:43.043 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:01:43.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:01:43.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:01:43.045 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:01:43.045 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:01:43.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:01:43.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:01:43.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:01:43.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:01:43.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:01:43.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:01:43.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:01:43.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:01:43.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:01:43.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:01:43.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:01:43.377 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:01:43.448 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:01:39
2026-06-03T14:01:43.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86209, datetime.datetime(2026, 6, 3, 14, 1, 39), datetime.datetime(2026, 6, 3, 14, 1, 38), 'salt', 7.17, 99.84, None, 29.32, 102.9, 0.02, 821.87, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:01:43.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:01:43.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:01:43.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:01:38, diff=5.455864s, valid=True
2026-06-03T14:01:43.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:01:43.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:01:43.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:02:12, diff=-28.540454s, valid=True
2026-06-03T14:01:43.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:01:43.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:01:43.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:01:38, diff=5.467779s, valid=True
2026-06-03T14:01:43.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:01:43.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:01:43.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:01:43.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:01:43.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:01:43.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:01:43.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:02:12, diff=-28.527858s, valid=True
2026-06-03T14:01:43.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:01:43.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:01:43.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:01:43.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62300.47341s, valid=False
2026-06-03T14:01:43.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:01:43.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:01:43.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:01:43.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:01:43.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:01:43.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:01:43.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:01:43.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:01:43.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:01:43.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:01:43.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:01:43.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:01:43.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:01:43.861 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:01:44.067 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:01:44.405 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:01:44.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:01:44.508 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:01:44.508 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:01:44.656 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:01:44.656 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:02:14.669 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:02:14.669 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:02:14.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:02:14.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:02:14.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:02:15.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:02:15.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:02:15.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:02:15.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:02:15.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:02:15.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:02:15.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:02:15.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:02:17.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:02:17.843 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:02:17.844 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:02:17.844 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:02:17.855 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:02:17.868 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:02:17.868 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:02:17.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:02:17.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:02:17.870 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:02:17.870 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:02:17.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:02:18.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:02:18.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:02:18.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:02:18.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:02:18.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:02:18.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:02:18.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:02:18.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:02:18.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:02:18.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:02:18.223 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:02:18.297 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:02:09
2026-06-03T14:02:18.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86210, datetime.datetime(2026, 6, 3, 14, 2, 9), datetime.datetime(2026, 6, 3, 14, 2, 8), 'salt', 7.37, 99.88, None, 29.29, 104.73, 0.01, 821.87, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:02:18.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:02:18.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:02:18.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:02:08, diff=10.304701s, valid=True
2026-06-03T14:02:18.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:02:18.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:02:18.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:02:12, diff=6.308188s, valid=True
2026-06-03T14:02:18.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:02:18.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:02:18.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:02:08, diff=10.316412s, valid=True
2026-06-03T14:02:18.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:02:18.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:02:18.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:02:18.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:02:18.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:02:18.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:02:18.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:02:12, diff=6.320152s, valid=True
2026-06-03T14:02:18.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:02:18.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:02:18.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:02:18.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62335.320972s, valid=False
2026-06-03T14:02:18.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:02:18.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:02:18.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:02:18.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:02:18.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:02:18.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:02:18.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:02:18.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:02:18.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:02:18.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:02:18.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:02:18.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:02:18.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:02:18.640 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:02:18.867 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:02:19.217 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:02:19.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:02:19.321 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:02:19.321 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:02:19.492 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:02:19.492 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:02:49.503 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:02:49.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:02:49.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:02:49.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:02:49.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:02:49.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:02:49.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:02:49.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:02:49.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:02:49.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:02:49.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:02:49.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:02:49.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:02:52.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:02:52.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:02:52.681 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:02:52.681 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:02:52.691 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:02:52.704 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:02:52.704 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:02:52.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:02:52.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:02:52.705 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:02:52.706 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:02:52.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:02:52.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:02:52.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:02:52.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:02:52.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:02:53.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:02:53.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:02:53.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:02:53.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:02:53.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:02:53.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:02:53.048 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:02:53.130 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:02:39
2026-06-03T14:02:53.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86211, datetime.datetime(2026, 6, 3, 14, 2, 39), datetime.datetime(2026, 6, 3, 14, 2, 38), 'salt', 7.27, 99.78, None, 31.76, 107.95, 0.03, 821.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T14:02:53.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:02:53.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:02:53.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:02:38, diff=15.137815s, valid=True
2026-06-03T14:02:53.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:02:53.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:02:53.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:03:12, diff=-18.858732s, valid=True
2026-06-03T14:02:53.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:02:53.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:02:53.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:02:38, diff=15.149402s, valid=True
2026-06-03T14:02:53.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:02:53.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:02:53.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:02:53.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:02:53.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:02:53.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:02:53.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:03:12, diff=-18.846853s, valid=True
2026-06-03T14:02:53.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:02:53.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:02:53.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:02:53.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62370.153963s, valid=False
2026-06-03T14:02:53.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:02:53.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:02:53.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:02:53.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:02:53.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:02:53.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:02:53.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:02:53.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:02:53.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:02:53.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:02:53.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:02:53.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:02:53.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:02:53.473 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:02:53.678 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:02:54.017 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:02:54.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:02:54.119 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:02:54.119 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:02:54.275 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:02:54.275 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:03:24.290 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:03:24.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:03:24.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:03:24.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:03:24.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:03:24.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:03:24.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:03:24.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:03:24.849 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:03:24.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:03:24.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:03:24.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:03:24.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:03:27.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:03:27.694 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:03:27.695 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:03:27.695 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:03:27.705 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:03:27.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:03:27.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:03:27.722 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:03:27.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:03:27.723 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:03:27.723 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:03:27.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:03:27.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:03:27.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:03:27.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:03:27.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:03:28.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:03:28.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:03:28.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:03:28.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:03:28.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:03:28.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:03:28.049 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:03:28.122 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:03:09
2026-06-03T14:03:28.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86212, datetime.datetime(2026, 6, 3, 14, 3, 9), datetime.datetime(2026, 6, 3, 14, 3, 9), 'salt', 7.27, 99.84, None, 29.99, 102.24, 0.02, 821.62, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T14:03:28.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:03:28.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:03:28.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:03:09, diff=19.129473s, valid=True
2026-06-03T14:03:28.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:03:28.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:03:28.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:03:12, diff=16.132999s, valid=True
2026-06-03T14:03:28.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:03:28.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:03:28.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:03:09, diff=19.141226s, valid=True
2026-06-03T14:03:28.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:03:28.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:03:28.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:03:28.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:03:28.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:03:28.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:03:28.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:03:12, diff=16.144953s, valid=True
2026-06-03T14:03:28.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:03:28.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:03:28.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:03:28.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62405.145791s, valid=False
2026-06-03T14:03:28.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:03:28.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:03:28.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:03:28.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:03:28.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:03:28.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:03:28.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:03:28.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:03:28.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:03:28.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:03:28.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:03:28.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:03:28.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:03:28.472 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:03:28.678 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:03:29.021 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:03:29.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:03:29.182 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:03:29.182 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:03:29.255 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:03:29.255 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:03:59.255 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:03:59.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:03:59.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:03:59.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:03:59.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:03:59.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:03:59.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:03:59.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:03:59.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:04:00.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:04:00.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:04:00.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:04:00.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:04:02.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:04:02.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:04:02.815 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:04:02.815 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:04:02.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:04:02.838 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:04:02.838 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:04:02.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:04:02.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:04:02.839 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:04:02.840 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:04:02.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:04:02.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:04:02.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:04:03.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:04:03.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:04:03.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:04:03.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:04:03.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:04:03.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:04:03.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:04:03.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:04:03.201 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:04:03.269 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:03:40
2026-06-03T14:04:03.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86213, datetime.datetime(2026, 6, 3, 14, 3, 40), datetime.datetime(2026, 6, 3, 14, 3, 39), 'salt', 7.3, 99.88, None, 35.14, 104.45, 0.01, 821.69, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T14:04:03.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:04:03.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:04:03.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:03:39, diff=24.276827s, valid=True
2026-06-03T14:04:03.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:04:03.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:04:03.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:04:12, diff=-8.719546s, valid=True
2026-06-03T14:04:03.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:04:03.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:04:03.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:03:39, diff=24.28899s, valid=True
2026-06-03T14:04:03.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:04:03.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:04:03.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:04:03.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:04:03.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:04:03.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:04:03.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:04:12, diff=-8.707071s, valid=True
2026-06-03T14:04:03.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:04:03.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:04:03.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:04:03.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62440.293797s, valid=False
2026-06-03T14:04:03.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:04:03.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:04:03.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:04:03.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:04:03.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:04:03.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:04:03.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:04:03.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:04:03.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:04:03.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:04:03.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:04:03.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:04:03.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:04:03.611 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:04:03.835 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:04:04.176 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:04:04.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:04:04.278 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:04:04.278 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:04:04.436 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:04:04.436 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:04:34.466 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:04:34.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:04:34.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:04:34.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:04:34.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:04:35.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:04:35.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:04:35.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:04:35.212 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:04:35.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:04:35.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:04:35.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:04:35.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:04:37.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:04:37.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:04:37.996 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:04:37.996 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:04:38.006 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:04:38.019 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:04:38.019 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:04:38.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:04:38.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:04:38.021 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:04:38.021 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:04:38.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:04:38.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:04:38.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:04:38.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:04:38.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:04:38.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:04:38.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:04:38.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:04:38.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:04:38.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:04:38.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:04:38.355 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:04:38.423 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:04:10
2026-06-03T14:04:38.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86214, datetime.datetime(2026, 6, 3, 14, 4, 10), datetime.datetime(2026, 6, 3, 14, 4, 9), 'salt', 7.24, 99.84, None, 28.9, 104.15, 0.02, 821.81, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T14:04:38.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:04:38.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:04:38.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:04:09, diff=29.430872s, valid=True
2026-06-03T14:04:38.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:04:38.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:04:38.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:04:12, diff=26.434115s, valid=True
2026-06-03T14:04:38.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:04:38.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:04:38.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:04:09, diff=29.441167s, valid=True
2026-06-03T14:04:38.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:04:38.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:04:38.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:04:38.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:04:38.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:04:38.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:04:38.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:04:12, diff=26.444283s, valid=True
2026-06-03T14:04:38.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:04:38.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:04:38.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:04:38.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62475.444947s, valid=False
2026-06-03T14:04:38.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:04:38.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:04:38.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:04:38.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:04:38.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:04:38.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:04:38.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:04:38.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:04:38.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:04:38.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:04:38.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:04:38.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:04:38.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:04:38.757 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:04:39.034 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:04:39.371 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:04:39.473 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:04:39.474 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:04:39.474 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:04:39.845 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:04:39.845 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:05:09.875 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:05:09.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:05:09.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:05:10.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:05:10.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:05:10.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:05:10.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:05:10.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:05:10.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:05:10.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:05:10.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:05:10.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:05:10.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:05:13.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:05:13.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:05:13.497 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:05:13.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:05:13.508 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:05:13.521 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:05:13.521 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:05:13.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:05:13.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:05:13.523 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:05:13.523 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:05:13.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:05:13.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:05:13.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:05:13.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:05:13.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:05:13.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:05:13.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:05:13.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:05:13.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:05:13.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:05:13.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:05:13.861 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:05:13.935 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:05:10
2026-06-03T14:05:13.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86216, datetime.datetime(2026, 6, 3, 14, 5, 10), datetime.datetime(2026, 6, 3, 14, 5, 10), 'salt', 7.27, 99.81, None, 33.52, 102.22, 0.02, 821.62, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:05:13.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:05:13.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:05:13.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:05:10, diff=3.942867s, valid=True
2026-06-03T14:05:13.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:05:13.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:05:13.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:05:12, diff=1.946374s, valid=True
2026-06-03T14:05:13.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:05:13.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:05:13.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:05:10, diff=3.954633s, valid=True
2026-06-03T14:05:13.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:05:13.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:05:13.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:05:13.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:05:13.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:05:13.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:05:13.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:05:12, diff=1.958367s, valid=True
2026-06-03T14:05:13.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:05:13.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:05:13.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:05:13.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62510.959208s, valid=False
2026-06-03T14:05:13.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:05:13.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:05:13.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:05:13.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:05:13.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:05:14.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:05:14.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:05:14.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:05:14.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:05:14.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:05:14.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:05:14.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:05:14.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:05:14.281 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:05:14.487 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:05:14.828 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:05:14.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:05:14.932 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:05:14.932 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:05:15.083 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:05:15.083 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:05:45.093 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:05:45.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:05:45.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:05:45.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:05:45.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:05:45.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:05:45.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:05:45.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:05:45.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:05:45.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:05:45.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:05:45.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:05:45.485 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:05:48.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:05:48.135 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:05:48.135 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:05:48.135 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:05:48.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:05:48.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:05:48.154 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:05:48.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:05:48.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:05:48.155 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:05:48.155 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:05:48.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:05:48.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:05:48.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:05:48.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:05:48.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:05:48.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:05:48.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:05:48.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:05:48.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:05:48.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:05:48.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:05:48.432 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:05:48.505 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:05:41
2026-06-03T14:05:48.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86217, datetime.datetime(2026, 6, 3, 14, 5, 41), datetime.datetime(2026, 6, 3, 14, 5, 40), 'salt', 7.2, 99.84, None, 34.4, 108.7, 0.01, 821.69, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:05:48.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:05:48.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:05:48.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:05:40, diff=8.512351s, valid=True
2026-06-03T14:05:48.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:05:48.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:05:48.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:06:12, diff=-23.484387s, valid=True
2026-06-03T14:05:48.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:05:48.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:05:48.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:05:40, diff=8.523211s, valid=True
2026-06-03T14:05:48.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:05:48.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:05:48.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:05:48.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:05:48.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:05:48.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:05:48.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:06:12, diff=-23.473333s, valid=True
2026-06-03T14:05:48.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:05:48.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:05:48.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:05:48.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62545.527419s, valid=False
2026-06-03T14:05:48.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:05:48.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:05:48.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:05:48.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:05:48.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:05:48.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:05:48.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:05:48.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:05:48.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:05:48.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:05:48.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:05:48.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:05:48.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:05:48.917 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:05:49.123 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:05:49.464 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:05:49.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:05:49.567 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:05:49.567 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:05:49.795 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:05:49.795 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:06:19.806 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:06:19.806 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:06:19.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:06:19.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:06:19.926 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:06:20.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:06:20.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:06:20.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:06:20.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:06:20.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:06:20.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:06:20.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:06:20.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:06:23.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:06:23.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:06:23.094 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:06:23.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:06:23.105 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:06:23.118 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:06:23.119 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:06:23.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:06:23.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:06:23.120 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:06:23.120 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:06:23.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:06:23.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:06:23.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:06:23.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:06:23.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:06:23.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:06:23.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:06:23.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:06:23.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:06:23.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:06:23.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:06:23.439 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:06:23.510 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:06:11
2026-06-03T14:06:23.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86218, datetime.datetime(2026, 6, 3, 14, 6, 11), datetime.datetime(2026, 6, 3, 14, 6, 10), 'salt', 7.14, 99.78, None, 33.38, 104.08, 0.03, 821.69, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T14:06:23.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:06:23.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:06:23.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:06:10, diff=13.517211s, valid=True
2026-06-03T14:06:23.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:06:23.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:06:23.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:06:12, diff=11.520646s, valid=True
2026-06-03T14:06:23.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:06:23.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:06:23.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:06:10, diff=13.528944s, valid=True
2026-06-03T14:06:23.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:06:23.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:06:23.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:06:23.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:06:23.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:06:23.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:06:23.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:06:12, diff=11.532561s, valid=True
2026-06-03T14:06:23.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:06:23.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:06:23.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:06:23.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62580.533356s, valid=False
2026-06-03T14:06:23.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:06:23.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:06:23.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:06:23.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:06:23.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:06:23.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:06:23.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:06:23.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:06:23.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:06:23.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:06:23.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:06:23.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:06:23.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:06:23.861 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:06:24.069 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:06:24.427 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:06:24.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:06:24.531 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:06:24.531 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:06:24.740 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:06:24.741 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:06:54.763 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:06:54.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:06:54.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:06:54.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:06:54.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:06:55.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:06:55.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:06:55.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:06:55.147 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:06:55.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:06:55.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:06:55.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:06:55.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:06:57.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:06:57.792 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:06:57.793 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:06:57.793 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:06:57.802 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:06:57.815 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:06:57.816 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:06:57.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:06:57.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:06:57.817 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:06:57.817 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:06:57.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:06:57.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:06:57.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:06:58.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:06:58.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:06:58.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:06:58.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:06:58.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:06:58.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:06:58.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:06:58.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:06:58.150 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:06:58.223 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:06:41
2026-06-03T14:06:58.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86219, datetime.datetime(2026, 6, 3, 14, 6, 41), datetime.datetime(2026, 6, 3, 14, 6, 40), 'salt', 7.2, 99.88, None, 34.26, 102.85, 0.01, 821.62, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T14:06:58.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:06:58.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:06:58.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:06:40, diff=18.230485s, valid=True
2026-06-03T14:06:58.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:06:58.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:06:58.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:07:12, diff=-13.766147s, valid=True
2026-06-03T14:06:58.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:06:58.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:06:58.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:06:40, diff=18.24178s, valid=True
2026-06-03T14:06:58.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:06:58.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:06:58.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:06:58.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:06:58.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:06:58.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:06:58.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:07:12, diff=-13.754666s, valid=True
2026-06-03T14:06:58.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:06:58.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:06:58.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:06:58.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62615.246132s, valid=False
2026-06-03T14:06:58.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:06:58.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:06:58.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:06:58.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:06:58.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:06:58.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:06:58.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:06:58.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:06:58.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:06:58.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:06:58.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:06:58.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:06:58.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:06:58.634 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:06:58.846 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:06:59.188 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:06:59.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:06:59.292 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:06:59.292 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:06:59.436 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:06:59.436 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:07:29.454 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:07:29.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:07:29.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:07:29.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:07:29.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:07:29.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:07:29.849 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:07:29.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:07:29.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:07:29.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:07:29.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:07:29.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:07:29.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:07:32.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:07:32.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:07:32.506 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:07:32.506 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:07:32.517 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:07:32.530 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:07:32.530 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:07:32.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:07:32.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:07:32.532 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:07:32.532 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:07:32.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:07:32.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:07:32.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:07:32.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:07:32.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:07:32.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:07:32.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:07:32.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:07:32.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:07:32.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:07:32.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:07:32.865 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:07:32.939 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:07:11
2026-06-03T14:07:32.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86220, datetime.datetime(2026, 6, 3, 14, 7, 11), datetime.datetime(2026, 6, 3, 14, 7, 11), 'salt', 7.17, 99.81, None, 34.47, 96.61, 0.02, 821.62, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T14:07:32.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:07:32.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:07:32.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:07:11, diff=21.946817s, valid=True
2026-06-03T14:07:32.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:07:32.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:07:32.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:07:12, diff=20.950253s, valid=True
2026-06-03T14:07:32.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:07:32.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:07:32.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:07:10, diff=22.958421s, valid=True
2026-06-03T14:07:32.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:07:32.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:07:32.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:07:32.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:07:32.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:07:32.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:07:32.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:07:12, diff=20.962118s, valid=True
2026-06-03T14:07:32.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:07:32.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:07:32.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:07:32.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62649.962935s, valid=False
2026-06-03T14:07:32.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:07:32.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:07:32.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:07:32.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:07:32.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:07:33.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:07:33.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:07:33.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:07:33.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:07:33.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:07:33.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:07:33.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:07:33.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:07:33.284 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:07:33.492 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:07:33.833 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:07:33.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:07:33.937 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:07:33.937 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:07:34.158 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:07:34.158 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:08:04.172 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:08:04.173 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:08:04.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:08:04.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:08:04.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:08:04.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:08:04.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:08:04.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:08:04.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:08:04.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:08:04.587 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:08:04.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:08:04.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:08:07.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:08:07.151 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:08:07.152 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:08:07.152 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:08:07.163 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:08:07.176 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:08:07.177 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:08:07.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:08:07.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:08:07.178 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:08:07.178 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:08:07.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:08:07.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:08:07.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:08:07.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:08:07.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:08:07.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:08:07.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:08:07.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:08:07.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:08:07.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:08:07.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:08:07.514 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:08:07.586 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:07:42
2026-06-03T14:08:07.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86221, datetime.datetime(2026, 6, 3, 14, 7, 42), datetime.datetime(2026, 6, 3, 14, 7, 41), 'salt', 7.24, 99.88, None, 34.51, 102.43, 0.01, 821.62, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T14:08:07.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:08:07.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:08:07.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:07:41, diff=26.59385s, valid=True
2026-06-03T14:08:07.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:08:07.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:08:07.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:08:12, diff=-4.402784s, valid=True
2026-06-03T14:08:07.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:08:07.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:08:07.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:07:41, diff=26.605144s, valid=True
2026-06-03T14:08:07.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:08:07.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:08:07.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:08:07.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:08:07.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:08:07.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:08:07.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:08:12, diff=-4.391302s, valid=True
2026-06-03T14:08:07.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:08:07.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:08:07.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:08:07.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62684.609464s, valid=False
2026-06-03T14:08:07.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:08:07.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:08:07.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:08:07.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:08:07.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:08:07.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:08:07.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:08:07.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:08:07.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:08:07.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:08:07.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:08:07.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:08:07.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:08:07.998 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:08:08.206 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:08:08.544 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:08:08.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:08:08.649 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:08:08.649 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:08:08.836 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:08:08.837 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:08:38.867 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:08:38.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:08:38.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:08:39.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:08:39.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:08:39.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:08:39.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:08:39.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:08:39.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:08:39.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:08:39.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:08:39.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:08:39.444 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:08:42.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:08:42.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:08:42.158 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:08:42.159 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:08:42.169 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:08:42.182 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:08:42.182 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:08:42.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:08:42.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:08:42.184 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:08:42.184 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:08:42.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:08:42.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:08:42.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:08:42.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:08:42.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:08:42.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:08:42.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:08:42.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:08:42.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:08:42.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:08:42.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:08:42.509 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:08:42.582 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:08:12
2026-06-03T14:08:42.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86222, datetime.datetime(2026, 6, 3, 14, 8, 12), datetime.datetime(2026, 6, 3, 14, 8, 11), 'salt', 7.17, 99.84, None, 31.86, 105.25, 0.02, 821.62, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:08:42.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:08:42.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:08:42.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:08:11, diff=31.589694s, valid=True
2026-06-03T14:08:42.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:08:42.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:08:42.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:08:12, diff=30.593211s, valid=True
2026-06-03T14:08:42.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:08:42.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:08:42.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:08:11, diff=31.602743s, valid=True
2026-06-03T14:08:42.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:08:42.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:08:42.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:08:42.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:08:42.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:08:42.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:08:42.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:08:12, diff=30.606563s, valid=True
2026-06-03T14:08:42.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:08:42.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:08:42.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:08:42.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62719.607396s, valid=False
2026-06-03T14:08:42.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:08:42.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:08:42.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:08:42.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:08:42.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:08:42.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:08:42.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:08:42.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:08:42.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:08:42.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:08:42.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:08:42.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:08:42.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:08:42.928 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:08:43.136 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:08:43.476 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:08:43.579 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:08:43.579 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:08:43.579 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:08:43.651 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:08:43.651 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:09:13.681 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:09:13.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:09:13.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:09:13.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:09:13.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:09:14.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:09:14.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:09:14.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:09:14.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:09:14.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:09:14.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:09:14.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:09:14.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:09:16.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:09:16.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:09:16.828 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:09:16.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:09:16.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:09:16.851 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:09:16.852 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:09:16.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:09:16.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:09:16.853 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:09:16.853 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:09:16.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:09:16.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:09:16.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:09:17.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:09:17.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:09:17.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:09:17.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:09:17.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:09:17.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:09:17.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:09:17.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:09:17.197 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:09:17.267 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:09:13
2026-06-03T14:09:17.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86224, datetime.datetime(2026, 6, 3, 14, 9, 13), datetime.datetime(2026, 6, 3, 14, 9, 12), 'salt', 7.2, 99.88, None, 32.11, 99.54, 0.01, 821.81, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T14:09:17.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:09:17.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:09:17.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:09:12, diff=5.275195s, valid=True
2026-06-03T14:09:17.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:09:17.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:09:17.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:09:12, diff=5.278639s, valid=True
2026-06-03T14:09:17.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:09:17.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:09:17.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:09:11, diff=6.286785s, valid=True
2026-06-03T14:09:17.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:09:17.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:09:17.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:09:17.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:09:17.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:09:17.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:09:17.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:09:12, diff=5.290484s, valid=True
2026-06-03T14:09:17.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:09:17.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:09:17.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:09:17.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62754.291312s, valid=False
2026-06-03T14:09:17.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:09:17.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:09:17.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:09:17.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:09:17.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:09:17.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:09:17.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:09:17.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:09:17.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:09:17.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:09:17.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:09:17.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:09:17.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:09:17.613 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:09:17.820 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:09:18.162 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:09:18.266 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:09:18.266 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:09:18.266 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:09:18.500 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:09:18.501 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:09:48.531 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:09:48.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:09:48.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:09:48.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:09:48.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:09:48.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:09:48.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:09:48.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:09:48.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:09:48.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:09:48.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:09:48.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:09:48.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:09:51.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:09:51.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:09:51.613 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:09:51.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:09:51.624 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:09:51.637 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:09:51.637 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:09:51.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:09:51.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:09:51.638 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:09:51.639 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:09:51.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:09:51.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:09:51.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:09:51.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:09:51.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:09:51.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:09:51.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:09:51.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:09:51.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:09:51.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:09:51.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:09:51.995 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:09:52.081 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:09:43
2026-06-03T14:09:52.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86225, datetime.datetime(2026, 6, 3, 14, 9, 43), datetime.datetime(2026, 6, 3, 14, 9, 42), 'salt', 7.2, 99.91, None, 34.86, 104.1, 0.0, 821.81, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T14:09:52.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:09:52.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:09:52.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:09:42, diff=10.08879s, valid=True
2026-06-03T14:09:52.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:09:52.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:09:52.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:10:12, diff=-19.907682s, valid=True
2026-06-03T14:09:52.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:09:52.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:09:52.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:09:42, diff=10.100708s, valid=True
2026-06-03T14:09:52.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:09:52.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:09:52.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:09:52.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:09:52.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:09:52.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:09:52.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:10:12, diff=-19.895526s, valid=True
2026-06-03T14:09:52.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:09:52.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:09:52.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:09:52.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62789.10528s, valid=False
2026-06-03T14:09:52.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:09:52.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:09:52.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:09:52.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:09:52.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:09:52.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:09:52.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:09:52.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:09:52.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:09:52.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:09:52.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:09:52.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:09:52.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:09:52.429 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:09:52.636 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:09:53.038 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:09:53.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:09:53.141 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:09:53.142 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:09:53.366 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:09:53.366 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:10:23.372 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:10:23.372 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:10:23.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:10:23.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:10:23.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:10:23.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:10:23.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:10:23.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:10:23.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:10:23.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:10:23.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:10:23.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:10:23.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:10:26.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:10:26.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:10:26.469 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:10:26.469 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:10:26.480 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:10:26.492 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:10:26.493 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:10:26.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:10:26.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:10:26.494 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:10:26.494 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:10:26.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:10:26.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:10:26.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:10:26.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:10:26.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:10:26.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:10:26.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:10:26.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:10:26.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:10:26.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:10:26.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:10:26.844 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:10:26.929 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:10:13
2026-06-03T14:10:26.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86226, datetime.datetime(2026, 6, 3, 14, 10, 13), datetime.datetime(2026, 6, 3, 14, 10, 12), 'salt', 7.2, 99.84, None, 33.91, 99.17, 0.01, 821.56, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T14:10:26.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:10:26.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:10:26.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:10:12, diff=14.937127s, valid=True
2026-06-03T14:10:26.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:10:26.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:10:26.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:10:12, diff=14.940598s, valid=True
2026-06-03T14:10:26.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:10:26.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:10:26.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:10:12, diff=14.948844s, valid=True
2026-06-03T14:10:26.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:10:26.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:10:26.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:10:26.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:10:26.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:10:26.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:10:26.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:10:12, diff=14.952544s, valid=True
2026-06-03T14:10:26.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:10:26.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:10:26.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:10:26.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62823.953355s, valid=False
2026-06-03T14:10:26.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:10:26.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:10:26.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:10:26.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:10:26.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:10:27.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:10:27.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:10:27.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:10:27.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:10:27.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:10:27.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:10:27.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:10:27.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:10:27.274 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:10:27.479 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:10:27.817 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:10:27.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:10:27.920 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:10:27.920 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:10:27.991 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:10:27.991 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:10:58.022 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:10:58.022 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:10:58.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:10:58.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:10:58.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:10:58.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:10:58.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:10:58.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:10:58.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:10:58.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:10:58.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:10:58.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:10:58.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:11:01.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:11:01.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:11:01.129 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:11:01.129 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:11:01.140 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:11:01.153 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:11:01.154 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:11:01.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:11:01.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:11:01.155 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:11:01.155 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:11:01.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:11:01.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:11:01.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:11:01.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:11:01.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:11:01.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:11:01.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:11:01.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:11:01.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:11:01.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:11:01.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:11:01.477 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:11:01.546 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:10:43
2026-06-03T14:11:01.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86227, datetime.datetime(2026, 6, 3, 14, 10, 43), datetime.datetime(2026, 6, 3, 14, 10, 43), 'salt', 7.14, 99.94, None, 31.16, 100.3, 0.0, 821.56, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T14:11:01.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:11:01.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:11:01.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:10:43, diff=18.55272s, valid=True
2026-06-03T14:11:01.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:11:01.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:11:01.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:11:12, diff=-10.44424s, valid=True
2026-06-03T14:11:01.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:11:01.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:11:01.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:10:42, diff=19.562919s, valid=True
2026-06-03T14:11:01.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:11:01.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:11:01.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:11:01.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:11:01.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:11:01.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:11:01.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:11:12, diff=-10.433857s, valid=True
2026-06-03T14:11:01.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:11:01.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:11:01.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:11:01.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62858.566854s, valid=False
2026-06-03T14:11:01.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:11:01.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:11:01.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:11:01.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:11:01.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:11:01.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:11:01.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:11:01.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:11:01.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:11:01.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:11:01.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:11:01.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:11:01.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:11:01.885 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:11:02.165 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:11:02.508 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:11:02.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:11:02.610 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:11:02.610 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:11:02.763 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:11:02.763 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:11:32.793 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:11:32.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:11:32.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:11:33.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:11:33.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:11:33.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:11:33.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:11:33.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:11:33.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:11:33.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:11:33.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:11:33.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:11:33.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:11:36.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:11:36.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:11:36.045 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:11:36.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:11:36.055 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:11:36.068 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:11:36.068 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:11:36.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:11:36.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:11:36.069 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:11:36.070 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:11:36.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:11:36.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:11:36.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:11:36.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:11:36.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:11:36.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:11:36.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:11:36.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:11:36.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:11:36.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:11:36.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:11:36.404 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:11:36.475 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:11:14
2026-06-03T14:11:36.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86228, datetime.datetime(2026, 6, 3, 14, 11, 14), datetime.datetime(2026, 6, 3, 14, 11, 13), 'salt', 7.14, 99.84, None, 30.24, 100.74, 0.02, 821.62, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:11:36.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:11:36.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:11:36.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:11:13, diff=23.486187s, valid=True
2026-06-03T14:11:36.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:11:36.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:11:36.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:11:12, diff=24.489693s, valid=True
2026-06-03T14:11:36.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:11:36.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:11:36.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:11:12, diff=24.497806s, valid=True
2026-06-03T14:11:36.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:11:36.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:11:36.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:11:36.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:11:36.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:11:36.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:11:36.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:11:12, diff=24.501579s, valid=True
2026-06-03T14:11:36.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:11:36.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:11:36.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:11:36.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62893.502394s, valid=False
2026-06-03T14:11:36.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:11:36.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:11:36.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:11:36.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:11:36.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:11:36.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:11:36.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:11:36.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:11:36.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:11:36.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:11:36.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:11:36.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:11:36.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:11:36.825 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:11:37.057 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:11:37.417 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:11:37.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:11:37.522 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:11:37.522 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:11:37.692 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:11:37.693 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:12:07.706 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:12:07.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:12:07.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:12:08.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:12:08.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:12:08.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:12:08.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:12:08.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:12:08.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:12:08.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:12:08.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:12:08.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:12:08.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:12:11.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:12:11.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:12:11.153 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:12:11.153 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:12:11.164 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:12:11.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:12:11.180 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:12:11.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:12:11.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:12:11.181 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:12:11.181 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:12:11.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:12:11.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:12:11.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:12:11.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:12:11.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:12:11.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:12:11.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:12:11.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:12:11.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:12:11.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:12:11.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:12:11.528 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:12:11.599 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:11:44
2026-06-03T14:12:11.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86229, datetime.datetime(2026, 6, 3, 14, 11, 44), datetime.datetime(2026, 6, 3, 14, 11, 43), 'salt', 7.34, 99.91, None, 34.9, 101.87, 0.01, 821.75, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:12:11.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:12:11.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:12:11.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:11:43, diff=28.606921s, valid=True
2026-06-03T14:12:11.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:12:11.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:12:11.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:12:12, diff=-0.389611s, valid=True
2026-06-03T14:12:11.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:12:11.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:12:11.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:11:43, diff=28.618529s, valid=True
2026-06-03T14:12:11.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:12:11.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:12:11.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:12:11.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:12:11.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:12:11.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:12:11.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:12:12, diff=-0.377696s, valid=True
2026-06-03T14:12:11.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:12:11.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:12:11.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:12:11.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62928.623131s, valid=False
2026-06-03T14:12:11.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:12:11.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:12:11.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:12:11.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:12:11.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:12:11.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:12:11.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:12:11.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:12:11.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:12:11.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:12:11.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:12:11.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:12:11.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:12:12.022 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:12:12.228 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:12:12.568 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:12:12.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:12:12.670 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:12:12.670 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:12:12.807 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:12:12.807 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:12:42.820 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:12:42.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:12:42.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:12:43.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:12:43.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:12:43.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:12:43.363 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:12:43.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:12:43.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:12:43.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:12:43.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:12:43.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:12:43.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:12:46.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:12:46.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:12:46.063 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:12:46.063 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:12:46.075 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:12:46.087 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:12:46.088 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:12:46.088 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:12:46.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:12:46.089 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:12:46.089 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:12:46.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:12:46.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:12:46.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:12:46.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:12:46.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:12:46.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:12:46.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:12:46.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:12:46.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:12:46.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:12:46.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:12:46.436 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:12:46.518 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:12:44
2026-06-03T14:12:46.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86231, datetime.datetime(2026, 6, 3, 14, 12, 44), datetime.datetime(2026, 6, 3, 14, 12, 44), 'salt', 7.44, 99.91, None, 30.91, 106.02, 0.01, 821.81, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:12:46.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:12:46.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:12:46.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:12:44, diff=2.526002s, valid=True
2026-06-03T14:12:46.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:12:46.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:12:46.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:13:12, diff=-25.470467s, valid=True
2026-06-03T14:12:46.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:12:46.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:12:46.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:12:43, diff=3.537983s, valid=True
2026-06-03T14:12:46.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:12:46.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:12:46.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:12:46.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:12:46.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:12:46.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:12:46.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:13:12, diff=-25.458259s, valid=True
2026-06-03T14:12:46.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:12:46.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:12:46.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:12:46.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62963.542553s, valid=False
2026-06-03T14:12:46.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:12:46.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:12:46.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:12:46.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:12:46.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:12:46.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:12:46.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:12:46.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:12:46.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:12:46.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:12:46.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:12:46.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:12:46.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:12:46.864 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:12:47.074 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:12:47.417 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:12:47.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:12:47.524 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:12:47.524 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:12:47.698 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:12:47.698 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:13:17.701 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:13:17.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:13:17.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:13:17.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:13:17.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:13:18.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:13:18.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:13:18.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:13:18.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:13:18.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:13:18.120 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:13:18.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:13:18.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:13:20.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:13:20.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:13:20.524 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:13:20.525 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:13:20.535 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:13:20.547 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:13:20.548 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:13:20.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:13:20.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:13:20.549 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:13:20.549 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:13:20.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:13:20.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:13:20.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:13:20.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:13:20.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:13:20.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:13:20.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:13:20.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:13:20.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:13:20.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:13:20.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:13:20.904 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:13:20.980 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:13:14
2026-06-03T14:13:20.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86232, datetime.datetime(2026, 6, 3, 14, 13, 14), datetime.datetime(2026, 6, 3, 14, 13, 14), 'salt', 7.34, 99.81, None, 34.54, 103.18, 0.02, 821.5, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:13:20.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:13:20.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:13:20.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:13:14, diff=6.988585s, valid=True
2026-06-03T14:13:20.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:13:20.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:13:20.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:13:12, diff=8.992166s, valid=True
2026-06-03T14:13:20.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:13:20.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:13:21.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:13:13, diff=8.00046s, valid=True
2026-06-03T14:13:21.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:13:21.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:13:21.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:13:21.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:13:21.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:13:21.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:13:21.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:13:12, diff=9.004233s, valid=True
2026-06-03T14:13:21.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:13:21.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:13:21.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:13:21.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=62998.005077s, valid=False
2026-06-03T14:13:21.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:13:21.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:13:21.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:13:21.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:13:21.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:13:21.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:13:21.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:13:21.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:13:21.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:13:21.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:13:21.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:13:21.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:13:21.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:13:21.394 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:13:21.599 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:13:21.941 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:13:22.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:13:22.044 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:13:22.044 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:13:22.252 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:13:22.252 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:13:52.282 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:13:52.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:13:52.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:13:52.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:13:52.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:13:52.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:13:52.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:13:52.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:13:52.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:13:52.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:13:52.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:13:52.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:13:52.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:13:55.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:13:55.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:13:55.118 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:13:55.118 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:13:55.128 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:13:55.144 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:13:55.145 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:13:55.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:13:55.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:13:55.146 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:13:55.146 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:13:55.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:13:55.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:13:55.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:13:55.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:13:55.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:13:55.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:13:55.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:13:55.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:13:55.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:13:55.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:13:55.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:13:55.502 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:13:55.575 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:13:45
2026-06-03T14:13:55.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86233, datetime.datetime(2026, 6, 3, 14, 13, 45), datetime.datetime(2026, 6, 3, 14, 13, 44), 'salt', 7.27, 99.78, None, 32.81, 98.25, 0.03, 821.44, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:13:55.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:13:55.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:13:55.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:13:44, diff=11.582325s, valid=True
2026-06-03T14:13:55.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:13:55.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:13:55.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:14:12, diff=-16.414176s, valid=True
2026-06-03T14:13:55.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:13:55.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:13:55.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:13:44, diff=11.594271s, valid=True
2026-06-03T14:13:55.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:13:55.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:13:55.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:13:55.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:13:55.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:13:55.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:13:55.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:14:12, diff=-16.401984s, valid=True
2026-06-03T14:13:55.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:13:55.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:13:55.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:13:55.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63032.598847s, valid=False
2026-06-03T14:13:55.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:13:55.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:13:55.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:13:55.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:13:55.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:13:55.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:13:55.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:13:55.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:13:55.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:13:55.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:13:55.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:13:55.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:13:55.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:13:55.919 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:13:56.126 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:13:56.467 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:13:56.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:13:56.569 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:13:56.569 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:13:56.777 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:13:56.777 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:14:26.787 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:14:26.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:14:26.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:14:26.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:14:26.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:14:27.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:14:27.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:14:27.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:14:27.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:14:27.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:14:27.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:14:27.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:14:27.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:14:29.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:14:29.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:14:29.618 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:14:29.618 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:14:29.629 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:14:29.642 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:14:29.643 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:14:29.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:14:29.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:14:29.644 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:14:29.644 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:14:29.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:14:29.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:14:29.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:14:29.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:14:29.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:14:29.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:14:29.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:14:29.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:14:29.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:14:29.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:14:29.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:14:29.985 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:14:30.057 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:14:15
2026-06-03T14:14:30.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86234, datetime.datetime(2026, 6, 3, 14, 14, 15), datetime.datetime(2026, 6, 3, 14, 14, 14), 'salt', 7.47, 99.84, None, 31.19, 95.88, 0.02, 821.62, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:14:30.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:14:30.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:14:30.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:14:14, diff=16.064611s, valid=True
2026-06-03T14:14:30.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:14:30.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:14:30.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:14:12, diff=18.067637s, valid=True
2026-06-03T14:14:30.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:14:30.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:14:30.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:14:14, diff=16.075188s, valid=True
2026-06-03T14:14:30.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:14:30.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:14:30.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:14:30.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:14:30.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:14:30.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:14:30.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:14:12, diff=18.078564s, valid=True
2026-06-03T14:14:30.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:14:30.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:14:30.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:14:30.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63067.079369s, valid=False
2026-06-03T14:14:30.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:14:30.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:14:30.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:14:30.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:14:30.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:14:30.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:14:30.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:14:30.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:14:30.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:14:30.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:14:30.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:14:30.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:14:30.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:14:30.465 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:14:30.670 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:14:31.014 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:14:31.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:14:31.128 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:14:31.128 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:14:31.314 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:14:31.314 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:15:01.344 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:15:01.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:15:01.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:15:01.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:15:01.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:15:02.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:15:02.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:15:02.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:15:02.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:15:02.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:15:02.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:15:02.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:15:02.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:15:04.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:15:04.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:15:04.355 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:15:04.355 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:15:04.364 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:15:04.376 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:15:04.376 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:15:04.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:15:04.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:15:04.377 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:15:04.377 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:15:04.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:15:04.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:15:04.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:15:04.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:15:04.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:15:04.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:15:04.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:15:04.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:15:04.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:15:04.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:15:04.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:15:04.658 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:15:04.729 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:14:46
2026-06-03T14:15:04.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86235, datetime.datetime(2026, 6, 3, 14, 14, 46), datetime.datetime(2026, 6, 3, 14, 14, 45), 'salt', 7.44, 99.84, None, 33.1, 104.22, 0.02, 821.44, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:15:04.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:15:04.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:15:04.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:14:45, diff=19.73605s, valid=True
2026-06-03T14:15:04.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:15:04.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:15:04.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:15:12, diff=-7.261007s, valid=True
2026-06-03T14:15:04.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:15:04.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:15:04.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:14:44, diff=20.745729s, valid=True
2026-06-03T14:15:04.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:15:04.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:15:04.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:15:04.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:15:04.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:15:04.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:15:04.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:15:12, diff=-7.251176s, valid=True
2026-06-03T14:15:04.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:15:04.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:15:04.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:15:04.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63101.749481s, valid=False
2026-06-03T14:15:04.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:15:04.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:15:04.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:15:04.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:15:04.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:15:04.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:15:04.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:15:04.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:15:04.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:15:04.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:15:04.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:15:04.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:15:05.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:15:05.070 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:15:05.283 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:15:05.634 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:15:05.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:15:05.738 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:15:05.738 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:15:05.992 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:15:05.992 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:15:35.996 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:15:35.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:15:35.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:15:36.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:15:36.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:15:36.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:15:36.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:15:36.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:15:36.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:15:36.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:15:36.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:15:36.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:15:36.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:15:39.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:15:39.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:15:39.040 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:15:39.040 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:15:39.050 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:15:39.063 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:15:39.063 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:15:39.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:15:39.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:15:39.064 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:15:39.065 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:15:39.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:15:39.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:15:39.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:15:39.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:15:39.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:15:39.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:15:39.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:15:39.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:15:39.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:15:39.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:15:39.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:15:39.417 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:15:39.487 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:15:16
2026-06-03T14:15:39.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86236, datetime.datetime(2026, 6, 3, 14, 15, 16), datetime.datetime(2026, 6, 3, 14, 15, 16), 'salt', 7.37, 99.88, None, 33.94, 105.69, 0.01, 821.62, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:15:39.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:15:39.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:15:39.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:15:16, diff=23.494991s, valid=True
2026-06-03T14:15:39.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:15:39.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:15:39.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:15:12, diff=27.498539s, valid=True
2026-06-03T14:15:39.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:15:39.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:15:39.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:15:15, diff=24.507053s, valid=True
2026-06-03T14:15:39.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:15:39.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:15:39.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:15:39.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:15:39.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:15:39.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:15:39.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:15:12, diff=27.510878s, valid=True
2026-06-03T14:15:39.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:15:39.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:15:39.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:15:39.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63136.511709s, valid=False
2026-06-03T14:15:39.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:15:39.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:15:39.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:15:39.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:15:39.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:15:39.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:15:39.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:15:39.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:15:39.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:15:39.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:15:39.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:15:39.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:15:39.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:15:39.833 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:15:40.056 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:15:40.404 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:15:40.506 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:15:40.506 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:15:40.506 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:15:40.694 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:15:40.694 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:16:10.724 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:16:10.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:16:10.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:16:10.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:16:10.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:16:11.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:16:11.052 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:16:11.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:16:11.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:16:11.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:16:11.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:16:11.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:16:11.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:16:13.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:16:13.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:16:13.488 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:16:13.489 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:16:13.499 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:16:13.512 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:16:13.513 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:16:13.513 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:16:13.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:16:13.514 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:16:13.514 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:16:13.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:16:13.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:16:13.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:16:13.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:16:13.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:16:13.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:16:13.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:16:13.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:16:13.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:16:13.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:16:13.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:16:13.847 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:16:13.918 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:15:47
2026-06-03T14:16:13.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86237, datetime.datetime(2026, 6, 3, 14, 15, 47), datetime.datetime(2026, 6, 3, 14, 15, 46), 'salt', 7.2, 99.74, None, 34.72, 91.75, 0.03, 821.62, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:16:13.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:16:13.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:16:13.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:15:46, diff=27.925611s, valid=True
2026-06-03T14:16:13.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:16:13.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:16:13.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:16:12, diff=1.928977s, valid=True
2026-06-03T14:16:13.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:16:13.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:16:13.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:15:45, diff=28.936926s, valid=True
2026-06-03T14:16:13.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:16:13.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:16:13.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:16:13.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:16:13.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:16:13.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:16:13.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:16:12, diff=1.94049s, valid=True
2026-06-03T14:16:13.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:16:13.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:16:13.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:16:13.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63170.941305s, valid=False
2026-06-03T14:16:13.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:16:13.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:16:13.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:16:13.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:16:13.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:16:14.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:16:14.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:16:14.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:16:14.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:16:14.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:16:14.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:16:14.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:16:14.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:16:14.264 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:16:14.486 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:16:14.894 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:16:14.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:16:14.997 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:16:14.997 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:16:15.169 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:16:15.169 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:16:45.170 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:16:45.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:16:45.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:16:45.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:16:45.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:16:45.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:16:45.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:16:45.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:16:45.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:16:45.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:16:45.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:16:45.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:16:45.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:16:47.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:16:47.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:16:47.946 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:16:47.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:16:47.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:16:47.969 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:16:47.969 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:16:47.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:16:47.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:16:47.971 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:16:47.971 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:16:47.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:16:48.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:16:48.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:16:48.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:16:48.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:16:48.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:16:48.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:16:48.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:16:48.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:16:48.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:16:48.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:16:48.303 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:16:48.374 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:16:47
2026-06-03T14:16:48.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86239, datetime.datetime(2026, 6, 3, 14, 16, 47), datetime.datetime(2026, 6, 3, 14, 16, 46), 'salt', 7.34, 99.84, None, 31.76, 110.53, 0.02, 821.5, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:16:48.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:16:48.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:16:48.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:16:46, diff=2.381779s, valid=True
2026-06-03T14:16:48.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:16:48.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:16:48.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:17:12, diff=-23.614979s, valid=True
2026-06-03T14:16:48.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:16:48.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:16:48.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:16:45, diff=3.392572s, valid=True
2026-06-03T14:16:48.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:16:48.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:16:48.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:16:48.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:16:48.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:16:48.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:16:48.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:17:12, diff=-23.603945s, valid=True
2026-06-03T14:16:48.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:16:48.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:16:48.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:16:48.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63205.396823s, valid=False
2026-06-03T14:16:48.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:16:48.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:16:48.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:16:48.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:16:48.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:16:48.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:16:48.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:16:48.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:16:48.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:16:48.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:16:48.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:16:48.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:16:48.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:16:48.717 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:16:48.924 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:16:49.265 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:16:49.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:16:49.368 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:16:49.368 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:16:49.530 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:16:49.530 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:17:19.560 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:17:19.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:17:19.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:17:19.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:17:19.860 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:17:20.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:17:20.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:17:20.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:17:20.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:17:20.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:17:20.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:17:20.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:17:20.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:17:22.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:17:22.825 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:17:22.825 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:17:22.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:17:22.836 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:17:22.849 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:17:22.849 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:17:22.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:17:22.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:17:22.850 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:17:22.850 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:17:22.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:17:22.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:17:22.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:17:23.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:17:23.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:17:23.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:17:23.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:17:23.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:17:23.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:17:23.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:17:23.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:17:23.180 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:17:23.252 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:17:17
2026-06-03T14:17:23.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86240, datetime.datetime(2026, 6, 3, 14, 17, 17), datetime.datetime(2026, 6, 3, 14, 17, 17), 'salt', 7.3, 99.81, None, 30.45, 110.39, 0.02, 821.75, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:17:23.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:17:23.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:17:23.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:17:17, diff=6.259809s, valid=True
2026-06-03T14:17:23.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:17:23.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:17:23.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:17:12, diff=11.263147s, valid=True
2026-06-03T14:17:23.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:17:23.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:17:23.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:17:15, diff=8.270995s, valid=True
2026-06-03T14:17:23.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:17:23.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:17:23.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:17:23.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:17:23.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:17:23.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:17:23.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:17:12, diff=11.274539s, valid=True
2026-06-03T14:17:23.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:17:23.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:17:23.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:17:23.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63240.275317s, valid=False
2026-06-03T14:17:23.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:17:23.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:17:23.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:17:23.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:17:23.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:17:23.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:17:23.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:17:23.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:17:23.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:17:23.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:17:23.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:17:23.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:17:23.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:17:23.593 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:17:23.871 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:17:24.208 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:17:24.310 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:17:24.310 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:17:24.310 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:17:24.470 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:17:24.471 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:17:54.482 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:17:54.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:17:54.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:17:54.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:17:54.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:17:55.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:17:55.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:17:55.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:17:55.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:17:55.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:17:55.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:17:55.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:17:55.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:17:57.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:17:57.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:17:57.837 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:17:57.837 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:17:57.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:17:57.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:17:57.859 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:17:57.860 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:17:57.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:17:57.860 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:17:57.861 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:17:57.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:17:57.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:17:57.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:17:58.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:17:58.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:17:58.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:17:58.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:17:58.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:17:58.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:17:58.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:17:58.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:17:58.194 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:17:58.264 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:17:48
2026-06-03T14:17:58.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86241, datetime.datetime(2026, 6, 3, 14, 17, 48), datetime.datetime(2026, 6, 3, 14, 17, 47), 'salt', 7.44, 99.94, None, 28.97, 109.03, 0.01, 821.62, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:17:58.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:17:58.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:17:58.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:17:47, diff=11.271575s, valid=True
2026-06-03T14:17:58.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:17:58.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:17:58.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:18:12, diff=-13.724884s, valid=True
2026-06-03T14:17:58.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:17:58.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:17:58.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:17:46, diff=12.283256s, valid=True
2026-06-03T14:17:58.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:17:58.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:17:58.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:17:58.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:17:58.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:17:58.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:17:58.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:18:12, diff=-13.712994s, valid=True
2026-06-03T14:17:58.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:17:58.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:17:58.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:17:58.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63275.287861s, valid=False
2026-06-03T14:17:58.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:17:58.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:17:58.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:17:58.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:17:58.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:17:58.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:17:58.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:17:58.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:17:58.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:17:58.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:17:58.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:17:58.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:17:58.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:17:58.606 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:17:58.830 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:17:59.168 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:17:59.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:17:59.270 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:17:59.270 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:17:59.427 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:17:59.427 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:18:29.439 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:18:29.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:18:29.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:18:29.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:18:29.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:18:29.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:18:29.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:18:29.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:18:29.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:18:29.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:18:29.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:18:29.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:18:29.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:18:32.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:18:32.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:18:32.510 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:18:32.510 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:18:32.520 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:18:32.532 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:18:32.533 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:18:32.533 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:18:32.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:18:32.534 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:18:32.534 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:18:32.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:18:32.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:18:32.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:18:32.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:18:32.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:18:32.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:18:32.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:18:32.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:18:32.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:18:32.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:18:32.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:18:32.871 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:18:32.941 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:18:18
2026-06-03T14:18:32.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86242, datetime.datetime(2026, 6, 3, 14, 18, 18), datetime.datetime(2026, 6, 3, 14, 18, 17), 'salt', 7.47, 99.88, None, 29.43, 106.12, 0.01, 821.5, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:18:32.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:18:32.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:18:32.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:18:17, diff=15.948376s, valid=True
2026-06-03T14:18:32.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:18:32.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:18:32.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:18:12, diff=20.95186s, valid=True
2026-06-03T14:18:32.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:18:32.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:18:32.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:18:16, diff=16.960008s, valid=True
2026-06-03T14:18:32.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:18:32.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:18:32.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:18:32.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:18:32.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:18:32.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:18:32.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:18:12, diff=20.963724s, valid=True
2026-06-03T14:18:32.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:18:32.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:18:32.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:18:32.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63309.964526s, valid=False
2026-06-03T14:18:32.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:18:32.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:18:32.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:18:32.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:18:32.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:18:33.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:18:33.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:18:33.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:18:33.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:18:33.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:18:33.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:18:33.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:18:33.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:18:33.354 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:18:33.558 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:18:33.896 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:18:33.998 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:18:33.998 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:18:33.998 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:18:34.241 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:18:34.241 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:19:04.272 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:19:04.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:19:04.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:19:04.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:19:04.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:19:04.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:19:04.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:19:04.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:19:04.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:19:04.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:19:04.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:19:04.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:19:04.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:19:07.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:19:07.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:19:07.509 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:19:07.510 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:19:07.520 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:19:07.533 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:19:07.533 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:19:07.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:19:07.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:19:07.534 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:19:07.535 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:19:07.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:19:07.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:19:07.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:19:07.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:19:07.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:19:07.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:19:07.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:19:07.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:19:07.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:19:07.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:19:07.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:19:07.864 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:19:07.934 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:18:48
2026-06-03T14:19:07.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86243, datetime.datetime(2026, 6, 3, 14, 18, 48), datetime.datetime(2026, 6, 3, 14, 18, 47), 'salt', 7.37, 99.84, None, 36.55, 101.45, 0.02, 821.44, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:19:07.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:19:07.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:19:07.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:18:47, diff=20.941652s, valid=True
2026-06-03T14:19:07.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:19:07.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:19:07.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:19:12, diff=-4.054851s, valid=True
2026-06-03T14:19:07.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:19:07.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:19:07.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:18:47, diff=20.95336s, valid=True
2026-06-03T14:19:07.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:19:07.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:19:07.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:19:07.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:19:07.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:19:07.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:19:07.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:19:12, diff=-4.042853s, valid=True
2026-06-03T14:19:07.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:19:07.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:19:07.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:19:07.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63344.957984s, valid=False
2026-06-03T14:19:07.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:19:07.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:19:07.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:19:07.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:19:07.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:19:08.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:19:08.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:19:08.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:19:08.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:19:08.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:19:08.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:19:08.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:19:08.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:19:08.279 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:19:08.484 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:19:08.821 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:19:08.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:19:08.923 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:19:08.923 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:19:09.104 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:19:09.104 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:19:39.135 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:19:39.135 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:19:39.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:19:39.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:19:39.634 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:19:39.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:19:39.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:19:39.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:19:39.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:19:39.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:19:39.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:19:39.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:19:39.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:19:42.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:19:42.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:19:42.540 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:19:42.540 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:19:42.550 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:19:42.562 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:19:42.563 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:19:42.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:19:42.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:19:42.564 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:19:42.564 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:19:42.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:19:42.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:19:42.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:19:42.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:19:42.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:19:42.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:19:42.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:19:42.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:19:42.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:19:42.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:19:42.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:19:42.898 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:19:42.968 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:19:18
2026-06-03T14:19:42.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86244, datetime.datetime(2026, 6, 3, 14, 19, 18), datetime.datetime(2026, 6, 3, 14, 19, 18), 'salt', 7.3, 99.88, None, 30.45, 100.01, 0.01, 821.56, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:19:42.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:19:42.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:19:42.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:19:18, diff=24.975938s, valid=True
2026-06-03T14:19:42.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:19:42.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:19:42.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:19:12, diff=30.979385s, valid=True
2026-06-03T14:19:42.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:19:42.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:19:42.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:19:18, diff=24.987514s, valid=True
2026-06-03T14:19:42.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:19:42.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:19:42.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:19:42.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:19:42.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:19:42.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:19:42.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:19:12, diff=30.991257s, valid=True
2026-06-03T14:19:42.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:19:42.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:19:42.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:19:42.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63379.992069s, valid=False
2026-06-03T14:19:42.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:19:42.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:19:42.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:19:42.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:19:42.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:19:43.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:19:43.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:19:43.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:19:43.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:19:43.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:19:43.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:19:43.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:19:43.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:19:43.379 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:19:43.583 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:19:43.923 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:19:44.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:19:44.025 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:19:44.025 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:19:44.209 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:19:44.209 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:20:14.238 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:20:14.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:20:14.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:20:14.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:20:14.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:20:14.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:20:14.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:20:14.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:20:14.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:20:14.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:20:14.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:20:14.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:20:14.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:20:17.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:20:17.372 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:20:17.373 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:20:17.373 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:20:17.383 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:20:17.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:20:17.397 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:20:17.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:20:17.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:20:17.399 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:20:17.399 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:20:17.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:20:17.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:20:17.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:20:17.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:20:17.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:20:17.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:20:17.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:20:17.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:20:17.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:20:17.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:20:17.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:20:17.755 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:20:17.829 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:19:49
2026-06-03T14:20:17.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86245, datetime.datetime(2026, 6, 3, 14, 19, 49), datetime.datetime(2026, 6, 3, 14, 19, 48), 'salt', 7.47, 99.94, None, 33.17, 114.99, 0.0, 821.56, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:20:17.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:20:17.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:20:17.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:19:48, diff=29.837427s, valid=True
2026-06-03T14:20:17.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:20:17.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:20:17.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:20:12, diff=5.840998s, valid=True
2026-06-03T14:20:17.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:20:17.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:20:17.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:19:47, diff=30.849458s, valid=True
2026-06-03T14:20:17.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:20:17.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:20:17.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:20:17.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:20:17.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:20:17.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:20:17.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:20:12, diff=5.853308s, valid=True
2026-06-03T14:20:17.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:20:17.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:20:17.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:20:17.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63414.85415s, valid=False
2026-06-03T14:20:17.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:20:17.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:20:17.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:20:17.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:20:17.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:20:17.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:20:17.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:20:17.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:20:17.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:20:17.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:20:18.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:20:18.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:20:18.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:20:18.177 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:20:18.382 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:20:18.733 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:20:18.838 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:20:18.838 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:20:18.838 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:20:19.070 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:20:19.071 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:20:49.101 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:20:49.101 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:20:49.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:20:49.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:20:49.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:20:49.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:20:49.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:20:49.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:20:49.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:20:49.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:20:49.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:20:49.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:20:49.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:20:52.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:20:52.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:20:52.177 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:20:52.178 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:20:52.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:20:52.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:20:52.201 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:20:52.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:20:52.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:20:52.203 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:20:52.203 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:20:52.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:20:52.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:20:52.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:20:52.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:20:52.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:20:52.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:20:52.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:20:52.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:20:52.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:20:52.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:20:52.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:20:52.539 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:20:52.612 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:20:49
2026-06-03T14:20:52.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86247, datetime.datetime(2026, 6, 3, 14, 20, 49), datetime.datetime(2026, 6, 3, 14, 20, 48), 'salt', 7.27, 99.81, None, 36.77, 103.39, 0.02, 821.62, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:20:52.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:20:52.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:20:52.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:20:48, diff=4.619301s, valid=True
2026-06-03T14:20:52.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:20:52.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:20:52.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:21:12, diff=-19.377178s, valid=True
2026-06-03T14:20:52.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:20:52.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:20:52.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:20:47, diff=5.630854s, valid=True
2026-06-03T14:20:52.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:20:52.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:20:52.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:20:52.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:20:52.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:20:52.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:20:52.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:21:12, diff=-19.365452s, valid=True
2026-06-03T14:20:52.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:20:52.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:20:52.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:20:52.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63449.635352s, valid=False
2026-06-03T14:20:52.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:20:52.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:20:52.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:20:52.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:20:52.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:20:52.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:20:52.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:20:52.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:20:52.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:20:52.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:20:52.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:20:52.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:20:52.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:20:53.022 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:20:53.227 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:20:53.566 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:20:53.668 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:20:53.668 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:20:53.668 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:20:53.847 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:20:53.847 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:21:23.877 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:21:23.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:21:23.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:21:24.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:21:24.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:21:24.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:21:24.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:21:24.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:21:24.314 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:21:24.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:21:24.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:21:24.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:21:24.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:21:27.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:21:27.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:21:27.101 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:21:27.101 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:21:27.113 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:21:27.126 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:21:27.126 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:21:27.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:21:27.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:21:27.128 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:21:27.128 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:21:27.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:21:27.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:21:27.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:21:27.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:21:27.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:21:27.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:21:27.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:21:27.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:21:27.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:21:27.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:21:27.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:21:27.460 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:21:27.529 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:21:19
2026-06-03T14:21:27.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86248, datetime.datetime(2026, 6, 3, 14, 21, 19), datetime.datetime(2026, 6, 3, 14, 21, 19), 'salt', 7.2, 99.91, None, 39.06, 99.94, 0.0, 821.5, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:21:27.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:21:27.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:21:27.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:21:19, diff=8.536294s, valid=True
2026-06-03T14:21:27.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:21:27.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:21:27.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:21:12, diff=15.53922s, valid=True
2026-06-03T14:21:27.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:21:27.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:21:27.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:21:17, diff=10.547046s, valid=True
2026-06-03T14:21:27.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:21:27.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:21:27.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:21:27.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:21:27.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:21:27.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:21:27.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:21:12, diff=15.550833s, valid=True
2026-06-03T14:21:27.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:21:27.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:21:27.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:21:27.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63484.551661s, valid=False
2026-06-03T14:21:27.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:21:27.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:21:27.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:21:27.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:21:27.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:21:27.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:21:27.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:21:27.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:21:27.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:21:27.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:21:27.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:21:27.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:21:27.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:21:27.867 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:21:28.074 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:21:28.414 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:21:28.518 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:21:28.518 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:21:28.518 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:21:28.778 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:21:28.778 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:21:58.801 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:21:58.801 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:21:58.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:21:58.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:21:58.933 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:21:59.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:21:59.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:21:59.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:21:59.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:21:59.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:21:59.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:21:59.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:21:59.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:22:01.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:22:01.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:22:01.947 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:22:01.948 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:22:01.958 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:22:01.971 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:22:01.972 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:22:01.972 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:22:01.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:22:01.973 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:22:01.973 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:22:01.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:22:02.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:22:02.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:22:02.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:22:02.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:22:02.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:22:02.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:22:02.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:22:02.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:22:02.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:22:02.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:22:02.256 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:22:02.324 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:21:50
2026-06-03T14:22:02.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86249, datetime.datetime(2026, 6, 3, 14, 21, 50), datetime.datetime(2026, 6, 3, 14, 21, 49), 'salt', 7.2, 99.81, None, 34.37, 96.66, 0.02, 821.56, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:22:02.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:22:02.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:22:02.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:21:49, diff=13.331103s, valid=True
2026-06-03T14:22:02.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:22:02.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:22:02.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:22:12, diff=-9.665851s, valid=True
2026-06-03T14:22:02.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:22:02.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:22:02.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:21:47, diff=15.341223s, valid=True
2026-06-03T14:22:02.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:22:02.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:22:02.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:22:02.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:22:02.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:22:02.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:22:02.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:22:12, diff=-9.65553s, valid=True
2026-06-03T14:22:02.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:22:02.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:22:02.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:22:02.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63519.345182s, valid=False
2026-06-03T14:22:02.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:22:02.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:22:02.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:22:02.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:22:02.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:22:02.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:22:02.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:22:02.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:22:02.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:22:02.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:22:02.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:22:02.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:22:02.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:22:02.661 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:22:02.867 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:22:03.210 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:22:03.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:22:03.312 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:22:03.312 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:22:03.491 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:22:03.492 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:22:33.493 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:22:33.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:22:33.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:22:33.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:22:33.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:22:34.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:22:34.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:22:34.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:22:34.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:22:34.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:22:34.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:22:34.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:22:34.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:22:36.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:22:36.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:22:36.744 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:22:36.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:22:36.754 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:22:36.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:22:36.767 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:22:36.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:22:36.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:22:36.768 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:22:36.769 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:22:36.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:22:36.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:22:36.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:22:37.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:22:37.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:22:37.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:22:37.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:22:37.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:22:37.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:22:37.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:22:37.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:22:37.113 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:22:37.185 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:22:20
2026-06-03T14:22:37.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86250, datetime.datetime(2026, 6, 3, 14, 22, 20), datetime.datetime(2026, 6, 3, 14, 22, 19), 'salt', 7.14, 99.98, None, 33.52, 109.57, 0.0, 821.44, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:22:37.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:22:37.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:22:37.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:22:19, diff=18.191316s, valid=True
2026-06-03T14:22:37.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:22:37.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:22:37.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:22:12, diff=25.194176s, valid=True
2026-06-03T14:22:37.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:22:37.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:22:37.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:22:18, diff=19.200851s, valid=True
2026-06-03T14:22:37.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:22:37.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:22:37.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:22:37.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:22:37.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:22:37.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:22:37.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:22:12, diff=25.203847s, valid=True
2026-06-03T14:22:37.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:22:37.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:22:37.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:22:37.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63554.204506s, valid=False
2026-06-03T14:22:37.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:22:37.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:22:37.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:22:37.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:22:37.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:22:37.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:22:37.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:22:37.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:22:37.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:22:37.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:22:37.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:22:37.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:22:37.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:22:37.525 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:22:37.737 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:22:38.172 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:22:38.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:22:38.274 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:22:38.274 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:22:38.427 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:22:38.427 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:23:08.458 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:23:08.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:23:08.458 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:23:08.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:23:08.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:23:09.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:23:09.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:23:09.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:23:09.034 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:23:09.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:23:09.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:23:09.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:23:09.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:23:11.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:23:11.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:23:11.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:23:11.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:23:11.746 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:23:11.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:23:11.759 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:23:11.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:23:11.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:23:11.760 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:23:11.760 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:23:11.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:23:11.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:23:11.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:23:12.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:23:12.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:23:12.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:23:12.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:23:12.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:23:12.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:23:12.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:23:12.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:23:12.114 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:23:12.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:22:50
2026-06-03T14:23:12.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86251, datetime.datetime(2026, 6, 3, 14, 22, 50), datetime.datetime(2026, 6, 3, 14, 22, 49), 'salt', 7.14, 99.88, None, 35.78, 100.27, 0.01, 821.44, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:23:12.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:23:12.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:23:12.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:22:49, diff=23.195396s, valid=True
2026-06-03T14:23:12.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:23:12.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:23:12.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:23:12, diff=0.199032s, valid=True
2026-06-03T14:23:12.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:23:12.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:23:12.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:22:48, diff=24.207488s, valid=True
2026-06-03T14:23:12.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:23:12.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:23:12.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:23:12.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:23:12.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:23:12.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:23:12.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:23:12, diff=0.211384s, valid=True
2026-06-03T14:23:12.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:23:12.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:23:12.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:23:12.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63589.212233s, valid=False
2026-06-03T14:23:12.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:23:12.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:23:12.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:23:12.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:23:12.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:23:12.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:23:12.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:23:12.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:23:12.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:23:12.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:23:12.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:23:12.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:23:12.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:23:12.531 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:23:12.736 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:23:13.074 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:23:13.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:23:13.176 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:23:13.176 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:23:13.347 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:23:13.347 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:23:43.352 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:23:43.352 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:23:43.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:23:43.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:23:43.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:23:43.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:23:43.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:23:43.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:23:43.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:23:43.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:23:43.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:23:43.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:23:43.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:23:46.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:23:46.729 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:23:46.730 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:23:46.730 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:23:46.739 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:23:46.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:23:46.752 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:23:46.753 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:23:46.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:23:46.754 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:23:46.754 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:23:46.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:23:46.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:23:46.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:23:46.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:23:46.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:23:47.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:23:47.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:23:47.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-03T14:23:47.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:23:47.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:23:47.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:23:47.084 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:23:47.153 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:23:20
2026-06-03T14:23:47.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86252, datetime.datetime(2026, 6, 3, 14, 23, 20), datetime.datetime(2026, 6, 3, 14, 23, 20), 'salt', 7.2, 99.71, None, 36.62, 99.87, 0.03, 821.56, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:23:47.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:23:47.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:23:47.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:23:20, diff=27.160827s, valid=True
2026-06-03T14:23:47.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:23:47.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:23:47.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:23:12, diff=35.164369s, valid=True
2026-06-03T14:23:47.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:23:47.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:23:47.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:23:19, diff=28.172529s, valid=True
2026-06-03T14:23:47.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:23:47.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:23:47.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:23:47.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:23:47.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:23:47.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-03T14:23:47.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:23:12, diff=35.176342s, valid=True
2026-06-03T14:23:47.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:23:47.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:23:47.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:23:47.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63624.17717s, valid=False
2026-06-03T14:23:47.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:23:47.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:23:47.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:23:47.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:23:47.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:23:47.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:23:47.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:23:47.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:23:47.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:23:47.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:23:47.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:23:47.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:23:47.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:23:47.496 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:23:47.775 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:23:48.114 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:23:48.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:23:48.217 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:23:48.217 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:23:48.394 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:23:48.394 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:24:18.424 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:24:18.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:24:18.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:24:18.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:24:18.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:24:18.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:24:18.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:24:19.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:24:19.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:24:19.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:24:19.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:24:19.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:24:19.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:24:21.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:24:21.849 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:24:21.850 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:24:21.850 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:24:21.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:24:21.872 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:24:21.873 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:24:21.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:24:21.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:24:21.874 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:24:21.874 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:24:21.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:24:22.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:24:22.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:24:22.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:24:22.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:24:22.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:24:22.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:24:22.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:24:22.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:24:22.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:24:22.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:24:22.194 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:24:22.272 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:24:21
2026-06-03T14:24:22.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86254, datetime.datetime(2026, 6, 3, 14, 24, 21), datetime.datetime(2026, 6, 3, 14, 24, 20), 'salt', 7.34, 99.88, None, 28.79, 108.46, 0.01, 821.69, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:24:22.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:24:22.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:24:22.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:24:20, diff=2.278282s, valid=True
2026-06-03T14:24:22.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:24:22.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:24:22.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:24:12, diff=10.281247s, valid=True
2026-06-03T14:24:22.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:24:22.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:24:22.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:24:19, diff=3.287912s, valid=True
2026-06-03T14:24:22.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:24:22.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:24:22.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:24:22.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:24:22.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:24:22.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:24:22.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:24:12, diff=10.290945s, valid=True
2026-06-03T14:24:22.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:24:22.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:24:22.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:24:22.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63659.291627s, valid=False
2026-06-03T14:24:22.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:24:22.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:24:22.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:24:22.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:24:22.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:24:22.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:24:22.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:24:22.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:24:22.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:24:22.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:24:22.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:24:22.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:24:22.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:24:22.743 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:24:22.961 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:24:23.316 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:24:23.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:24:23.421 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:24:23.421 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:24:23.592 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:24:23.593 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:24:53.593 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:24:53.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:24:53.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:24:54.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:24:54.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:24:54.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:24:54.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:24:54.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:24:54.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:24:54.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:24:54.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:24:54.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:24:54.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:24:57.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:24:57.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:24:57.801 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:24:57.802 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:24:57.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:24:57.831 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:24:57.832 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:24:57.833 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:24:57.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:24:57.834 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:24:57.834 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:24:57.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:24:57.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:24:57.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:24:58.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:24:58.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:24:58.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:24:58.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:24:58.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:24:58.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:24:58.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:24:58.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:24:58.189 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:24:58.261 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:24:51
2026-06-03T14:24:58.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86255, datetime.datetime(2026, 6, 3, 14, 24, 51), datetime.datetime(2026, 6, 3, 14, 24, 50), 'salt', 7.44, 99.78, None, 37.19, 99.73, 0.03, 821.56, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:24:58.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:24:58.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:24:58.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:24:50, diff=8.267616s, valid=True
2026-06-03T14:24:58.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:24:58.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:24:58.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:25:12, diff=-13.729615s, valid=True
2026-06-03T14:24:58.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:24:58.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:24:58.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:24:49, diff=9.276968s, valid=True
2026-06-03T14:24:58.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:24:58.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:24:58.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:24:58.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:24:58.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:24:58.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:24:58.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:25:12, diff=-13.72006s, valid=True
2026-06-03T14:24:58.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:24:58.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:24:58.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:24:58.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63695.280578s, valid=False
2026-06-03T14:24:58.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:24:58.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:24:58.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:24:58.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:24:58.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:24:58.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:24:58.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:24:58.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:24:58.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:24:58.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:24:58.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:24:58.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:24:58.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:24:58.666 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:24:58.870 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:24:59.209 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:24:59.330 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:24:59.330 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:24:59.330 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:24:59.497 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:24:59.497 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:25:29.527 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:25:29.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:25:29.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:25:29.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:25:29.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:25:30.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:25:30.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:25:30.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:25:30.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:25:30.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:25:30.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:25:30.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:25:30.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:25:32.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:25:32.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:25:32.369 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:25:32.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:25:32.379 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:25:32.391 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:25:32.392 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:25:32.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:25:32.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:25:32.393 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:25:32.393 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:25:32.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:25:32.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:25:32.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:25:32.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:25:32.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:25:32.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:25:32.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:25:32.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:25:32.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:25:32.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:25:32.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:25:32.721 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:25:32.793 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:25:21
2026-06-03T14:25:32.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86256, datetime.datetime(2026, 6, 3, 14, 25, 21), datetime.datetime(2026, 6, 3, 14, 25, 20), 'salt', 7.54, 99.81, None, 41.85, 108.35, 0.03, 821.32, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:25:32.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:25:32.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:25:32.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:25:20, diff=12.800749s, valid=True
2026-06-03T14:25:32.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:25:32.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:25:32.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:25:12, diff=20.804196s, valid=True
2026-06-03T14:25:32.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:25:32.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:25:32.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:25:19, diff=13.812192s, valid=True
2026-06-03T14:25:32.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:25:32.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:25:32.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:25:32.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:25:32.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:25:32.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:25:32.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:25:12, diff=20.815869s, valid=True
2026-06-03T14:25:32.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:25:32.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:25:32.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:25:32.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63729.816684s, valid=False
2026-06-03T14:25:32.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:25:32.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:25:32.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:25:32.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:25:32.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:25:32.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:25:32.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:25:32.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:25:32.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:25:32.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:25:33.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:25:33.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:25:33.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:25:33.136 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:25:33.340 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:25:33.680 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:25:33.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:25:33.782 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:25:33.782 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:25:34.999 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:25:35.000 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:26:05.004 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:26:05.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:26:05.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:26:05.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:26:05.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:26:05.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:26:05.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:26:05.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:26:05.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:26:05.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:26:05.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:26:05.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:26:05.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:26:07.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:26:07.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:26:07.735 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:26:07.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:26:07.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:26:07.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:26:07.758 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:26:07.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:26:07.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:26:07.759 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:26:07.759 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:26:07.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:26:07.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:26:07.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:26:07.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:26:07.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:26:08.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T14:26:08.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:26:08.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T14:26:08.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:26:08.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:26:08.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:26:08.092 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:26:08.163 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:25:51
2026-06-03T14:26:08.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86257, datetime.datetime(2026, 6, 3, 14, 25, 51), datetime.datetime(2026, 6, 3, 14, 25, 51), 'salt', 7.44, 99.81, None, 33.45, 108.84, 0.02, 821.5, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:26:08.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:26:08.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:26:08.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:25:51, diff=17.170615s, valid=True
2026-06-03T14:26:08.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:26:08.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T14:26:08.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:26:12, diff=-3.825823s, valid=True
2026-06-03T14:26:08.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:26:08.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:26:08.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:25:49, diff=19.182411s, valid=True
2026-06-03T14:26:08.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:26:08.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:26:08.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:26:08.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:26:08.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:26:08.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T14:26:08.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:26:12, diff=-3.813844s, valid=True
2026-06-03T14:26:08.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:26:08.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:26:08.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:26:08.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63765.186959s, valid=False
2026-06-03T14:26:08.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:26:08.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:26:08.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:26:08.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:26:08.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:26:08.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:26:08.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:26:08.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:26:08.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:26:08.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:26:08.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:26:08.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:26:08.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:26:08.572 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:26:08.777 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:26:09.117 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:26:09.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:26:09.220 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:26:09.220 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:26:09.410 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:26:09.410 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:26:39.441 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:26:39.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:26:39.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:26:39.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:26:39.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:26:40.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:26:40.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:26:40.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:26:40.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:26:40.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:26:40.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:26:40.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:26:40.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:26:42.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:26:42.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:26:42.816 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:26:42.816 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:26:42.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:26:42.838 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:26:42.839 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:26:42.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:26:42.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:26:42.840 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:26:42.840 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:26:42.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:26:42.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:26:42.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:26:43.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:26:43.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:26:43.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T14:26:43.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:26:43.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T14:26:43.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:26:43.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:26:43.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:26:43.166 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:26:43.236 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:26:22
2026-06-03T14:26:43.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86258, datetime.datetime(2026, 6, 3, 14, 26, 22), datetime.datetime(2026, 6, 3, 14, 26, 21), 'salt', 7.54, 99.88, None, 37.05, 110.53, 0.02, 821.56, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:26:43.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:26:43.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:26:43.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:26:21, diff=22.243901s, valid=True
2026-06-03T14:26:43.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:26:43.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T14:26:43.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:26:12, diff=31.247417s, valid=True
2026-06-03T14:26:43.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:26:43.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:26:43.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:26:19, diff=24.255802s, valid=True
2026-06-03T14:26:43.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:26:43.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:26:43.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:26:43.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:26:43.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:26:43.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T14:26:43.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:26:12, diff=31.259567s, valid=True
2026-06-03T14:26:43.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:26:43.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:26:43.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:26:43.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63800.260384s, valid=False
2026-06-03T14:26:43.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:26:43.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:26:43.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:26:43.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:26:43.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:26:43.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:26:43.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:26:43.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:26:43.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:26:43.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:26:43.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:26:43.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:26:43.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:26:43.582 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:26:43.786 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:26:44.125 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:26:44.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:26:44.229 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:26:44.229 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:26:44.302 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:26:44.302 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:27:14.332 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:27:14.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:27:14.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:27:14.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:27:14.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:27:14.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:27:14.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:27:14.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:27:14.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:27:14.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:27:14.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:27:14.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:27:14.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:27:17.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:27:17.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:27:17.388 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:27:17.388 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:27:17.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:27:17.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:27:17.410 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:27:17.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:27:17.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:27:17.411 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:27:17.412 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:27:17.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:27:17.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:27:17.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:27:17.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:27:17.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:27:17.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:27:17.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:27:17.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:27:17.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:27:17.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:27:17.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:27:17.767 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:27:17.837 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:26:53
2026-06-03T14:27:17.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86259, datetime.datetime(2026, 6, 3, 14, 26, 53), datetime.datetime(2026, 6, 3, 14, 26, 52), 'salt', 7.5, 99.81, None, 32.5, 112.9, 0.02, 821.44, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:27:17.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:27:17.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:27:17.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:26:52, diff=25.84488s, valid=True
2026-06-03T14:27:17.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:27:17.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:27:17.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:27:12, diff=5.848482s, valid=True
2026-06-03T14:27:17.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:27:17.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:27:17.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:26:50, diff=27.856955s, valid=True
2026-06-03T14:27:17.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:27:17.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:27:17.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:27:17.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:27:17.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:27:17.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:27:17.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:27:12, diff=5.860788s, valid=True
2026-06-03T14:27:17.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:27:17.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:27:17.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:27:17.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63834.861651s, valid=False
2026-06-03T14:27:17.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:27:17.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:27:17.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:27:17.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:27:17.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:27:17.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:27:17.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:27:17.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:27:18.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:27:18.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:27:18.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:27:18.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:27:18.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:27:18.249 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:27:18.456 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:27:18.796 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:27:18.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:27:18.899 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:27:18.899 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:27:19.125 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:27:19.126 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:27:49.156 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:27:49.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:27:49.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:27:49.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:27:49.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:27:49.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:27:49.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:27:49.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:27:49.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:27:49.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:27:49.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:27:49.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:27:49.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:27:53.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:27:53.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:27:53.176 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:27:53.177 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:27:53.187 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:27:53.199 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:27:53.200 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:27:53.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:27:53.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:27:53.201 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:27:53.201 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:27:53.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:27:53.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:27:53.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:27:53.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:27:53.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:27:53.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:27:53.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:27:53.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:27:53.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:27:53.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:27:53.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:27:53.530 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:27:53.600 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:27:53
2026-06-03T14:27:53.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86261, datetime.datetime(2026, 6, 3, 14, 27, 53), datetime.datetime(2026, 6, 3, 14, 27, 52), 'salt', 7.67, 99.88, None, 34.05, 113.04, 0.01, 821.32, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:27:53.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:27:53.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:27:53.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:27:52, diff=1.611725s, valid=True
2026-06-03T14:27:53.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:27:53.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:27:53.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:28:12, diff=-18.384779s, valid=True
2026-06-03T14:27:53.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:27:53.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:27:53.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:27:52, diff=1.623359s, valid=True
2026-06-03T14:27:53.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:27:53.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:27:53.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:27:53.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:27:53.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:27:53.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:27:53.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:28:12, diff=-18.37291s, valid=True
2026-06-03T14:27:53.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:27:53.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:27:53.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:27:53.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63870.627908s, valid=False
2026-06-03T14:27:53.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:27:53.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:27:53.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:27:53.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:27:53.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:27:53.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:27:53.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:27:53.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:27:53.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:27:53.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:27:53.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:27:53.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:27:53.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:27:53.948 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:27:54.155 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:27:54.496 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:27:54.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:27:54.598 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:27:54.598 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:27:54.670 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:27:54.670 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:28:24.675 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:28:24.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:28:24.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:28:24.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:28:25.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:28:25.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:28:25.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:28:25.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:28:25.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:28:25.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:28:25.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:28:25.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:28:25.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:28:28.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:28:28.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:28:28.077 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:28:28.077 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:28:28.087 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:28:28.099 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:28:28.100 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:28:28.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:28:28.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:28:28.101 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:28:28.101 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:28:28.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:28:28.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:28:28.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:28:28.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:28:28.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:28:28.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:28:28.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:28:28.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:28:28.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:28:28.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:28:28.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:28:28.432 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:28:28.503 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:28:23
2026-06-03T14:28:28.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86262, datetime.datetime(2026, 6, 3, 14, 28, 23), datetime.datetime(2026, 6, 3, 14, 28, 23), 'salt', 7.5, 99.81, None, 40.26, 118.84, 0.02, 821.56, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:28:28.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:28:28.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:28:28.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:28:23, diff=5.5104s, valid=True
2026-06-03T14:28:28.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:28:28.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:28:28.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:28:12, diff=16.513943s, valid=True
2026-06-03T14:28:28.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:28:28.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:28:28.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:28:20, diff=8.522223s, valid=True
2026-06-03T14:28:28.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:28:28.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:28:28.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:28:28.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:28:28.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:28:28.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:28:28.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:28:12, diff=16.525962s, valid=True
2026-06-03T14:28:28.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:28:28.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:28:28.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:28:28.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63905.526779s, valid=False
2026-06-03T14:28:28.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:28:28.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:28:28.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:28:28.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:28:28.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:28:28.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:28:28.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:28:28.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:28:28.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:28:28.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:28:28.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:28:28.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:28:28.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:28:28.845 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:28:29.049 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:28:29.392 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:28:29.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:28:29.494 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:28:29.494 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:28:29.756 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:28:29.756 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:28:59.759 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:28:59.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:28:59.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:29:00.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:29:00.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:29:00.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:29:00.778 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:29:00.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:29:00.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:29:00.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:29:00.795 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:29:00.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:29:00.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:29:03.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:29:03.626 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:29:03.627 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:29:03.627 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:29:03.638 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:29:03.651 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:29:03.651 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:29:03.652 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:29:03.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:29:03.653 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:29:03.653 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:29:03.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:29:03.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:29:03.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:29:03.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:29:03.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:29:03.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:29:03.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:29:03.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:29:03.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:29:03.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:29:03.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:29:03.989 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:29:04.059 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:28:54
2026-06-03T14:29:04.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86263, datetime.datetime(2026, 6, 3, 14, 28, 54), datetime.datetime(2026, 6, 3, 14, 28, 53), 'salt', 7.4, 99.84, None, 32.14, 115.44, 0.01, 821.56, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:29:04.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:29:04.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:29:04.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:28:53, diff=11.067174s, valid=True
2026-06-03T14:29:04.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:29:04.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:29:04.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:29:12, diff=-7.929291s, valid=True
2026-06-03T14:29:04.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:29:04.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:29:04.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:28:51, diff=13.078837s, valid=True
2026-06-03T14:29:04.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:29:04.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:29:04.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:29:04.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:29:04.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:29:04.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:29:04.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:29:12, diff=-7.917448s, valid=True
2026-06-03T14:29:04.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:29:04.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:29:04.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:29:04.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63941.083379s, valid=False
2026-06-03T14:29:04.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:29:04.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:29:04.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:29:04.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:29:04.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:29:04.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:29:04.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:29:04.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:29:04.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:29:04.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:29:04.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:29:04.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:29:04.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:29:04.406 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:29:04.612 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:29:04.950 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:29:05.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:29:05.108 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:29:05.108 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:29:05.358 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:29:05.358 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:29:35.388 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:29:35.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:29:35.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:29:35.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:29:35.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:29:35.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:29:35.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:29:35.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:29:35.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:29:35.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:29:35.778 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:29:35.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:29:35.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:29:38.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:29:38.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:29:38.160 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:29:38.160 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:29:38.171 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:29:38.183 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:29:38.184 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:29:38.185 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:29:38.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:29:38.185 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:29:38.185 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:29:38.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:29:38.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:29:38.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:29:38.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:29:38.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:29:38.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:29:38.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:29:38.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:29:38.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:29:38.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:29:38.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:29:38.537 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:29:38.612 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:29:24
2026-06-03T14:29:38.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86264, datetime.datetime(2026, 6, 3, 14, 29, 24), datetime.datetime(2026, 6, 3, 14, 29, 23), 'salt', 7.37, 99.78, None, 34.23, 100.25, 0.03, 821.38, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:29:38.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:29:38.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:29:38.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:29:23, diff=15.619324s, valid=True
2026-06-03T14:29:38.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:29:38.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:29:38.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:29:12, diff=26.622799s, valid=True
2026-06-03T14:29:38.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:29:38.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:29:38.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:29:21, diff=17.631067s, valid=True
2026-06-03T14:29:38.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:29:38.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:29:38.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:29:38.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:29:38.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:29:38.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:29:38.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:29:12, diff=26.6348s, valid=True
2026-06-03T14:29:38.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:29:38.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:29:38.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:29:38.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=63975.635595s, valid=False
2026-06-03T14:29:38.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:29:38.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:29:38.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:29:38.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:29:38.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:29:38.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:29:38.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:29:38.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:29:38.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:29:38.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:29:38.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:29:38.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:29:38.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:29:38.961 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:29:39.166 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:29:39.505 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:29:39.608 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:29:39.608 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:29:39.608 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:29:39.752 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:29:39.752 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:30:09.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:30:09.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:30:09.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:30:10.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:30:10.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:30:10.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:30:10.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:30:10.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:30:10.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:30:10.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:30:10.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:30:10.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:30:10.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:30:13.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:30:13.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:30:13.400 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:30:13.400 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:30:13.411 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:30:13.423 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:30:13.424 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:30:13.425 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:30:13.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:30:13.425 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:30:13.425 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:30:13.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:30:13.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:30:13.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:30:13.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:30:13.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:30:13.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:30:13.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:30:13.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:30:13.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:30:13.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:30:13.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:30:13.757 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:30:13.830 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:29:54
2026-06-03T14:30:13.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86265, datetime.datetime(2026, 6, 3, 14, 29, 54), datetime.datetime(2026, 6, 3, 14, 29, 53), 'salt', 7.34, 99.81, None, 40.43, 102.71, 0.02, 821.44, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:30:13.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:30:13.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:30:13.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:29:53, diff=20.837753s, valid=True
2026-06-03T14:30:13.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:30:13.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:30:13.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:30:12, diff=1.841268s, valid=True
2026-06-03T14:30:13.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:30:13.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:30:13.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:29:51, diff=22.849519s, valid=True
2026-06-03T14:30:13.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:30:13.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:30:13.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:30:13.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:30:13.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:30:13.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:30:13.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:30:12, diff=1.853238s, valid=True
2026-06-03T14:30:13.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:30:13.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:30:13.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:30:13.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64010.854043s, valid=False
2026-06-03T14:30:13.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:30:13.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:30:13.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:30:13.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:30:13.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:30:13.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:30:13.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:30:13.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:30:13.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:30:13.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:30:14.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:30:14.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:30:14.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:30:14.173 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:30:14.451 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:30:14.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:30:14.896 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:30:14.896 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:30:14.897 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:30:15.068 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:30:15.068 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:30:45.082 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:30:45.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:30:45.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:30:45.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:30:45.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:30:45.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:30:45.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:30:45.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:30:45.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:30:45.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:30:45.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:30:45.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:30:45.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:30:48.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:30:48.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:30:48.673 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:30:48.673 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:30:48.681 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:30:48.692 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:30:48.692 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:30:48.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:30:48.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:30:48.693 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:30:48.693 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:30:48.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:30:48.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:30:48.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:30:48.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:30:48.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:30:49.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T14:30:49.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:30:49.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T14:30:49.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:30:49.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:30:49.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:30:49.067 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:30:49.140 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:30:24
2026-06-03T14:30:49.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86266, datetime.datetime(2026, 6, 3, 14, 30, 24), datetime.datetime(2026, 6, 3, 14, 30, 24), 'salt', 7.27, 100.01, None, 40.51, 108.42, -0.01, 821.32, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:30:49.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:30:49.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:30:49.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:30:24, diff=25.147489s, valid=True
2026-06-03T14:30:49.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:30:49.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T14:30:49.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:30:12, diff=37.151061s, valid=True
2026-06-03T14:30:49.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:30:49.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:30:49.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:30:21, diff=28.159284s, valid=True
2026-06-03T14:30:49.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:30:49.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:30:49.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:30:49.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:30:49.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:30:49.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T14:30:49.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:30:12, diff=37.163021s, valid=True
2026-06-03T14:30:49.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:30:49.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:30:49.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:30:49.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64046.163833s, valid=False
2026-06-03T14:30:49.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:30:49.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:30:49.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:30:49.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:30:49.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:30:49.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:30:49.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:30:49.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:30:49.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:30:49.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:30:49.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:30:49.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:30:49.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:30:49.483 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:30:49.688 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:30:50.045 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:30:50.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:30:50.155 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:30:50.155 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:30:50.324 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:30:50.324 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:31:20.350 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:31:20.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:31:20.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:31:20.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:31:20.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:31:20.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:31:20.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:31:20.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:31:20.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:31:20.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:31:20.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:31:20.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:31:20.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:31:23.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:31:23.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:31:23.950 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:31:23.951 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:31:23.961 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:31:23.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:31:23.974 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:31:23.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:31:23.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:31:23.976 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:31:23.976 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:31:23.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:31:24.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:31:24.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:31:24.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:31:24.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:31:24.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:31:24.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:31:24.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:31:24.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:31:24.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:31:24.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:31:24.312 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:31:24.384 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:30:55
2026-06-03T14:31:24.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86267, datetime.datetime(2026, 6, 3, 14, 30, 55), datetime.datetime(2026, 6, 3, 14, 30, 54), 'salt', 7.37, 99.87, None, 34.65, 115.06, 0.01, 821.44, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:31:24.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:31:24.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:31:24.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:30:54, diff=30.391723s, valid=True
2026-06-03T14:31:24.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:31:24.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:31:24.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:31:12, diff=12.395175s, valid=True
2026-06-03T14:31:24.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:31:24.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:31:24.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:30:52, diff=32.403191s, valid=True
2026-06-03T14:31:24.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:31:24.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:31:24.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:31:24.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:31:24.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:31:24.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:31:24.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:31:12, diff=12.40692s, valid=True
2026-06-03T14:31:24.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:31:24.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:31:24.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:31:24.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64081.40772s, valid=False
2026-06-03T14:31:24.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:31:24.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:31:24.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:31:24.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:31:24.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:31:24.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:31:24.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:31:24.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:31:24.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:31:24.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:31:24.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:31:24.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:31:24.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:31:24.798 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:31:25.003 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:31:25.338 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:31:25.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:31:25.438 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:31:25.438 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:31:25.505 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:31:25.505 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:31:55.509 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:31:55.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:31:55.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:31:55.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:31:55.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:31:56.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:31:56.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:31:56.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:31:56.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:31:56.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:31:56.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:31:56.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:31:56.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:31:58.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:31:58.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:31:58.796 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:31:58.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:31:58.807 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:31:58.819 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:31:58.820 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:31:58.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:31:58.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:31:58.821 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:31:58.821 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:31:58.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:31:58.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:31:58.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:31:59.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:31:59.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:31:59.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:31:59.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:31:59.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:31:59.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:31:59.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:31:59.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:31:59.166 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:31:59.237 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:31:55
2026-06-03T14:31:59.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86269, datetime.datetime(2026, 6, 3, 14, 31, 55), datetime.datetime(2026, 6, 3, 14, 31, 54), 'salt', 7.3, 99.77, None, 28.58, 103.79, 0.02, 821.44, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:31:59.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:31:59.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:31:59.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:31:54, diff=5.244558s, valid=True
2026-06-03T14:31:59.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:31:59.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:31:59.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:32:12, diff=-12.750602s, valid=True
2026-06-03T14:31:59.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:31:59.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:31:59.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:31:53, diff=6.257527s, valid=True
2026-06-03T14:31:59.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:31:59.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:31:59.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:31:59.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:31:59.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:31:59.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:31:59.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:32:12, diff=-12.738932s, valid=True
2026-06-03T14:31:59.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:31:59.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:31:59.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:31:59.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64116.261827s, valid=False
2026-06-03T14:31:59.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:31:59.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:31:59.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:31:59.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:31:59.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:31:59.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:31:59.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:31:59.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:31:59.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:31:59.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:31:59.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:31:59.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:31:59.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:31:59.599 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:31:59.814 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:32:00.182 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:32:00.285 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:32:00.286 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:32:00.286 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:32:00.452 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:32:00.453 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:32:30.483 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:32:30.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:32:30.483 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:32:30.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:32:30.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:32:30.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:32:30.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:32:30.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:32:30.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:32:30.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:32:30.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:32:30.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:32:30.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:32:33.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:32:33.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:32:33.277 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:32:33.277 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:32:33.287 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:32:33.299 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:32:33.300 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:32:33.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:32:33.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:32:33.301 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:32:33.301 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:32:33.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:32:33.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:32:33.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:32:33.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:32:33.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:32:33.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:32:33.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:32:33.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:32:33.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:32:33.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:32:33.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:32:33.632 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:32:33.703 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:32:25
2026-06-03T14:32:33.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86270, datetime.datetime(2026, 6, 3, 14, 32, 25), datetime.datetime(2026, 6, 3, 14, 32, 25), 'salt', 7.34, 99.81, None, 27.45, 120.32, 0.03, 821.44, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:32:33.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:32:33.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:32:33.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:32:25, diff=8.711287s, valid=True
2026-06-03T14:32:33.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:32:33.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:32:33.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:32:12, diff=21.714763s, valid=True
2026-06-03T14:32:33.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:32:33.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:32:33.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:32:24, diff=9.722959s, valid=True
2026-06-03T14:32:33.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:32:33.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:32:33.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:32:33.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:32:33.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:32:33.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:32:33.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:32:12, diff=21.726673s, valid=True
2026-06-03T14:32:33.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:32:33.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:32:33.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:32:33.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64150.727481s, valid=False
2026-06-03T14:32:33.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:32:33.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:32:33.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:32:33.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:32:33.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:32:33.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:32:33.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:32:33.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:32:33.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:32:33.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:32:33.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:32:34.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:32:34.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:32:34.118 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:32:34.323 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:32:34.660 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:32:34.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:32:34.760 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:32:34.760 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:32:34.925 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:32:34.926 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:33:04.956 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:33:04.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:33:04.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:33:05.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:33:05.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:33:05.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:33:05.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:33:05.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:33:05.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:33:05.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:33:05.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:33:05.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:33:05.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:33:08.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:33:08.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:33:08.272 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:33:08.272 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:33:08.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:33:08.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:33:08.296 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:33:08.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:33:08.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:33:08.297 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:33:08.298 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:33:08.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:33:08.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:33:08.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:33:08.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:33:08.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:33:08.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:33:08.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:33:08.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:33:08.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:33:08.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:33:08.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:33:08.643 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:33:08.714 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:32:56
2026-06-03T14:33:08.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86271, datetime.datetime(2026, 6, 3, 14, 32, 56), datetime.datetime(2026, 6, 3, 14, 32, 55), 'salt', 7.37, 99.74, None, 35.46, 92.85, 0.03, 821.5, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:33:08.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:33:08.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:33:08.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:32:55, diff=13.721434s, valid=True
2026-06-03T14:33:08.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:33:08.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:33:08.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:33:12, diff=-3.27503s, valid=True
2026-06-03T14:33:08.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:33:08.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:33:08.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:32:52, diff=16.733267s, valid=True
2026-06-03T14:33:08.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:33:08.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:33:08.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:33:08.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:33:08.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:33:08.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:33:08.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:33:12, diff=-3.262937s, valid=True
2026-06-03T14:33:08.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:33:08.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:33:08.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:33:08.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64185.737911s, valid=False
2026-06-03T14:33:08.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:33:08.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:33:08.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:33:08.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:33:08.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:33:08.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:33:08.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:33:08.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:33:08.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:33:08.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:33:08.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:33:08.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:33:09.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:33:09.059 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:33:09.263 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:33:09.598 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:33:09.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:33:09.705 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:33:09.706 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:33:09.930 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:33:09.930 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:33:39.960 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:33:39.960 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:33:39.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:33:40.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:33:40.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:33:40.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:33:40.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:33:40.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:33:40.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:33:40.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:33:40.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:33:40.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:33:40.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:33:42.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:33:42.868 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:33:42.869 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:33:42.869 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:33:42.880 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:33:42.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:33:42.896 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:33:42.897 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:33:42.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:33:42.898 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:33:42.898 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:33:42.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:33:43.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:33:43.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:33:43.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:33:43.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:33:43.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:33:43.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:33:43.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:33:43.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:33:43.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:33:43.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:33:43.229 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:33:43.298 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:33:27
2026-06-03T14:33:43.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86272, datetime.datetime(2026, 6, 3, 14, 33, 27), datetime.datetime(2026, 6, 3, 14, 33, 25), 'salt', 7.4, 99.87, None, 36.2, 101.3, 0.01, 821.38, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:33:43.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:33:43.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:33:43.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:33:25, diff=18.306112s, valid=True
2026-06-03T14:33:43.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:33:43.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:33:43.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:33:12, diff=31.309497s, valid=True
2026-06-03T14:33:43.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:33:43.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:33:43.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:33:23, diff=20.317448s, valid=True
2026-06-03T14:33:43.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:33:43.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:33:43.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:33:43.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:33:43.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:33:43.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:33:43.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:33:12, diff=31.321047s, valid=True
2026-06-03T14:33:43.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:33:43.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:33:43.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:33:43.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64220.321823s, valid=False
2026-06-03T14:33:43.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:33:43.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:33:43.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:33:43.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:33:43.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:33:43.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:33:43.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:33:43.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:33:43.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:33:43.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:33:43.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:33:43.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:33:43.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:33:43.715 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:33:43.920 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:33:44.259 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:33:44.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:33:44.362 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:33:44.362 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:33:44.534 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:33:44.534 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:34:14.554 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:34:14.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:34:14.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:34:14.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:34:14.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:34:15.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:34:15.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:34:15.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:34:15.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:34:15.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:34:15.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:34:15.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:34:15.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:34:17.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:34:17.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:34:17.520 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:34:17.520 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:34:17.531 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:34:17.544 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:34:17.544 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:34:17.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:34:17.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:34:17.546 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:34:17.546 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:34:17.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:34:17.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:34:17.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:34:17.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:34:17.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:34:17.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:34:17.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:34:17.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:34:17.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:34:17.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:34:17.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:34:17.890 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:34:17.961 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:33:57
2026-06-03T14:34:17.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86273, datetime.datetime(2026, 6, 3, 14, 33, 57), datetime.datetime(2026, 6, 3, 14, 33, 56), 'salt', 7.3, 99.81, None, 35.42, 99.0, 0.02, 821.38, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:34:17.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:34:17.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:34:17.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:33:56, diff=21.969265s, valid=True
2026-06-03T14:34:17.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:34:17.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:34:17.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:34:12, diff=5.972758s, valid=True
2026-06-03T14:34:17.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:34:17.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:34:17.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:33:53, diff=24.980959s, valid=True
2026-06-03T14:34:17.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:34:17.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:34:17.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:34:17.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:34:17.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:34:17.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:34:17.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:34:12, diff=5.984652s, valid=True
2026-06-03T14:34:17.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:34:17.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:34:17.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:34:17.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64254.985447s, valid=False
2026-06-03T14:34:17.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:34:17.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:34:17.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:34:17.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:34:17.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:34:18.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:34:18.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:34:18.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:34:18.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:34:18.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:34:18.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:34:18.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:34:18.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:34:18.307 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:34:18.512 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:34:18.851 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:34:18.953 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:34:18.953 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:34:18.953 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:34:19.140 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:34:19.140 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:34:49.147 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:34:49.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:34:49.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:34:49.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:34:49.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:34:49.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:34:49.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:34:49.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:34:49.768 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:34:49.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:34:49.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:34:49.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:34:49.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:34:52.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:34:52.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:34:52.203 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:34:52.203 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:34:52.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:34:52.233 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:34:52.233 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:34:52.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:34:52.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:34:52.234 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:34:52.235 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:34:52.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:34:52.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:34:52.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:34:52.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:34:52.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:34:52.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T14:34:52.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:34:52.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T14:34:52.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:34:52.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:34:52.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:34:52.576 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:34:52.645 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:34:27
2026-06-03T14:34:52.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86274, datetime.datetime(2026, 6, 3, 14, 34, 27), datetime.datetime(2026, 6, 3, 14, 34, 26), 'salt', 7.34, 99.91, None, 33.55, 106.44, 0.01, 821.38, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T14:34:52.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:34:52.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:34:52.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:34:26, diff=26.652571s, valid=True
2026-06-03T14:34:52.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:34:52.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T14:34:52.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:34:12, diff=40.656055s, valid=True
2026-06-03T14:34:52.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:34:52.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:34:52.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:34:23, diff=29.664125s, valid=True
2026-06-03T14:34:52.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:34:52.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:34:52.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:34:52.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:34:52.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:34:52.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T14:34:52.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:34:12, diff=40.667839s, valid=True
2026-06-03T14:34:52.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:34:52.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:34:52.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:34:52.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64289.668629s, valid=False
2026-06-03T14:34:52.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:34:52.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:34:52.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:34:52.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:34:52.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:34:52.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:34:52.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:34:52.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:34:52.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:34:52.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:34:52.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:34:52.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:34:52.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:34:52.987 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:34:53.193 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:34:53.532 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:34:53.634 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:34:53.634 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:34:53.635 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:34:53.875 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:34:53.875 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:35:23.880 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:35:23.880 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:35:23.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:35:24.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:35:24.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:35:24.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:35:24.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:35:24.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:35:24.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:35:24.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:35:24.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:35:24.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:35:24.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:35:26.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:35:26.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:35:26.712 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:35:26.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:35:26.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:35:26.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:35:26.737 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:35:26.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:35:26.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:35:26.738 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:35:26.738 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:35:26.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:35:26.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:35:26.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:35:26.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:35:26.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:35:27.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:35:27.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:35:27.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:35:27.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:35:27.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:35:27.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:35:27.078 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:35:27.147 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:34:57
2026-06-03T14:35:27.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86275, datetime.datetime(2026, 6, 3, 14, 34, 57), datetime.datetime(2026, 6, 3, 14, 34, 57), 'salt', 7.27, 99.81, None, 35.95, 105.76, 0.02, 821.56, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T14:35:27.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:35:27.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:35:27.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:34:57, diff=30.154576s, valid=True
2026-06-03T14:35:27.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:35:27.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:35:27.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:35:12, diff=15.158075s, valid=True
2026-06-03T14:35:27.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:35:27.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:35:27.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:34:53, diff=34.166299s, valid=True
2026-06-03T14:35:27.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:35:27.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:35:27.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:35:27.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:35:27.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:35:27.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:35:27.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:35:12, diff=15.17007s, valid=True
2026-06-03T14:35:27.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:35:27.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:35:27.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:35:27.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64324.170882s, valid=False
2026-06-03T14:35:27.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:35:27.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:35:27.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:35:27.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:35:27.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:35:27.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:35:27.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:35:27.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:35:27.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:35:27.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:35:27.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:35:27.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:35:27.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:35:27.492 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:35:27.699 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:35:28.039 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:35:28.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:35:28.205 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:35:28.205 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:35:28.399 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:35:28.399 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:35:58.407 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:35:58.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:35:58.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:35:58.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:35:58.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:35:58.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:35:58.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:35:58.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:35:58.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:35:58.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:35:58.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:35:58.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:35:58.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:36:01.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:36:01.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:36:01.647 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:36:01.647 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:36:01.657 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:36:01.670 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:36:01.670 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:36:01.671 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:36:01.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:36:01.671 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:36:01.672 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:36:01.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:36:01.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:36:01.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:36:01.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:36:01.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:36:01.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:36:01.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:36:02.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:36:02.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:36:02.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:36:02.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:36:02.014 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:36:02.085 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:35:58
2026-06-03T14:36:02.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86277, datetime.datetime(2026, 6, 3, 14, 35, 58), datetime.datetime(2026, 6, 3, 14, 35, 57), 'salt', 7.3, 99.84, None, 35.0, 105.83, 0.01, 821.38, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T14:36:02.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:36:02.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:36:02.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:35:57, diff=5.092149s, valid=True
2026-06-03T14:36:02.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:36:02.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:36:02.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:36:12, diff=-9.904842s, valid=True
2026-06-03T14:36:02.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:36:02.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:36:02.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:35:54, diff=8.102023s, valid=True
2026-06-03T14:36:02.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:36:02.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:36:02.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:36:02.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:36:02.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:36:02.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:36:02.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:36:12, diff=-9.894301s, valid=True
2026-06-03T14:36:02.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:36:02.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:36:02.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:36:02.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64359.106468s, valid=False
2026-06-03T14:36:02.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:36:02.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:36:02.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:36:02.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:36:02.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:36:02.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:36:02.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:36:02.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:36:02.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:36:02.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:36:02.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:36:02.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:36:02.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:36:02.422 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:36:02.627 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:36:02.966 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:36:03.068 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:36:03.068 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:36:03.068 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:36:03.231 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:36:03.231 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:36:33.261 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:36:33.261 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:36:33.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:36:33.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:36:33.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:36:33.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:36:33.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:36:33.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:36:33.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:36:33.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:36:33.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:36:33.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:36:33.860 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:36:36.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:36:36.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:36:36.281 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:36:36.281 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:36:36.290 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:36:36.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:36:36.304 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:36:36.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:36:36.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:36:36.305 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:36:36.305 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:36:36.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:36:36.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:36:36.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:36:36.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:36:36.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:36:36.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:36:36.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:36:36.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:36:36.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:36:36.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:36:36.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:36:36.645 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:36:36.727 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:36:28
2026-06-03T14:36:36.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86278, datetime.datetime(2026, 6, 3, 14, 36, 28), datetime.datetime(2026, 6, 3, 14, 36, 28), 'salt', 7.27, 99.81, None, 29.22, 109.78, 0.02, 821.5, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T14:36:36.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:36:36.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:36:36.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:36:28, diff=8.734439s, valid=True
2026-06-03T14:36:36.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:36:36.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:36:36.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:36:12, diff=24.737889s, valid=True
2026-06-03T14:36:36.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:36:36.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:36:36.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:36:25, diff=11.745945s, valid=True
2026-06-03T14:36:36.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:36:36.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:36:36.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:36:36.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:36:36.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:36:36.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:36:36.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:36:12, diff=24.749577s, valid=True
2026-06-03T14:36:36.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:36:36.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:36:36.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:36:36.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64393.750376s, valid=False
2026-06-03T14:36:36.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:36:36.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:36:36.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:36:36.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:36:36.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:36:36.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:36:36.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:36:36.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:36:36.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:36:36.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:36:36.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:36:36.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:36:37.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:36:37.070 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:36:37.351 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:36:37.693 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:36:37.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:36:37.810 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:36:37.810 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:36:37.880 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:36:37.880 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:37:07.910 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:37:07.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:37:07.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:37:08.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:37:08.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:37:08.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:37:08.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:37:08.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:37:08.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:37:08.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:37:08.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:37:08.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:37:08.274 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:37:10.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:37:10.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:37:10.816 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:37:10.816 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:37:10.827 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:37:10.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:37:10.839 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:37:10.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:37:10.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:37:10.840 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:37:10.840 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:37:10.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:37:10.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:37:10.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:37:11.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:37:11.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:37:11.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:37:11.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:37:11.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:37:11.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:37:11.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:37:11.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:37:11.119 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:37:11.193 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:36:59
2026-06-03T14:37:11.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86279, datetime.datetime(2026, 6, 3, 14, 36, 59), datetime.datetime(2026, 6, 3, 14, 36, 58), 'salt', 7.34, 99.84, None, 30.84, 105.79, 0.02, 821.38, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:37:11.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:37:11.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:37:11.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:36:58, diff=13.200154s, valid=True
2026-06-03T14:37:11.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:37:11.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:37:11.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:37:12, diff=-0.796647s, valid=True
2026-06-03T14:37:11.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:37:11.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:37:11.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:36:56, diff=15.210826s, valid=True
2026-06-03T14:37:11.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:37:11.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:37:11.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:37:11.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:37:11.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:37:11.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:37:11.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:37:12, diff=-0.785749s, valid=True
2026-06-03T14:37:11.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:37:11.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:37:11.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:37:11.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64428.215018s, valid=False
2026-06-03T14:37:11.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:37:11.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:37:11.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:37:11.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:37:11.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:37:11.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:37:11.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:37:11.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:37:11.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:37:11.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:37:11.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:37:11.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:37:11.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:37:11.531 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:37:11.729 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:37:12.061 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:37:12.161 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:37:12.161 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:37:12.161 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:37:12.390 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:37:12.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:37:42.420 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:37:42.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:37:42.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:37:42.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:37:42.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:37:43.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:37:43.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:37:43.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:37:43.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:37:43.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:37:43.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:37:43.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:37:43.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:37:45.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:37:45.893 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:37:45.894 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:37:45.895 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:37:45.905 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:37:45.918 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:37:45.919 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:37:45.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:37:45.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:37:45.920 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:37:45.920 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:37:45.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:37:46.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:37:46.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:37:46.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:37:46.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:37:46.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:37:46.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:37:46.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:37:46.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:37:46.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:37:46.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:37:46.255 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:37:46.327 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:37:29
2026-06-03T14:37:46.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86280, datetime.datetime(2026, 6, 3, 14, 37, 29), datetime.datetime(2026, 6, 3, 14, 37, 28), 'salt', 7.37, 99.84, None, 35.21, 112.99, 0.02, 821.19, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:37:46.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:37:46.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:37:46.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:37:28, diff=18.334707s, valid=True
2026-06-03T14:37:46.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:37:46.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:37:46.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:37:12, diff=34.338293s, valid=True
2026-06-03T14:37:46.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:37:46.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:37:46.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:37:28, diff=18.346238s, valid=True
2026-06-03T14:37:46.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:37:46.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:37:46.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:37:46.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:37:46.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:37:46.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:37:46.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:37:12, diff=34.350008s, valid=True
2026-06-03T14:37:46.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:37:46.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:37:46.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:37:46.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64463.350817s, valid=False
2026-06-03T14:37:46.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:37:46.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:37:46.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:37:46.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:37:46.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:37:46.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:37:46.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:37:46.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:37:46.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:37:46.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:37:46.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:37:46.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:37:46.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:37:46.745 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:37:46.943 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:37:47.276 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:37:47.375 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:37:47.375 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:37:47.376 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:37:47.530 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:37:47.530 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:38:17.560 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:38:17.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:38:17.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:38:17.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:38:17.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:38:18.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:38:18.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:38:18.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:38:18.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:38:18.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:38:18.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:38:18.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:38:18.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:38:20.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:38:20.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:38:20.548 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:38:20.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:38:20.560 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:38:20.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:38:20.573 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:38:20.574 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:38:20.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:38:20.574 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:38:20.575 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:38:20.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:38:20.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:38:20.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:38:20.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:38:20.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:38:20.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:38:20.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:38:20.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:38:20.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:38:20.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:38:20.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:38:20.908 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:38:20.978 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:37:59
2026-06-03T14:38:20.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86281, datetime.datetime(2026, 6, 3, 14, 37, 59), datetime.datetime(2026, 6, 3, 14, 37, 59), 'salt', 7.3, 99.74, None, 36.06, 101.47, 0.03, 821.32, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:38:20.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:38:20.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:38:20.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:37:59, diff=21.986002s, valid=True
2026-06-03T14:38:20.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:38:20.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:38:20.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:38:12, diff=8.989565s, valid=True
2026-06-03T14:38:20.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:38:20.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:38:20.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:37:59, diff=21.997772s, valid=True
2026-06-03T14:38:20.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:38:20.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:38:20.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:38:20.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:38:20.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:38:20.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:38:21.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:38:12, diff=9.001497s, valid=True
2026-06-03T14:38:21.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:38:21.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:38:21.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:38:21.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64498.002346s, valid=False
2026-06-03T14:38:21.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:38:21.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:38:21.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:38:21.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:38:21.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:38:21.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:38:21.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:38:21.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:38:21.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:38:21.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:38:21.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:38:21.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:38:21.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:38:21.324 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:38:21.525 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:38:21.861 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:38:21.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:38:21.963 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:38:21.963 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:38:22.172 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:38:22.172 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:38:52.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:38:52.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:38:52.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:38:52.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:38:52.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:38:52.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:38:52.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:38:52.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:38:52.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:38:52.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:38:52.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:38:52.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:38:52.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:38:55.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:38:55.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:38:55.320 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:38:55.320 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:38:55.330 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:38:55.343 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:38:55.344 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:38:55.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:38:55.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:38:55.345 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:38:55.345 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:38:55.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:38:55.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:38:55.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:38:55.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:38:55.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:38:55.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T14:38:55.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:38:55.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T14:38:55.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:38:55.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:38:55.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:38:55.693 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:38:55.770 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:38:30
2026-06-03T14:38:55.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86282, datetime.datetime(2026, 6, 3, 14, 38, 30), datetime.datetime(2026, 6, 3, 14, 38, 29), 'salt', 7.2, 99.81, None, 44.1, 105.5, 0.02, 821.32, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:38:55.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:38:55.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:38:55.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:38:29, diff=26.777733s, valid=True
2026-06-03T14:38:55.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:38:55.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T14:38:55.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:38:12, diff=43.781191s, valid=True
2026-06-03T14:38:55.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:38:55.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:38:55.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:38:25, diff=30.789394s, valid=True
2026-06-03T14:38:55.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:38:55.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:38:55.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:38:55.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:38:55.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:38:55.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T14:38:55.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:38:12, diff=43.793097s, valid=True
2026-06-03T14:38:55.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:38:55.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:38:55.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:38:55.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64532.79391s, valid=False
2026-06-03T14:38:55.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:38:55.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:38:55.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:38:55.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:38:55.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:38:55.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:38:55.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:38:55.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:38:55.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:38:55.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:38:56.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:38:56.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:38:56.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:38:56.184 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:38:56.381 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:38:56.713 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:38:56.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:38:56.814 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:38:56.814 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:38:57.037 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:38:57.037 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:39:27.046 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:39:27.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:39:27.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:39:27.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:39:27.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:39:27.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:39:27.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:39:27.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:39:27.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:39:27.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:39:27.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:39:27.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:39:27.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:39:29.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:39:29.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:39:29.804 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:39:29.804 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:39:29.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:39:29.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:39:29.826 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:39:29.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:39:29.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:39:29.826 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:39:29.826 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:39:29.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:39:29.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:39:29.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:39:30.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:39:30.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:39:30.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:39:30.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:39:30.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:39:30.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:39:30.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:39:30.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:39:30.128 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:39:30.197 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:39:00
2026-06-03T14:39:30.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86283, datetime.datetime(2026, 6, 3, 14, 39), datetime.datetime(2026, 6, 3, 14, 38, 59), 'salt', 7.1, 99.71, None, 39.91, 106.28, 0.03, 821.26, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:39:30.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:39:30.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:39:30.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:38:59, diff=31.204707s, valid=True
2026-06-03T14:39:30.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:39:30.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:39:30.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:39:12, diff=18.207786s, valid=True
2026-06-03T14:39:30.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:39:30.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:39:30.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:38:55, diff=35.21486s, valid=True
2026-06-03T14:39:30.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:39:30.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:39:30.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:39:30.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:39:30.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:39:30.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:39:30.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:39:12, diff=18.218077s, valid=True
2026-06-03T14:39:30.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:39:30.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:39:30.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:39:30.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64567.218772s, valid=False
2026-06-03T14:39:30.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:39:30.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:39:30.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:39:30.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:39:30.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:39:30.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:39:30.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:39:30.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:39:30.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:39:30.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:39:30.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:39:30.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:39:30.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:39:30.551 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:39:30.770 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:39:31.102 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:39:31.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:39:31.205 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:39:31.205 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:39:31.370 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:39:31.370 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:40:01.401 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:40:01.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:40:01.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:40:01.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:40:01.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:40:01.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:40:01.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:40:01.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:40:01.792 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:40:01.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:40:01.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:40:01.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:40:01.806 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:40:04.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:40:04.107 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:40:04.107 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:40:04.107 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:40:04.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:40:04.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:40:04.127 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:40:04.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:40:04.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:40:04.128 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:40:04.128 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:40:04.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:40:04.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:40:04.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:40:04.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:40:04.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:40:04.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:40:04.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:40:04.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:40:04.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:40:04.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:40:04.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:40:04.408 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:40:04.487 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:40:00
2026-06-03T14:40:04.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86285, datetime.datetime(2026, 6, 3, 14, 40), datetime.datetime(2026, 6, 3, 14, 40), 'salt', 7.1, 100.14, None, 36.34, 105.03, -0.03, 821.2, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:40:04.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:40:04.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:40:04.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:40:00, diff=4.493237s, valid=True
2026-06-03T14:40:04.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:40:04.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:40:04.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:40:12, diff=-7.503907s, valid=True
2026-06-03T14:40:04.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:40:04.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:40:04.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:39:56, diff=8.502687s, valid=True
2026-06-03T14:40:04.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:40:04.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:40:04.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:40:04.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:40:04.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:40:04.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:40:04.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:40:12, diff=-7.49417s, valid=True
2026-06-03T14:40:04.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:40:04.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:40:04.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:40:04.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64601.5065s, valid=False
2026-06-03T14:40:04.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:40:04.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:40:04.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:40:04.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:40:04.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:40:04.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:40:04.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:40:04.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:40:04.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:40:04.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:40:04.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:40:04.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:40:04.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:40:04.888 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:40:05.085 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:40:05.416 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:40:05.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:40:05.517 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:40:05.517 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:40:05.682 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:40:05.682 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:40:35.712 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:40:35.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:40:35.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:40:35.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:40:35.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:40:36.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:40:36.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:40:36.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:40:36.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:40:36.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:40:36.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:40:36.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:40:36.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:40:38.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:40:38.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:40:38.613 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:40:38.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:40:38.623 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:40:38.636 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:40:38.636 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:40:38.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:40:38.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:40:38.637 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:40:38.638 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:40:38.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:40:38.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:40:38.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:40:38.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:40:38.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:40:38.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:40:38.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:40:38.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:40:38.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:40:38.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:40:38.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:40:38.978 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:40:39.052 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:40:31
2026-06-03T14:40:39.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86286, datetime.datetime(2026, 6, 3, 14, 40, 31), datetime.datetime(2026, 6, 3, 14, 40, 30), 'salt', 7.24, 99.81, None, 38.21, 103.34, 0.02, 821.26, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:40:39.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:40:39.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:40:39.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:40:30, diff=9.060189s, valid=True
2026-06-03T14:40:39.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:40:39.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:40:39.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:40:12, diff=27.063739s, valid=True
2026-06-03T14:40:39.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:40:39.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:40:39.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:40:26, diff=13.072032s, valid=True
2026-06-03T14:40:39.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:40:39.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:40:39.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:40:39.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:40:39.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:40:39.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:40:39.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:40:12, diff=27.075786s, valid=True
2026-06-03T14:40:39.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:40:39.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:40:39.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:40:39.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64636.076587s, valid=False
2026-06-03T14:40:39.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:40:39.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:40:39.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:40:39.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:40:39.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:40:39.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:40:39.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:40:39.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:40:39.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:40:39.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:40:39.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:40:39.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:40:39.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:40:39.398 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:40:39.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:40:39.963 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:40:40.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:40:40.075 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:40:40.075 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:40:40.143 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:40:40.143 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:41:10.173 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:41:10.173 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:41:10.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:41:10.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:41:10.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:41:10.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:41:10.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:41:10.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:41:10.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:41:10.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:41:10.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:41:10.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:41:10.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:41:13.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:41:13.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:41:13.857 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:41:13.857 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:41:13.867 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:41:13.880 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:41:13.881 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:41:13.881 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:41:13.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:41:13.882 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:41:13.882 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:41:13.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:41:14.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:41:14.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:41:14.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:41:14.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:41:14.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:41:14.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:41:14.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:41:14.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:41:14.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:41:14.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:41:14.233 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:41:14.310 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:41:01
2026-06-03T14:41:14.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86287, datetime.datetime(2026, 6, 3, 14, 41, 1), datetime.datetime(2026, 6, 3, 14, 41), 'salt', 7.24, 99.84, None, 38.49, 110.57, 0.02, 821.32, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:41:14.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:41:14.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:41:14.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:41:00, diff=14.317456s, valid=True
2026-06-03T14:41:14.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:41:14.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:41:14.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:41:12, diff=2.320962s, valid=True
2026-06-03T14:41:14.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:41:14.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:41:14.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:40:57, diff=17.329067s, valid=True
2026-06-03T14:41:14.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:41:14.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:41:14.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:41:14.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:41:14.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:41:14.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:41:14.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:41:12, diff=2.332823s, valid=True
2026-06-03T14:41:14.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:41:14.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:41:14.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:41:14.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64671.33361s, valid=False
2026-06-03T14:41:14.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:41:14.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:41:14.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:41:14.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:41:14.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:41:14.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:41:14.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:41:14.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:41:14.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:41:14.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:41:14.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:41:14.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:41:14.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:41:14.653 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:41:14.850 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:41:15.180 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:41:15.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:41:15.280 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:41:15.280 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:41:15.567 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:41:15.567 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:41:45.590 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:41:45.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:41:45.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:41:45.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:41:45.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:41:45.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:41:45.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:41:45.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:41:45.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:41:45.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:41:45.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:41:45.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:41:45.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:41:48.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:41:48.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:41:48.471 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:41:48.471 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:41:48.481 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:41:48.494 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:41:48.495 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:41:48.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:41:48.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:41:48.496 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:41:48.496 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:41:48.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:41:48.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:41:48.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:41:48.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:41:48.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:41:48.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:41:48.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:41:48.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:41:48.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:41:48.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:41:48.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:41:48.836 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:41:48.909 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:41:31
2026-06-03T14:41:48.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86288, datetime.datetime(2026, 6, 3, 14, 41, 31), datetime.datetime(2026, 6, 3, 14, 41, 31), 'salt', 7.1, 99.81, None, 36.48, 107.31, 0.02, 821.32, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:41:48.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:41:48.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:41:48.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:41:31, diff=17.91733s, valid=True
2026-06-03T14:41:48.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:41:48.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:41:48.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:41:12, diff=36.920834s, valid=True
2026-06-03T14:41:48.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:41:48.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:41:48.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:41:29, diff=19.928883s, valid=True
2026-06-03T14:41:48.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:41:48.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:41:48.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:41:48.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:41:48.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:41:48.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:41:48.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:41:12, diff=36.932667s, valid=True
2026-06-03T14:41:48.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:41:48.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:41:48.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:41:48.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64705.933491s, valid=False
2026-06-03T14:41:48.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:41:48.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:41:48.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:41:48.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:41:48.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:41:49.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:41:49.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:41:49.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:41:49.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:41:49.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:41:49.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:41:49.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:41:49.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:41:49.254 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:41:49.450 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:41:49.841 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:41:49.947 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:41:49.947 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:41:49.947 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:41:50.099 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:41:50.099 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:42:20.129 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:42:20.130 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:42:20.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:42:20.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:42:20.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:42:20.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:42:20.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:42:20.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:42:20.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:42:20.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:42:20.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:42:20.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:42:20.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:42:23.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:42:23.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:42:23.328 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:42:23.328 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:42:23.338 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:42:23.351 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:42:23.351 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:42:23.352 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:42:23.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:42:23.353 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:42:23.353 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:42:23.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:42:23.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:42:23.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:42:23.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:42:23.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:42:23.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:42:23.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:42:23.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T14:42:23.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:42:23.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:42:23.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:42:23.701 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:42:23.773 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:42:02
2026-06-03T14:42:23.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86289, datetime.datetime(2026, 6, 3, 14, 42, 2), datetime.datetime(2026, 6, 3, 14, 42, 1), 'salt', 7.17, 99.87, None, 35.85, 102.1, 0.01, 821.26, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:42:23.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:42:23.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:42:23.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:42:01, diff=22.780521s, valid=True
2026-06-03T14:42:23.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:42:23.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:42:23.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:42:12, diff=11.78397s, valid=True
2026-06-03T14:42:23.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:42:23.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:42:23.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:42:00, diff=23.792038s, valid=True
2026-06-03T14:42:23.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:42:23.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:42:23.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:42:23.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:42:23.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:42:23.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T14:42:23.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:42:12, diff=11.795701s, valid=True
2026-06-03T14:42:23.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:42:23.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:42:23.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:42:23.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64740.796573s, valid=False
2026-06-03T14:42:23.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:42:23.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:42:23.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:42:23.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:42:23.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:42:23.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:42:23.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:42:23.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:42:23.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:42:23.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:42:23.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:42:24.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:42:24.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:42:24.114 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:42:24.312 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:42:24.643 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:42:24.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:42:24.743 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:42:24.743 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:42:24.812 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:42:24.812 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:42:54.842 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:42:54.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:42:54.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:42:55.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:42:55.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:42:55.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:42:55.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:42:55.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:42:55.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:42:55.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:42:55.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:42:55.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:42:55.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:42:58.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:42:58.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:42:58.342 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:42:58.342 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:42:58.352 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:42:58.364 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:42:58.365 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:42:58.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:42:58.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:42:58.366 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:42:58.366 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:42:58.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:42:58.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:42:58.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:42:58.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:42:58.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:42:58.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T14:42:58.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:42:58.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T14:42:58.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:42:58.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:42:58.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:42:58.711 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:42:58.782 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:42:32
2026-06-03T14:42:58.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86290, datetime.datetime(2026, 6, 3, 14, 42, 32), datetime.datetime(2026, 6, 3, 14, 42, 31), 'salt', 7.2, 99.81, None, 32.07, 101.16, 0.02, 821.38, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:42:58.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:42:58.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:42:58.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:42:31, diff=27.789786s, valid=True
2026-06-03T14:42:58.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:42:58.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T14:42:58.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:42:12, diff=46.793246s, valid=True
2026-06-03T14:42:58.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:42:58.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:42:58.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:42:32, diff=26.801504s, valid=True
2026-06-03T14:42:58.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:42:58.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:42:58.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:42:58.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:42:58.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:42:58.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T14:42:58.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:42:12, diff=46.805251s, valid=True
2026-06-03T14:42:58.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:42:58.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:42:58.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:42:58.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64775.806066s, valid=False
2026-06-03T14:42:58.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:42:58.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:42:58.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:42:58.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:42:58.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:42:58.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:42:58.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:42:58.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:42:58.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:42:58.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:42:59.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:42:59.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:42:59.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:42:59.129 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:42:59.401 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:42:59.731 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:42:59.831 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:42:59.831 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:42:59.831 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:43:00.014 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:43:00.014 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:43:30.044 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:43:30.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:43:30.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:43:30.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:43:30.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:43:30.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:43:30.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:43:30.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:43:30.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:43:30.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:43:30.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:43:30.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:43:30.428 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:43:33.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:43:33.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:43:33.148 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:43:33.148 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:43:33.158 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:43:33.170 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:43:33.171 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:43:33.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:43:33.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:43:33.172 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:43:33.172 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:43:33.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:43:33.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:43:33.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:43:33.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:43:33.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:43:33.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T14:43:33.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:43:33.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T14:43:33.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:43:33.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:43:33.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:43:33.497 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:43:33.566 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:43:32
2026-06-03T14:43:33.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86292, datetime.datetime(2026, 6, 3, 14, 43, 32), datetime.datetime(2026, 6, 3, 14, 43, 31), 'salt', 7.24, 99.87, None, 38.04, 106.56, 0.02, 821.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:43:33.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:43:33.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:43:33.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:43:31, diff=2.573981s, valid=True
2026-06-03T14:43:33.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:43:33.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T14:43:33.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:42:12, diff=81.577393s, valid=True
2026-06-03T14:43:33.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:43:33.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:43:33.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:43:27, diff=6.585292s, valid=True
2026-06-03T14:43:33.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:43:33.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:43:33.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:43:33.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:43:33.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:43:33.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T14:43:33.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:42:12, diff=81.588922s, valid=True
2026-06-03T14:43:33.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:43:33.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:43:33.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:43:33.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64810.589718s, valid=False
2026-06-03T14:43:33.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:43:33.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:43:33.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:43:33.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:43:33.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:43:33.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:43:33.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:43:33.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:43:33.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:43:33.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:43:33.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:43:33.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:43:33.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:43:33.909 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:43:34.107 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:43:34.444 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:43:34.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:43:34.545 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:43:34.545 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:43:34.720 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:43:34.721 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:44:04.721 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:44:04.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:44:04.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:44:04.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:44:04.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:44:05.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:44:05.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:44:05.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:44:05.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:44:05.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:44:05.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:44:05.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:44:05.128 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:44:07.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:44:07.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:44:07.564 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:44:07.564 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:44:07.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:44:07.585 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:44:07.586 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:44:07.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:44:07.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:44:07.586 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:44:07.586 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:44:07.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:44:07.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:44:07.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:44:07.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:44:07.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:44:07.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:44:07.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:44:07.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:44:07.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:44:07.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:44:07.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:44:07.919 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:44:07.987 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:44:02
2026-06-03T14:44:07.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86293, datetime.datetime(2026, 6, 3, 14, 44, 2), datetime.datetime(2026, 6, 3, 14, 44, 2), 'salt', 7.24, 99.84, None, 35.71, 103.39, 0.02, 821.32, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:44:07.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:44:07.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:44:07.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:44:02, diff=5.995099s, valid=True
2026-06-03T14:44:07.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:44:07.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:44:07.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:42:12, diff=115.998581s, valid=True
2026-06-03T14:44:07.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:44:07.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:44:08.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:43:58, diff=10.006654s, valid=True
2026-06-03T14:44:08.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:44:08.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:44:08.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:44:08.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:44:08.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:44:08.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:44:08.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:42:12, diff=116.010365s, valid=True
2026-06-03T14:44:08.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:44:08.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:44:08.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:44:08.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64845.011195s, valid=False
2026-06-03T14:44:08.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:44:08.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:44:08.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:44:08.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:44:08.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:44:08.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:44:08.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:44:08.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:44:08.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:44:08.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:44:08.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:44:08.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:44:08.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:44:08.333 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:44:08.597 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:44:08.927 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:44:09.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:44:09.030 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:44:09.030 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:44:09.258 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:44:09.258 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:44:39.274 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:44:39.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:44:39.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:44:39.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:44:39.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:44:39.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:44:39.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:44:39.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:44:39.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:44:39.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:44:39.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:44:39.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:44:39.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:44:42.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:44:42.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:44:42.752 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:44:42.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:44:42.762 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:44:42.775 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:44:42.776 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:44:42.776 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:44:42.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:44:42.777 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:44:42.777 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:44:42.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:44:42.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:44:42.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:44:43.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:44:43.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:44:43.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:44:43.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:44:43.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:44:43.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:44:43.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:44:43.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:44:43.119 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:44:43.190 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:44:33
2026-06-03T14:44:43.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86294, datetime.datetime(2026, 6, 3, 14, 44, 33), datetime.datetime(2026, 6, 3, 14, 44, 32), 'salt', 7.17, 99.77, None, 35.57, 92.59, 0.03, 821.38, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:44:43.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:44:43.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:44:43.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:44:32, diff=11.197722s, valid=True
2026-06-03T14:44:43.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:44:43.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:44:43.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:42:12, diff=151.201068s, valid=True
2026-06-03T14:44:43.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:44:43.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:44:43.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:44:28, diff=15.209029s, valid=True
2026-06-03T14:44:43.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:44:43.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:44:43.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:44:43.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:44:43.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:44:43.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:44:43.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:42:12, diff=151.212606s, valid=True
2026-06-03T14:44:43.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:44:43.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:44:43.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:44:43.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64880.213396s, valid=False
2026-06-03T14:44:43.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:44:43.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:44:43.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:44:43.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:44:43.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:44:43.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:44:43.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:44:43.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:44:43.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:44:43.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:44:43.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:44:43.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:44:43.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:44:43.537 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:44:43.741 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:44:44.075 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:44:44.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:44:44.181 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:44:44.181 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:44:44.253 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:44:44.253 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:45:14.274 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:45:14.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:45:14.274 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:45:14.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:45:14.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:45:14.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:45:14.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:45:14.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:45:14.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:45:14.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:45:14.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:45:14.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:45:14.671 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:45:17.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:45:17.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:45:17.104 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:45:17.104 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:45:17.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:45:17.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:45:17.128 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:45:17.129 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:45:17.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:45:17.129 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:45:17.129 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:45:17.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:45:17.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:45:17.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:45:17.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:45:17.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:45:17.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:45:17.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:45:17.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:45:17.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:45:17.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:45:17.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:45:17.458 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:45:17.527 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:45:03
2026-06-03T14:45:17.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86295, datetime.datetime(2026, 6, 3, 14, 45, 3), datetime.datetime(2026, 6, 3, 14, 45, 2), 'salt', 7.3, 99.87, None, 36.73, 111.58, 0.01, 821.38, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:45:17.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:45:17.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:45:17.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:45:02, diff=15.53522s, valid=True
2026-06-03T14:45:17.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:45:17.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:45:17.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:42:12, diff=185.538665s, valid=True
2026-06-03T14:45:17.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:45:17.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:45:17.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:44:58, diff=19.546749s, valid=True
2026-06-03T14:45:17.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:45:17.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:45:17.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:45:17.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:45:17.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:45:17.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:45:17.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:42:12, diff=185.550468s, valid=True
2026-06-03T14:45:17.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:45:17.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:45:17.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:45:17.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64914.55128s, valid=False
2026-06-03T14:45:17.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:45:17.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:45:17.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:45:17.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:45:17.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:45:17.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:45:17.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:45:17.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:45:17.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:45:17.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:45:17.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:45:17.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:45:17.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:45:17.946 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:45:18.145 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:45:18.475 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:45:18.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:45:18.575 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:45:18.575 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:45:18.774 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:45:18.774 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:45:48.804 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:45:48.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:45:48.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:45:49.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:45:49.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:45:49.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:45:49.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:45:49.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:45:49.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:45:49.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:45:49.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:45:49.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:45:49.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:45:51.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:45:51.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:45:51.818 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:45:51.818 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:45:51.827 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:45:51.840 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:45:51.840 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:45:51.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:45:51.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:45:51.841 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:45:51.842 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:45:51.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:45:51.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:45:51.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:45:52.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:45:52.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:45:52.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:45:52.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:45:52.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:45:52.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:45:52.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:45:52.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:45:52.180 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:45:52.251 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:45:35
2026-06-03T14:45:52.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86296, datetime.datetime(2026, 6, 3, 14, 45, 35), datetime.datetime(2026, 6, 3, 14, 45, 32), 'salt', 7.3, 99.84, None, 33.63, 111.91, 0.01, 821.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:45:52.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:45:52.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:45:52.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:45:32, diff=20.259395s, valid=True
2026-06-03T14:45:52.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:45:52.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:45:52.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:46:12, diff=-19.736943s, valid=True
2026-06-03T14:45:52.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:45:52.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:45:52.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:45:30, diff=22.271546s, valid=True
2026-06-03T14:45:52.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:45:52.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:45:52.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:45:52.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:45:52.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:45:52.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:45:52.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:46:12, diff=-19.724607s, valid=True
2026-06-03T14:45:52.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:45:52.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:45:52.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:45:52.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64949.276242s, valid=False
2026-06-03T14:45:52.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:45:52.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:45:52.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:45:52.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:45:52.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:45:52.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:45:52.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:45:52.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:45:52.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:45:52.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:45:52.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:45:52.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:45:52.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:45:52.605 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:45:52.803 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:45:53.135 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:45:53.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:45:53.237 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:45:53.237 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:45:53.443 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:45:53.443 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:46:23.473 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:46:23.473 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:46:23.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:46:23.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:46:23.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:46:23.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:46:23.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:46:23.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:46:23.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:46:23.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:46:23.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:46:23.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:46:23.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:46:26.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:46:26.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:46:26.614 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:46:26.615 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:46:26.624 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:46:26.637 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:46:26.637 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:46:26.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:46:26.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:46:26.638 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:46:26.639 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:46:26.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:46:26.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:46:26.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:46:26.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:46:26.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:46:26.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:46:26.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:46:26.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:46:26.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:46:26.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:46:26.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:46:26.968 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:46:27.036 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:46:05
2026-06-03T14:46:27.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86297, datetime.datetime(2026, 6, 3, 14, 46, 5), datetime.datetime(2026, 6, 3, 14, 46, 4), 'salt', 7.27, 99.87, None, 34.23, 112.0, 0.01, 821.19, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:46:27.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:46:27.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:46:27.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:46:04, diff=23.042859s, valid=True
2026-06-03T14:46:27.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:46:27.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:46:27.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:46:12, diff=15.045713s, valid=True
2026-06-03T14:46:27.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:46:27.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:46:27.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:46:01, diff=26.052375s, valid=True
2026-06-03T14:46:27.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:46:27.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:46:27.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:46:27.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:46:27.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:46:27.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:46:27.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:46:12, diff=15.055426s, valid=True
2026-06-03T14:46:27.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:46:27.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:46:27.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:46:27.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=64984.056089s, valid=False
2026-06-03T14:46:27.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:46:27.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:46:27.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:46:27.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:46:27.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:46:27.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:46:27.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:46:27.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:46:27.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:46:27.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:46:27.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:46:27.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:46:27.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:46:27.443 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:46:27.641 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:46:27.974 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:46:28.081 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:46:28.081 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:46:28.081 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:46:28.336 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:46:28.336 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:46:58.366 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:46:58.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:46:58.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:46:58.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:46:58.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:46:59.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:46:59.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:46:59.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:46:59.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:46:59.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:46:59.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:46:59.117 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:46:59.117 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:47:01.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:47:01.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:47:01.613 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:47:01.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:47:01.623 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:47:01.637 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:47:01.638 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:47:01.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:47:01.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:47:01.639 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:47:01.639 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:47:01.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:47:01.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:47:01.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:47:01.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:47:01.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:47:01.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:47:01.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:47:01.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:47:01.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:47:01.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:47:01.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:47:01.978 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:47:02.049 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:46:35
2026-06-03T14:47:02.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86298, datetime.datetime(2026, 6, 3, 14, 46, 35), datetime.datetime(2026, 6, 3, 14, 46, 34), 'salt', 7.24, 99.91, None, 34.33, 112.61, 0.01, 821.25, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:47:02.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:47:02.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:47:02.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:46:34, diff=28.05564s, valid=True
2026-06-03T14:47:02.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:47:02.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:47:02.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:47:12, diff=-9.94125s, valid=True
2026-06-03T14:47:02.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:47:02.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:47:02.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:46:33, diff=29.067412s, valid=True
2026-06-03T14:47:02.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:47:02.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:47:02.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:47:02.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:47:02.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:47:02.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:47:02.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:47:12, diff=-9.929247s, valid=True
2026-06-03T14:47:02.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:47:02.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:47:02.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:47:02.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65019.071459s, valid=False
2026-06-03T14:47:02.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:47:02.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:47:02.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:47:02.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:47:02.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:47:02.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:47:02.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:47:02.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:47:02.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:47:02.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:47:02.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:47:02.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:47:02.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:47:02.418 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:47:02.633 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:47:02.979 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:47:03.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:47:03.090 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:47:03.090 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:47:03.259 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:47:03.259 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:47:33.272 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:47:33.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:47:33.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:47:33.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:47:33.437 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:47:33.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:47:33.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:47:33.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:47:33.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:47:33.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:47:33.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:47:33.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:47:33.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:47:36.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:47:36.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:47:36.164 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:47:36.165 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:47:36.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:47:36.187 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:47:36.188 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:47:36.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:47:36.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:47:36.189 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:47:36.189 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:47:36.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:47:36.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:47:36.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:47:36.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:47:36.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:47:36.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:47:36.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:47:36.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:47:36.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:47:36.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:47:36.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:47:36.520 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:47:36.596 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:47:36
2026-06-03T14:47:36.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86300, datetime.datetime(2026, 6, 3, 14, 47, 36), datetime.datetime(2026, 6, 3, 14, 47, 35), 'salt', 7.3, 99.91, None, 32.85, 110.31, 0.0, 821.19, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:47:36.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:47:36.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:47:36.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:47:35, diff=1.604131s, valid=True
2026-06-03T14:47:36.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:47:36.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:47:36.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:48:12, diff=-35.392333s, valid=True
2026-06-03T14:47:36.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:47:36.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:47:36.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:47:35, diff=1.615745s, valid=True
2026-06-03T14:47:36.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:47:36.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:47:36.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:47:36.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:47:36.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:47:36.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:47:36.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:48:12, diff=-35.380581s, valid=True
2026-06-03T14:47:36.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:47:36.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:47:36.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:47:36.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65053.620233s, valid=False
2026-06-03T14:47:36.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:47:36.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:47:36.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:47:36.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:47:36.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:47:36.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:47:36.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:47:36.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:47:36.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:47:36.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:47:36.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:47:36.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:47:36.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:47:36.939 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:47:37.138 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:47:37.494 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:47:37.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:47:37.597 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:47:37.597 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:47:37.746 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:47:37.747 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:48:07.777 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:48:07.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:48:07.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:48:07.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:48:07.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:48:08.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:48:08.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:48:08.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:48:08.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:48:08.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:48:08.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:48:08.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:48:08.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:48:10.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:48:10.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:48:10.542 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:48:10.542 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:48:10.550 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:48:10.562 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:48:10.562 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:48:10.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:48:10.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:48:10.562 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:48:10.563 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:48:10.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:48:10.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:48:10.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:48:10.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:48:10.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:48:10.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:48:10.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:48:10.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:48:10.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:48:10.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:48:10.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:48:10.834 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:48:10.906 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:48:06
2026-06-03T14:48:10.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86301, datetime.datetime(2026, 6, 3, 14, 48, 6), datetime.datetime(2026, 6, 3, 14, 48, 5), 'salt', 7.2, 99.84, None, 33.77, 114.44, 0.01, 821.19, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:48:10.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:48:10.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:48:10.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:48:05, diff=5.912516s, valid=True
2026-06-03T14:48:10.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:48:10.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:48:10.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:48:12, diff=-1.084652s, valid=True
2026-06-03T14:48:10.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:48:10.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:48:10.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:47:59, diff=11.921889s, valid=True
2026-06-03T14:48:10.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:48:10.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:48:10.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:48:10.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:48:10.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:48:10.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:48:10.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:48:12, diff=-1.075082s, valid=True
2026-06-03T14:48:10.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:48:10.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:48:10.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:48:10.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65087.925568s, valid=False
2026-06-03T14:48:10.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:48:10.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:48:10.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:48:10.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:48:10.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:48:10.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:48:10.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:48:10.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:48:11.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:48:11.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:48:11.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:48:11.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:48:11.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:48:11.239 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:48:11.435 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:48:11.824 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:48:11.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:48:11.923 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:48:11.923 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:48:12.100 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:48:12.100 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:48:42.116 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:48:42.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:48:42.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:48:42.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:48:42.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:48:42.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:48:42.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:48:42.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:48:42.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:48:42.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:48:42.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:48:42.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:48:42.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:48:44.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:48:44.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:48:44.924 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:48:44.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:48:44.932 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:48:44.944 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:48:44.945 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:48:44.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:48:44.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:48:44.945 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:48:44.946 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:48:44.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:48:45.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:48:45.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:48:45.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:48:45.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:48:45.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:48:45.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:48:45.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:48:45.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:48:45.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:48:45.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:48:45.276 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:48:45.347 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:48:36
2026-06-03T14:48:45.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86302, datetime.datetime(2026, 6, 3, 14, 48, 36), datetime.datetime(2026, 6, 3, 14, 48, 35), 'salt', 7.2, 100.01, None, 37.44, 113.29, -0.01, 821.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:48:45.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:48:45.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:48:45.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:48:35, diff=10.354576s, valid=True
2026-06-03T14:48:45.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:48:45.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:48:45.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:49:12, diff=-26.641962s, valid=True
2026-06-03T14:48:45.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:48:45.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:48:45.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:48:30, diff=15.366198s, valid=True
2026-06-03T14:48:45.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:48:45.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:48:45.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:48:45.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:48:45.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:48:45.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:48:45.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:49:12, diff=-26.630057s, valid=True
2026-06-03T14:48:45.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:48:45.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:48:45.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:48:45.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65122.370752s, valid=False
2026-06-03T14:48:45.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:48:45.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:48:45.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:48:45.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:48:45.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:48:45.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:48:45.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:48:45.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:48:45.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:48:45.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:48:45.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:48:45.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:48:45.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:48:45.689 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:48:45.886 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:48:46.216 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:48:46.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:48:46.316 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:48:46.316 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:48:46.510 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:48:46.510 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:49:16.540 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:49:16.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:49:16.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:49:16.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:49:16.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:49:17.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:49:17.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:49:17.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:49:17.090 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:49:17.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:49:17.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:49:17.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:49:17.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:49:19.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:49:19.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:49:19.558 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:49:19.559 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:49:19.570 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:49:19.582 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:49:19.583 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:49:19.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:49:19.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:49:19.584 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:49:19.584 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:49:19.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:49:19.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:49:19.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:49:19.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:49:19.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:49:19.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:49:19.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:49:19.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:49:19.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:49:19.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:49:19.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:49:19.912 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:49:19.982 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:49:06
2026-06-03T14:49:19.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86303, datetime.datetime(2026, 6, 3, 14, 49, 6), datetime.datetime(2026, 6, 3, 14, 49, 6), 'salt', 7.27, 99.94, None, 39.34, 102.5, 0.0, 821.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:49:19.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:49:19.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:49:19.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:49:06, diff=13.991136s, valid=True
2026-06-03T14:49:19.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:49:19.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:49:19.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:49:12, diff=7.994605s, valid=True
2026-06-03T14:49:19.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:49:19.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:49:20.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:49:00, diff=20.008589s, valid=True
2026-06-03T14:49:20.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:49:20.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:49:20.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:49:20.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:49:20.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:49:20.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:49:20.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:49:12, diff=8.015586s, valid=True
2026-06-03T14:49:20.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:49:20.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:49:20.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:49:20.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65157.016689s, valid=False
2026-06-03T14:49:20.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:49:20.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:49:20.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:49:20.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:49:20.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:49:20.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:49:20.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:49:20.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:49:20.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:49:20.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:49:20.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:49:20.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:49:20.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:49:20.334 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:49:20.601 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:49:20.931 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:49:21.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:49:21.031 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:49:21.031 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:49:21.267 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:49:21.267 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:49:51.297 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:49:51.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:49:51.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:49:51.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:49:51.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:49:51.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:49:51.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:49:51.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:49:51.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:49:51.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:49:51.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:49:51.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:49:51.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:49:55.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:49:55.050 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:49:55.051 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:49:55.051 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:49:55.062 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:49:55.075 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:49:55.076 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:49:55.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:49:55.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:49:55.077 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:49:55.077 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:49:55.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:49:55.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:49:55.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:49:55.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:49:55.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:49:55.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:49:55.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:49:55.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:49:55.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:49:55.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:49:55.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:49:55.412 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:49:55.495 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:49:37
2026-06-03T14:49:55.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86304, datetime.datetime(2026, 6, 3, 14, 49, 37), datetime.datetime(2026, 6, 3, 14, 49, 36), 'salt', 7.2, 99.91, None, 32.18, 103.13, 0.0, 821.25, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:49:55.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:49:55.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:49:55.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:49:36, diff=19.503118s, valid=True
2026-06-03T14:49:55.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:49:55.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:49:55.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:50:12, diff=-16.493328s, valid=True
2026-06-03T14:49:55.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:49:55.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:49:55.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:49:31, diff=24.514843s, valid=True
2026-06-03T14:49:55.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:49:55.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:49:55.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:49:55.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:49:55.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:49:55.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:49:55.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:50:12, diff=-16.481468s, valid=True
2026-06-03T14:49:55.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:49:55.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:49:55.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:49:55.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65192.519342s, valid=False
2026-06-03T14:49:55.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:49:55.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:49:55.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:49:55.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:49:55.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:49:55.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:49:55.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:49:55.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:49:55.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:49:55.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:49:55.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:49:55.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:49:55.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:49:55.840 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:49:56.036 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:49:56.368 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:49:56.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:49:56.468 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:49:56.468 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:49:56.718 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:49:56.718 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:50:26.725 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:50:26.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:50:26.726 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:50:27.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:50:27.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:50:27.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:50:27.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:50:27.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:50:27.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:50:27.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:50:27.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:50:27.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:50:27.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:50:29.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:50:29.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:50:29.747 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:50:29.747 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:50:29.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:50:29.771 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:50:29.772 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:50:29.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:50:29.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:50:29.773 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:50:29.773 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:50:29.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:50:29.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:50:29.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:50:30.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:50:30.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:50:30.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:50:30.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:50:30.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:50:30.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:50:30.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:50:30.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:50:30.137 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:50:30.211 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:50:07
2026-06-03T14:50:30.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86305, datetime.datetime(2026, 6, 3, 14, 50, 7), datetime.datetime(2026, 6, 3, 14, 50, 6), 'salt', 7.2, 99.97, None, 30.24, 122.78, -0.01, 821.25, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:50:30.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:50:30.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:50:30.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:50:06, diff=24.219823s, valid=True
2026-06-03T14:50:30.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:50:30.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:50:30.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:50:12, diff=18.22348s, valid=True
2026-06-03T14:50:30.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:50:30.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:50:30.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:50:02, diff=28.231211s, valid=True
2026-06-03T14:50:30.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:50:30.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:50:30.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:50:30.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:50:30.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:50:30.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:50:30.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:50:12, diff=18.234726s, valid=True
2026-06-03T14:50:30.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:50:30.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:50:30.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:50:30.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65227.235483s, valid=False
2026-06-03T14:50:30.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:50:30.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:50:30.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:50:30.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:50:30.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:50:30.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:50:30.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:50:30.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:50:30.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:50:30.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:50:30.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:50:30.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:50:30.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:50:30.582 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:50:30.856 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:50:31.194 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:50:31.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:50:31.298 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:50:31.298 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:50:31.511 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:50:31.511 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:51:01.524 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:51:01.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:51:01.525 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:51:01.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:51:01.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:51:02.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:51:02.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:51:02.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:51:02.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:51:02.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:51:02.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:51:02.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:51:02.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:51:04.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:51:04.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:51:04.422 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:51:04.423 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:51:04.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:51:04.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:51:04.446 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:51:04.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:51:04.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:51:04.448 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:51:04.448 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:51:04.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:51:04.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:51:04.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:51:04.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:51:04.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:51:04.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:51:04.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:51:04.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:51:04.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:51:04.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:51:04.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:51:04.792 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:51:04.865 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:50:38
2026-06-03T14:51:04.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86306, datetime.datetime(2026, 6, 3, 14, 50, 38), datetime.datetime(2026, 6, 3, 14, 50, 36), 'salt', 7.27, 99.87, None, 30.27, 114.84, 0.01, 821.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:51:04.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:51:04.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:51:04.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:50:36, diff=28.873469s, valid=True
2026-06-03T14:51:04.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:51:04.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:51:04.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:51:12, diff=-7.122888s, valid=True
2026-06-03T14:51:04.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:51:04.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:51:04.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:50:33, diff=31.885608s, valid=True
2026-06-03T14:51:04.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:51:04.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:51:04.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:51:04.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:51:04.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:51:04.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:51:04.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:51:12, diff=-7.110539s, valid=True
2026-06-03T14:51:04.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:51:04.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:51:04.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:51:04.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65261.890316s, valid=False
2026-06-03T14:51:04.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:51:04.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:51:04.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:51:04.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:51:04.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:51:04.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:51:04.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:51:04.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:51:04.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:51:05.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:51:05.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:51:05.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:51:05.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:51:05.212 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:51:05.417 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:51:05.756 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:51:05.860 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:51:05.860 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:51:05.860 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:51:06.121 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:51:06.122 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:51:36.126 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:51:36.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:51:36.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:51:36.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:51:36.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:51:36.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:51:36.661 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:51:36.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:51:36.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:51:36.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:51:36.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:51:36.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:51:36.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:51:39.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:51:39.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:51:39.738 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:51:39.738 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:51:39.749 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:51:39.762 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:51:39.762 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:51:39.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:51:39.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:51:39.763 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:51:39.764 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:51:39.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:51:39.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:51:39.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:51:39.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:51:39.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:51:40.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:51:40.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:51:40.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:51:40.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:51:40.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:51:40.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:51:40.062 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:51:40.141 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:51:38
2026-06-03T14:51:40.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86308, datetime.datetime(2026, 6, 3, 14, 51, 38), datetime.datetime(2026, 6, 3, 14, 51, 38), 'salt', 7.2, 99.84, None, 35.78, 99.96, 0.01, 821.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:51:40.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:51:40.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:51:40.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:51:38, diff=2.148782s, valid=True
2026-06-03T14:51:40.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:51:40.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:51:40.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:52:12, diff=-31.84787s, valid=True
2026-06-03T14:51:40.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:51:40.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:51:40.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:51:36, diff=4.159929s, valid=True
2026-06-03T14:51:40.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:51:40.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:51:40.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:51:40.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:51:40.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:51:40.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:51:40.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:52:12, diff=-31.836582s, valid=True
2026-06-03T14:51:40.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:51:40.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:51:40.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:51:40.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65297.164193s, valid=False
2026-06-03T14:51:40.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:51:40.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:51:40.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:51:40.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:51:40.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:51:40.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:51:40.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:51:40.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:51:40.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:51:40.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:51:40.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:51:40.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:51:40.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:51:40.549 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:51:40.754 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:51:41.094 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:51:41.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:51:41.196 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:51:41.196 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:51:41.391 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:51:41.392 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:52:11.421 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:52:11.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:52:11.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:52:11.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:52:11.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:52:11.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:52:11.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:52:11.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:52:11.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:52:11.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:52:11.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:52:11.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:52:11.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:52:14.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:52:14.333 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:52:14.334 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:52:14.334 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:52:14.345 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:52:14.358 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:52:14.358 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:52:14.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:52:14.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:52:14.359 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:52:14.359 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:52:14.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:52:14.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:52:14.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:52:14.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:52:14.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:52:14.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:52:14.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:52:14.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:52:14.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:52:14.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:52:14.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:52:14.706 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:52:14.776 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:52:09
2026-06-03T14:52:14.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86309, datetime.datetime(2026, 6, 3, 14, 52, 9), datetime.datetime(2026, 6, 3, 14, 52, 8), 'salt', 7.14, 99.87, None, 34.65, 115.29, 0.02, 821.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:52:14.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:52:14.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:52:14.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:52:08, diff=6.783683s, valid=True
2026-06-03T14:52:14.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:52:14.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:52:14.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:52:12, diff=2.787157s, valid=True
2026-06-03T14:52:14.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:52:14.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:52:14.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:52:07, diff=7.795257s, valid=True
2026-06-03T14:52:14.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:52:14.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:52:14.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:52:14.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:52:14.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:52:14.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:52:14.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:52:12, diff=2.798994s, valid=True
2026-06-03T14:52:14.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:52:14.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:52:14.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:52:14.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65331.799819s, valid=False
2026-06-03T14:52:14.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:52:14.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:52:14.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:52:14.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:52:14.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:52:14.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:52:14.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:52:14.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:52:14.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:52:14.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:52:14.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:52:15.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:52:15.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:52:15.121 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:52:15.325 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:52:15.660 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:52:15.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:52:15.763 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:52:15.763 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:52:15.915 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:52:15.915 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:52:45.920 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:52:45.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:52:45.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:52:46.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:52:46.244 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:52:46.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:52:46.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:52:46.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:52:46.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:52:46.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:52:46.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:52:46.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:52:46.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:52:48.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:52:48.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:52:48.921 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:52:48.921 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:52:48.930 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:52:48.943 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:52:48.943 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:52:48.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:52:48.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:52:48.944 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:52:48.944 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:52:48.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:52:49.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:52:49.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:52:49.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:52:49.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:52:49.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:52:49.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:52:49.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:52:49.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:52:49.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:52:49.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:52:49.295 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:52:49.365 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:52:39
2026-06-03T14:52:49.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86310, datetime.datetime(2026, 6, 3, 14, 52, 39), datetime.datetime(2026, 6, 3, 14, 52, 38), 'salt', 7.17, 99.97, None, 34.4, 117.24, 0.0, 821.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:52:49.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:52:49.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:52:49.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:52:38, diff=11.372973s, valid=True
2026-06-03T14:52:49.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:52:49.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:52:49.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:53:12, diff=-22.623536s, valid=True
2026-06-03T14:52:49.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:52:49.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:52:49.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:52:32, diff=17.384476s, valid=True
2026-06-03T14:52:49.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:52:49.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:52:49.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:52:49.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:52:49.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:52:49.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:52:49.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:53:12, diff=-22.611836s, valid=True
2026-06-03T14:52:49.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:52:49.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:52:49.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:52:49.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65366.388989s, valid=False
2026-06-03T14:52:49.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:52:49.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:52:49.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:52:49.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:52:49.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:52:49.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:52:49.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:52:49.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:52:49.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:52:49.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:52:49.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:52:49.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:52:49.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:52:49.778 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:52:49.996 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:52:50.341 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:52:50.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:52:50.443 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:52:50.443 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:52:50.595 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:52:50.596 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:53:20.606 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:53:20.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:53:20.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:53:20.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:53:20.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:53:20.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:53:20.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:53:20.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:53:20.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:53:20.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:53:20.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:53:20.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:53:20.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:53:23.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:53:23.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:53:23.706 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:53:23.706 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:53:23.717 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:53:23.729 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:53:23.730 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:53:23.731 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:53:23.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:53:23.731 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:53:23.731 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:53:23.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:53:23.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:53:23.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:53:23.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:53:23.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:53:24.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:53:24.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:53:24.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:53:24.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:53:24.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:53:24.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:53:24.068 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:53:24.159 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:53:09
2026-06-03T14:53:24.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86311, datetime.datetime(2026, 6, 3, 14, 53, 9), datetime.datetime(2026, 6, 3, 14, 53, 8), 'salt', 7.2, 99.84, None, 38.74, 115.62, 0.01, 820.95, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:53:24.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:53:24.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:53:24.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:53:08, diff=16.166653s, valid=True
2026-06-03T14:53:24.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:53:24.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:53:24.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:53:12, diff=12.170005s, valid=True
2026-06-03T14:53:24.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:53:24.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:53:24.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:53:02, diff=22.177929s, valid=True
2026-06-03T14:53:24.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:53:24.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:53:24.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:53:24.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:53:24.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:53:24.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:53:24.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:53:12, diff=12.181533s, valid=True
2026-06-03T14:53:24.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:53:24.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:53:24.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:53:24.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65401.182325s, valid=False
2026-06-03T14:53:24.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:53:24.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:53:24.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:53:24.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:53:24.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:53:24.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:53:24.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:53:24.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:53:24.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:53:24.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:53:24.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:53:24.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:53:24.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:53:24.503 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:53:24.710 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:53:25.054 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:53:25.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:53:25.158 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:53:25.158 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:53:25.390 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:53:25.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:53:55.420 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:53:55.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:53:55.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:53:55.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:53:55.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:53:55.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:53:55.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:53:55.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:53:55.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:53:56.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:53:56.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:53:56.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:53:56.012 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:53:58.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:53:58.703 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:53:58.704 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:53:58.704 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:53:58.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:53:58.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:53:58.728 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:53:58.729 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:53:58.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:53:58.730 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:53:58.730 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:53:58.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:53:58.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:53:58.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:53:58.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:53:58.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:53:59.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:53:59.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:53:59.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:53:59.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:53:59.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:53:59.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:53:59.128 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:53:59.200 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:53:39
2026-06-03T14:53:59.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86312, datetime.datetime(2026, 6, 3, 14, 53, 39), datetime.datetime(2026, 6, 3, 14, 53, 39), 'salt', 7.1, 99.87, None, 36.52, 114.89, 0.01, 821.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:53:59.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:53:59.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:53:59.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:53:39, diff=20.206853s, valid=True
2026-06-03T14:53:59.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:53:59.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:53:59.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:54:12, diff=-12.790345s, valid=True
2026-06-03T14:53:59.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:53:59.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:53:59.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:53:32, diff=27.216283s, valid=True
2026-06-03T14:53:59.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:53:59.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:53:59.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:53:59.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:53:59.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:53:59.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:53:59.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:54:12, diff=-12.780773s, valid=True
2026-06-03T14:53:59.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:53:59.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:53:59.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:53:59.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65436.219872s, valid=False
2026-06-03T14:53:59.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:53:59.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:53:59.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:53:59.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:53:59.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:53:59.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:53:59.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:53:59.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:53:59.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:53:59.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:53:59.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:53:59.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:53:59.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:53:59.530 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:53:59.740 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:54:00.097 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:54:00.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:54:00.201 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:54:00.201 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:54:00.440 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:54:00.440 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:54:30.456 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:54:30.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:54:30.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:54:30.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:54:30.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:54:31.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:54:31.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:54:31.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:54:31.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:54:31.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:54:31.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:54:31.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:54:31.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:54:33.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:54:33.696 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:54:33.697 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:54:33.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:54:33.706 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:54:33.719 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:54:33.720 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:54:33.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:54:33.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:54:33.721 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:54:33.721 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:54:33.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:54:33.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:54:33.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:54:33.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:54:33.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:54:34.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:54:34.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:54:34.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:54:34.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:54:34.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:54:34.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:54:34.067 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:54:34.139 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:54:10
2026-06-03T14:54:34.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86313, datetime.datetime(2026, 6, 3, 14, 54, 10), datetime.datetime(2026, 6, 3, 14, 54, 9), 'salt', 7.24, 99.91, None, 30.77, 116.86, 0.01, 821.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:54:34.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:54:34.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:54:34.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:54:09, diff=25.149953s, valid=True
2026-06-03T14:54:34.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:54:34.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:54:34.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:54:12, diff=22.158224s, valid=True
2026-06-03T14:54:34.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:54:34.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:54:34.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:54:03, diff=31.166272s, valid=True
2026-06-03T14:54:34.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:54:34.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:54:34.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:54:34.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:54:34.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:54:34.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:54:34.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:54:12, diff=22.169938s, valid=True
2026-06-03T14:54:34.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:54:34.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:54:34.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:54:34.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65471.170763s, valid=False
2026-06-03T14:54:34.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:54:34.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:54:34.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:54:34.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:54:34.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:54:34.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:54:34.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:54:34.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:54:34.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:54:34.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:54:34.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:54:34.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:54:34.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:54:34.487 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:54:34.692 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:54:35.031 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:54:35.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:54:35.133 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:54:35.133 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:54:35.355 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:54:35.355 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:55:05.374 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:55:05.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:55:05.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:55:05.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:55:05.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:55:05.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:55:05.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:55:05.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:55:05.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:55:05.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:55:05.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:55:05.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:55:05.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:55:08.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:55:08.377 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:55:08.378 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:55:08.379 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:55:08.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:55:08.401 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:55:08.402 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:55:08.402 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:55:08.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:55:08.403 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:55:08.403 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:55:08.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:55:08.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:55:08.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:55:08.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:55:08.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:55:08.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:55:08.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:55:08.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:55:08.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:55:08.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:55:08.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:55:08.747 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:55:08.819 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:54:40
2026-06-03T14:55:08.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86314, datetime.datetime(2026, 6, 3, 14, 54, 40), datetime.datetime(2026, 6, 3, 14, 54, 39), 'salt', 7.24, 99.87, None, 31.76, 109.35, 0.02, 821.25, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:55:08.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:55:08.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:55:08.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:54:39, diff=29.826993s, valid=True
2026-06-03T14:55:08.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:55:08.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:55:08.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:55:12, diff=-3.169502s, valid=True
2026-06-03T14:55:08.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:55:08.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:55:08.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:54:34, diff=34.838782s, valid=True
2026-06-03T14:55:08.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:55:08.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:55:08.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:55:08.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:55:08.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:55:08.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:55:08.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:55:12, diff=-3.15755s, valid=True
2026-06-03T14:55:08.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:55:08.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:55:08.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:55:08.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65505.843262s, valid=False
2026-06-03T14:55:08.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:55:08.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:55:08.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:55:08.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:55:08.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:55:08.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:55:08.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:55:08.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:55:08.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:55:08.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:55:09.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:55:09.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:55:09.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:55:09.162 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:55:09.385 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:55:09.726 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:55:09.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:55:09.830 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:55:09.830 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:55:10.000 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:55:10.001 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:55:40.030 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:55:40.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:55:40.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:55:40.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:55:40.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:55:40.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:55:40.363 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:55:40.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:55:40.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:55:40.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:55:40.387 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:55:40.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:55:40.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:55:43.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:55:43.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:55:43.013 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:55:43.013 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:55:43.024 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:55:43.037 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:55:43.037 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:55:43.038 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:55:43.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:55:43.039 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:55:43.039 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:55:43.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:55:43.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:55:43.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:55:43.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:55:43.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:55:43.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:55:43.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:55:43.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:55:43.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:55:43.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:55:43.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:55:43.374 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:55:43.445 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:55:41
2026-06-03T14:55:43.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86316, datetime.datetime(2026, 6, 3, 14, 55, 41), datetime.datetime(2026, 6, 3, 14, 55, 40), 'salt', 7.34, 99.97, None, 40.61, 118.48, 0.0, 820.95, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:55:43.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:55:43.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:55:43.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:55:40, diff=3.452334s, valid=True
2026-06-03T14:55:43.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:55:43.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:55:43.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:56:12, diff=-28.5441s, valid=True
2026-06-03T14:55:43.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:55:43.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:55:43.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:55:37, diff=6.464142s, valid=True
2026-06-03T14:55:43.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:55:43.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:55:43.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:55:43.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:55:43.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:55:43.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:55:43.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:56:12, diff=-28.532138s, valid=True
2026-06-03T14:55:43.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:55:43.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:55:43.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:55:43.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65540.468677s, valid=False
2026-06-03T14:55:43.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:55:43.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:55:43.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:55:43.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:55:43.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:55:43.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:55:43.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:55:43.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:55:43.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:55:43.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:55:43.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:55:43.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:55:43.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:55:43.790 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:55:44.055 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:55:44.396 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:55:44.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:55:44.499 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:55:44.499 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:55:44.739 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:55:44.739 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:56:14.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:56:14.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:56:14.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:56:15.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:56:15.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:56:15.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:56:15.314 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:56:15.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:56:15.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:56:15.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:56:15.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:56:15.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:56:15.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:56:18.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:56:18.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:56:18.020 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:56:18.020 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:56:18.030 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:56:18.043 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:56:18.043 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:56:18.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:56:18.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:56:18.045 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:56:18.045 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:56:18.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:56:18.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:56:18.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:56:18.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:56:18.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:56:18.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:56:18.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:56:18.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:56:18.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:56:18.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:56:18.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:56:18.396 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:56:18.468 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:56:11
2026-06-03T14:56:18.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86317, datetime.datetime(2026, 6, 3, 14, 56, 11), datetime.datetime(2026, 6, 3, 14, 56, 10), 'salt', 7.2, 99.87, None, 36.27, 107.21, 0.01, 821.25, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:56:18.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:56:18.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:56:18.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:56:10, diff=8.475001s, valid=True
2026-06-03T14:56:18.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:56:18.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:56:18.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:56:12, diff=6.478258s, valid=True
2026-06-03T14:56:18.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:56:18.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:56:18.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:56:09, diff=9.485837s, valid=True
2026-06-03T14:56:18.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:56:18.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:56:18.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:56:18.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:56:18.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:56:18.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:56:18.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:56:12, diff=6.489325s, valid=True
2026-06-03T14:56:18.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:56:18.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:56:18.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:56:18.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65575.490092s, valid=False
2026-06-03T14:56:18.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:56:18.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:56:18.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:56:18.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:56:18.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:56:18.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:56:18.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:56:18.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:56:18.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:56:18.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:56:18.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:56:18.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:56:18.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:56:18.808 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:56:19.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:56:19.357 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:56:19.460 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:56:19.460 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:56:19.460 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:56:19.624 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:56:19.624 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:56:49.631 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:56:49.631 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:56:49.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:56:49.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:56:49.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:56:50.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:56:50.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:56:50.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:56:50.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:56:50.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:56:50.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:56:50.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:56:50.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:56:52.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:56:52.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:56:52.843 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:56:52.843 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:56:52.855 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:56:52.868 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:56:52.868 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:56:52.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:56:52.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:56:52.869 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:56:52.870 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:56:52.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:56:52.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:56:52.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:56:53.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:56:53.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:56:53.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:56:53.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:56:53.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:56:53.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:56:53.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:56:53.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:56:53.164 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:56:53.232 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:56:41
2026-06-03T14:56:53.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86318, datetime.datetime(2026, 6, 3, 14, 56, 41), datetime.datetime(2026, 6, 3, 14, 56, 41), 'salt', 7.3, 100.0, None, 27.66, 99.82, -0.01, 821.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:56:53.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:56:53.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:56:53.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:56:41, diff=12.238789s, valid=True
2026-06-03T14:56:53.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:56:53.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:56:53.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:57:12, diff=-18.758438s, valid=True
2026-06-03T14:56:53.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:56:53.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:56:53.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:56:40, diff=13.248021s, valid=True
2026-06-03T14:56:53.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:56:53.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:56:53.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:56:53.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:56:53.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:56:53.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:56:53.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:57:12, diff=-18.749006s, valid=True
2026-06-03T14:56:53.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:56:53.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:56:53.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:56:53.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65610.25164s, valid=False
2026-06-03T14:56:53.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:56:53.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:56:53.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:56:53.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:56:53.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:56:53.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:56:53.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:56:53.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:56:53.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:56:53.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:56:53.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:56:53.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:56:53.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:56:53.637 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:56:53.842 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:56:54.181 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:56:54.284 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:56:54.284 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:56:54.284 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:56:54.435 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:56:54.435 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:57:24.465 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:57:24.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:57:24.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:57:24.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:57:24.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:57:24.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:57:24.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:57:24.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:57:24.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:57:24.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:57:24.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:57:24.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:57:24.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:57:27.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:57:27.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:57:27.316 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:57:27.316 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:57:27.326 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:57:27.339 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:57:27.339 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:57:27.340 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:57:27.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:57:27.341 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:57:27.341 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:57:27.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:57:27.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:57:27.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:57:27.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:57:27.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:57:27.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:57:27.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:57:27.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:57:27.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:57:27.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:57:27.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:57:27.668 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:57:27.739 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:57:12
2026-06-03T14:57:27.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86319, datetime.datetime(2026, 6, 3, 14, 57, 12), datetime.datetime(2026, 6, 3, 14, 57, 11), 'salt', 7.24, 99.91, None, 29.71, 103.01, 0.01, 821.19, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:57:27.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:57:27.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:57:27.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:57:11, diff=16.746941s, valid=True
2026-06-03T14:57:27.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:57:27.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:57:27.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:57:12, diff=15.750311s, valid=True
2026-06-03T14:57:27.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:57:27.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:57:27.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:57:04, diff=23.758193s, valid=True
2026-06-03T14:57:27.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:57:27.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:57:27.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:57:27.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:57:27.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:57:27.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:57:27.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:57:12, diff=15.761749s, valid=True
2026-06-03T14:57:27.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:57:27.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:57:27.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:57:27.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65644.76252s, valid=False
2026-06-03T14:57:27.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:57:27.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:57:27.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:57:27.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:57:27.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:57:27.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:57:27.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:57:27.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:57:27.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:57:27.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:57:27.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:57:27.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:57:28.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:57:28.086 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:57:28.292 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:57:28.631 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:57:28.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:57:28.733 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:57:28.733 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:57:28.949 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:57:28.949 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:57:58.979 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:57:58.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:57:58.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:57:59.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:57:59.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:57:59.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:57:59.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:57:59.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:57:59.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:57:59.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:57:59.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:57:59.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:57:59.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:58:02.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:58:02.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:58:02.145 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:58:02.145 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:58:02.155 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:58:02.167 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:58:02.167 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:58:02.168 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:58:02.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:58:02.169 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:58:02.169 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:58:02.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:58:02.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:58:02.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:58:02.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:58:02.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:58:02.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:58:02.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:58:02.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:58:02.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:58:02.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:58:02.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:58:02.507 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:58:02.578 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:57:42
2026-06-03T14:58:02.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86320, datetime.datetime(2026, 6, 3, 14, 57, 42), datetime.datetime(2026, 6, 3, 14, 57, 41), 'salt', 7.34, 100.0, None, 28.09, 100.62, 0.0, 821.19, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:58:02.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:58:02.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:58:02.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:57:41, diff=21.586103s, valid=True
2026-06-03T14:58:02.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:58:02.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:58:02.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:58:12, diff=-9.41036s, valid=True
2026-06-03T14:58:02.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:58:02.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:58:02.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:57:34, diff=28.597736s, valid=True
2026-06-03T14:58:02.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:58:02.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:58:02.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:58:02.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:58:02.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:58:02.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:58:02.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:58:12, diff=-9.398506s, valid=True
2026-06-03T14:58:02.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:58:02.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:58:02.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:58:02.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65679.602339s, valid=False
2026-06-03T14:58:02.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:58:02.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:58:02.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:58:02.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:58:02.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:58:02.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:58:02.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:58:02.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:58:02.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:58:02.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:58:02.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:58:02.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:58:02.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:58:02.993 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:58:03.198 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:58:03.538 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:58:03.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:58:03.640 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:58:03.640 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:58:03.807 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:58:03.807 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:58:33.837 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:58:33.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:58:33.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:58:33.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:58:33.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:58:34.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:58:34.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:58:34.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:58:34.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:58:34.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:58:34.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:58:34.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:58:34.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:58:36.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:58:36.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:58:36.589 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:58:36.589 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:58:36.598 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:58:36.611 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:58:36.611 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:58:36.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:58:36.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:58:36.612 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:58:36.613 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:58:36.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:58:36.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:58:36.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:58:36.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:58:36.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:58:36.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:58:36.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:58:36.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:58:36.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:58:36.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:58:36.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:58:36.945 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:58:37.016 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:58:12
2026-06-03T14:58:37.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86321, datetime.datetime(2026, 6, 3, 14, 58, 12), datetime.datetime(2026, 6, 3, 14, 58, 12), 'salt', 7.43, 99.94, None, 28.4, 111.79, 0.0, 821.19, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:58:37.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:58:37.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:58:37.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:58:12, diff=25.024313s, valid=True
2026-06-03T14:58:37.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:58:37.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:58:37.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:58:12, diff=25.027822s, valid=True
2026-06-03T14:58:37.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:58:37.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:58:37.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:58:04, diff=33.035919s, valid=True
2026-06-03T14:58:37.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:58:37.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:58:37.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:58:37.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:58:37.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:58:37.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:58:37.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:58:12, diff=25.039612s, valid=True
2026-06-03T14:58:37.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:58:37.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:58:37.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:58:37.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65714.040409s, valid=False
2026-06-03T14:58:37.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:58:37.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:58:37.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:58:37.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:58:37.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:58:37.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:58:37.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:58:37.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:58:37.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:58:37.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:58:37.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:58:37.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:58:37.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:58:37.364 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:58:37.573 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:58:37.945 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:58:38.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:58:38.048 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:58:38.048 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:58:38.119 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:58:38.119 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:59:08.149 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:59:08.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:59:08.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:59:08.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:59:08.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:59:08.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:59:08.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:59:08.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:59:08.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:59:08.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:59:08.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:59:08.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:59:08.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:59:11.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:59:11.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:59:11.522 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:59:11.522 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:59:11.532 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:59:11.545 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:59:11.545 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:59:11.546 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:59:11.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:59:11.546 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:59:11.547 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:59:11.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:59:11.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T14:59:11.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:59:11.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T14:59:11.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:59:11.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:59:11.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:59:11.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T14:59:11.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:59:11.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:59:11.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:59:11.875 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:59:11.944 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:58:43
2026-06-03T14:59:11.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86322, datetime.datetime(2026, 6, 3, 14, 58, 43), datetime.datetime(2026, 6, 3, 14, 58, 42), 'salt', 7.43, 99.87, None, 27.2, 108.22, 0.01, 821.25, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:59:11.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:59:11.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T14:59:11.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:58:42, diff=29.95206s, valid=True
2026-06-03T14:59:11.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:59:11.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:59:11.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:59:12, diff=-0.044472s, valid=True
2026-06-03T14:59:11.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:59:11.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T14:59:11.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:58:36, diff=35.963716s, valid=True
2026-06-03T14:59:11.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:59:11.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:59:11.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:59:11.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:59:11.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:59:11.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T14:59:11.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:59:12, diff=-0.032664s, valid=True
2026-06-03T14:59:11.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:59:11.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:59:11.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:59:11.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65748.968133s, valid=False
2026-06-03T14:59:11.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:59:11.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:59:11.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:59:11.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:59:11.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:59:12.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:59:12.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:59:12.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:59:12.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:59:12.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:59:12.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:59:12.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:59:12.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:59:12.353 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:59:12.562 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:59:12.905 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:59:13.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:59:13.007 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:59:13.007 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:59:13.080 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:59:13.080 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T14:59:43.110 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T14:59:43.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T14:59:43.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T14:59:43.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T14:59:43.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T14:59:43.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T14:59:43.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T14:59:43.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T14:59:43.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T14:59:43.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T14:59:43.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T14:59:43.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T14:59:43.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T14:59:45.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T14:59:45.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T14:59:45.903 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T14:59:45.903 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T14:59:45.914 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T14:59:45.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T14:59:45.927 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T14:59:45.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T14:59:45.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T14:59:45.928 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T14:59:45.929 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T14:59:45.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T14:59:46.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T14:59:46.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T14:59:46.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T14:59:46.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:59:46.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:59:46.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T14:59:46.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T14:59:46.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T14:59:46.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T14:59:46.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T14:59:46.281 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T14:59:46.355 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 14:59:43
2026-06-03T14:59:46.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86324, datetime.datetime(2026, 6, 3, 14, 59, 43), datetime.datetime(2026, 6, 3, 14, 59, 42), 'salt', 7.47, 99.97, None, 27.8, 108.25, 0.0, 821.31, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T14:59:46.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T14:59:46.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T14:59:46.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:59:42, diff=4.362066s, valid=True
2026-06-03T14:59:46.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T14:59:46.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:59:46.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:00:12, diff=-25.635057s, valid=True
2026-06-03T14:59:46.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T14:59:46.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T14:59:46.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 14:59:38, diff=8.371792s, valid=True
2026-06-03T14:59:46.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T14:59:46.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:59:46.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T14:59:46.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T14:59:46.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T14:59:46.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T14:59:46.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:00:12, diff=-25.625174s, valid=True
2026-06-03T14:59:46.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T14:59:46.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T14:59:46.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T14:59:46.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65783.37548s, valid=False
2026-06-03T14:59:46.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T14:59:46.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T14:59:46.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T14:59:46.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T14:59:46.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T14:59:46.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T14:59:46.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T14:59:46.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T14:59:46.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T14:59:46.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T14:59:46.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T14:59:46.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T14:59:46.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T14:59:46.689 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T14:59:46.894 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:59:47.240 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T14:59:47.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T14:59:47.344 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T14:59:47.344 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T14:59:47.560 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T14:59:47.560 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:00:17.590 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:00:17.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:00:17.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:00:17.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:00:17.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:00:18.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:00:18.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:00:18.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:00:18.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:00:18.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:00:18.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:00:18.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:00:18.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:00:20.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:00:20.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:00:20.879 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:00:20.879 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:00:20.887 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:00:20.899 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:00:20.899 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:00:20.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:00:20.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:00:20.900 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:00:20.900 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:00:20.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:00:21.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:00:21.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:00:21.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:00:21.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:00:21.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:00:21.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:00:21.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:00:21.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:00:21.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:00:21.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:00:21.253 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:00:21.325 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:00:13
2026-06-03T15:00:21.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86325, datetime.datetime(2026, 6, 3, 15, 0, 13), datetime.datetime(2026, 6, 3, 15, 0, 13), 'salt', 7.43, 100.0, None, 34.26, 102.17, -0.01, 821.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:00:21.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:00:21.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:00:21.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:00:13, diff=8.332745s, valid=True
2026-06-03T15:00:21.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:00:21.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:00:21.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:00:12, diff=9.336386s, valid=True
2026-06-03T15:00:21.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:00:21.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:00:21.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:00:10, diff=11.344933s, valid=True
2026-06-03T15:00:21.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:00:21.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:00:21.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:00:21.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:00:21.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:00:21.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:00:21.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:00:12, diff=9.348791s, valid=True
2026-06-03T15:00:21.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:00:21.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:00:21.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:00:21.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65818.349637s, valid=False
2026-06-03T15:00:21.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:00:21.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:00:21.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:00:21.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:00:21.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:00:21.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:00:21.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:00:21.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:00:21.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:00:21.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:00:21.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:00:21.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:00:21.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:00:21.671 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:00:21.876 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:00:22.218 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:00:22.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:00:22.320 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:00:22.321 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:00:22.490 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:00:22.491 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:00:52.510 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:00:52.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:00:52.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:00:52.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:00:52.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:00:53.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:00:53.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:00:53.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:00:53.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:00:53.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:00:53.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:00:53.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:00:53.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:00:55.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:00:55.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:00:55.630 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:00:55.630 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:00:55.640 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:00:55.653 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:00:55.653 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:00:55.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:00:55.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:00:55.654 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:00:55.655 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:00:55.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:00:55.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:00:55.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:00:55.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:00:55.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:00:55.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:00:55.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:00:55.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:00:55.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:00:56.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:00:56.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:00:56.004 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:00:56.083 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:00:44
2026-06-03T15:00:56.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86326, datetime.datetime(2026, 6, 3, 15, 0, 44), datetime.datetime(2026, 6, 3, 15, 0, 43), 'salt', 7.43, 99.94, None, 29.57, 115.88, 0.0, 821.31, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:00:56.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:00:56.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:00:56.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:00:43, diff=13.090394s, valid=True
2026-06-03T15:00:56.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:00:56.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:00:56.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:01:12, diff=-15.906164s, valid=True
2026-06-03T15:00:56.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:00:56.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:00:56.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:00:42, diff=14.10197s, valid=True
2026-06-03T15:00:56.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:00:56.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:00:56.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:00:56.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:00:56.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:00:56.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:00:56.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:01:12, diff=-15.894298s, valid=True
2026-06-03T15:00:56.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:00:56.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:00:56.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:00:56.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65853.10652s, valid=False
2026-06-03T15:00:56.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:00:56.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:00:56.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:00:56.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:00:56.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:00:56.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:00:56.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:00:56.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:00:56.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:00:56.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:00:56.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:00:56.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:00:56.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:00:56.426 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:00:56.630 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:00:57.025 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:00:57.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:00:57.126 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:00:57.126 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:00:57.375 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:00:57.375 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:01:27.406 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:01:27.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:01:27.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:01:27.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:01:27.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:01:27.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:01:27.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:01:27.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:01:27.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:01:27.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:01:27.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:01:27.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:01:27.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:01:30.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:01:30.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:01:30.767 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:01:30.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:01:30.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:01:30.788 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:01:30.789 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:01:30.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:01:30.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:01:30.790 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:01:30.790 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:01:30.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:01:30.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:01:30.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:01:31.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:01:31.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:01:31.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:01:31.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:01:31.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:01:31.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:01:31.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:01:31.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:01:31.140 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:01:31.222 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:01:14
2026-06-03T15:01:31.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86327, datetime.datetime(2026, 6, 3, 15, 1, 14), datetime.datetime(2026, 6, 3, 15, 1, 13), 'salt', 7.43, 100.04, None, 29.32, 99.7, -0.02, 821.37, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:01:31.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:01:31.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:01:31.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:01:13, diff=18.230486s, valid=True
2026-06-03T15:01:31.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:01:31.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:01:31.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:01:12, diff=19.234031s, valid=True
2026-06-03T15:01:31.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:01:31.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:01:31.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:01:13, diff=18.242345s, valid=True
2026-06-03T15:01:31.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:01:31.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:01:31.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:01:31.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:01:31.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:01:31.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:01:31.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:01:12, diff=19.246146s, valid=True
2026-06-03T15:01:31.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:01:31.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:01:31.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:01:31.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65888.246969s, valid=False
2026-06-03T15:01:31.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:01:31.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:01:31.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:01:31.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:01:31.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:01:31.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:01:31.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:01:31.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:01:31.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:01:31.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:01:31.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:01:31.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:01:31.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:01:31.565 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:01:31.772 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:01:32.110 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:01:32.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:01:32.212 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:01:32.212 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:01:32.371 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:01:32.371 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:02:02.395 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:02:02.395 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:02:02.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:02:02.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:02:02.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:02:02.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:02:02.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:02:02.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:02:02.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:02:02.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:02:02.806 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:02:02.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:02:02.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:02:05.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:02:05.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:02:05.363 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:02:05.363 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:02:05.373 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:02:05.385 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:02:05.386 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:02:05.386 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:02:05.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:02:05.387 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:02:05.387 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:02:05.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:02:05.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:02:05.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:02:05.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:02:05.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:02:05.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:02:05.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:02:05.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:02:05.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:02:05.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:02:05.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:02:05.733 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:02:05.823 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:01:44
2026-06-03T15:02:05.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86328, datetime.datetime(2026, 6, 3, 15, 1, 44), datetime.datetime(2026, 6, 3, 15, 1, 43), 'salt', 7.37, 99.97, None, 26.92, 120.64, 0.0, 821.31, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:02:05.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:02:05.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:02:05.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:01:43, diff=22.832314s, valid=True
2026-06-03T15:02:05.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:02:05.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:02:05.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:02:12, diff=-6.164205s, valid=True
2026-06-03T15:02:05.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:02:05.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:02:05.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:01:36, diff=29.844002s, valid=True
2026-06-03T15:02:05.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:02:05.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:02:05.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:02:05.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:02:05.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:02:05.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:02:05.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:02:12, diff=-6.152311s, valid=True
2026-06-03T15:02:05.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:02:05.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:02:05.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:02:05.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65922.848486s, valid=False
2026-06-03T15:02:05.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:02:05.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:02:05.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:02:05.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:02:05.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:02:05.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:02:05.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:02:05.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:02:05.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:02:05.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:02:06.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:02:06.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:02:06.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:02:06.172 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:02:06.450 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:02:06.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:02:06.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:02:06.891 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:02:06.892 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:02:07.062 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:02:07.062 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:02:37.079 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:02:37.079 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:02:37.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:02:37.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:02:37.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:02:37.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:02:37.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:02:37.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:02:37.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:02:37.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:02:37.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:02:37.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:02:37.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:02:40.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:02:40.059 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:02:40.060 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:02:40.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:02:40.068 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:02:40.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:02:40.085 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:02:40.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:02:40.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:02:40.086 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:02:40.086 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:02:40.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:02:40.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:02:40.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:02:40.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:02:40.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:02:40.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:02:40.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:02:40.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:02:40.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:02:40.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:02:40.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:02:40.381 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:02:40.458 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:02:14
2026-06-03T15:02:40.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86329, datetime.datetime(2026, 6, 3, 15, 2, 14), datetime.datetime(2026, 6, 3, 15, 2, 14), 'salt', 7.37, 99.97, None, 37.96, 99.37, 0.0, 821.28, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:02:40.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:02:40.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:02:40.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:02:14, diff=26.465345s, valid=True
2026-06-03T15:02:40.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:02:40.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:02:40.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:02:12, diff=28.46869s, valid=True
2026-06-03T15:02:40.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:02:40.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:02:40.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:02:06, diff=34.476577s, valid=True
2026-06-03T15:02:40.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:02:40.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:02:40.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:02:40.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:02:40.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:02:40.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:02:40.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:02:12, diff=28.480173s, valid=True
2026-06-03T15:02:40.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:02:40.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:02:40.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:02:40.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65957.480977s, valid=False
2026-06-03T15:02:40.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:02:40.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:02:40.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:02:40.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:02:40.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:02:40.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:02:40.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:02:40.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:02:40.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:02:40.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:02:40.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:02:40.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:02:40.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:02:40.799 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:02:41.003 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:02:41.342 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:02:41.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:02:41.444 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:02:41.444 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:02:41.646 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:02:41.646 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:03:11.661 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:03:11.661 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:03:11.661 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:03:12.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:03:12.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:03:12.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:03:12.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:03:12.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:03:12.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:03:12.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:03:12.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:03:12.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:03:12.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:03:15.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:03:15.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:03:15.137 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:03:15.138 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:03:15.148 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:03:15.161 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:03:15.162 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:03:15.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:03:15.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:03:15.163 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:03:15.163 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:03:15.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:03:15.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:03:15.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:03:15.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:03:15.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:03:15.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:03:15.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:03:15.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:03:15.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:03:15.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:03:15.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:03:15.508 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:03:15.582 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:03:15
2026-06-03T15:03:15.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86331, datetime.datetime(2026, 6, 3, 15, 3, 15), datetime.datetime(2026, 6, 3, 15, 3, 14), 'salt', 7.2, 99.97, None, 37.37, 96.42, 0.0, 821.0, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:03:15.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:03:15.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:03:15.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:03:14, diff=1.590696s, valid=True
2026-06-03T15:03:15.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:03:15.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:03:15.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:03:12, diff=3.59426s, valid=True
2026-06-03T15:03:15.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:03:15.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:03:15.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:03:09, diff=6.602911s, valid=True
2026-06-03T15:03:15.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:03:15.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:03:15.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:03:15.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:03:15.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:03:15.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:03:15.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:03:12, diff=3.606784s, valid=True
2026-06-03T15:03:15.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:03:15.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:03:15.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:03:15.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=65992.607599s, valid=False
2026-06-03T15:03:15.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:03:15.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:03:15.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:03:15.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:03:15.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:03:15.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:03:15.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:03:15.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:03:15.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:03:15.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:03:15.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:03:15.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:03:15.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:03:16.010 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:03:16.214 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:03:16.552 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:03:16.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:03:16.655 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:03:16.655 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:03:16.837 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:03:16.837 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:03:46.846 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:03:46.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:03:46.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:03:47.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:03:47.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:03:47.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:03:47.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:03:47.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:03:47.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:03:47.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:03:47.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:03:47.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:03:47.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:03:50.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:03:50.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:03:50.125 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:03:50.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:03:50.133 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:03:50.147 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:03:50.148 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:03:50.148 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:03:50.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:03:50.148 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:03:50.148 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:03:50.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:03:50.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:03:50.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:03:50.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:03:50.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:03:50.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:03:50.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:03:50.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:03:50.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:03:50.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:03:50.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:03:50.494 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:03:50.571 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:03:45
2026-06-03T15:03:50.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86332, datetime.datetime(2026, 6, 3, 15, 3, 45), datetime.datetime(2026, 6, 3, 15, 3, 44), 'salt', 7.17, 99.87, None, 35.6, 103.34, 0.01, 821.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:03:50.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:03:50.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:03:50.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:03:44, diff=6.578398s, valid=True
2026-06-03T15:03:50.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:03:50.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:03:50.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:04:12, diff=-21.418083s, valid=True
2026-06-03T15:03:50.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:03:50.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:03:50.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:03:40, diff=10.589991s, valid=True
2026-06-03T15:03:50.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:03:50.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:03:50.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:03:50.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:03:50.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:03:50.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:03:50.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:04:12, diff=-21.406341s, valid=True
2026-06-03T15:03:50.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:03:50.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:03:50.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:03:50.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66027.594469s, valid=False
2026-06-03T15:03:50.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:03:50.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:03:50.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:03:50.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:03:50.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:03:50.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:03:50.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:03:50.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:03:50.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:03:50.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:03:50.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:03:50.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:03:50.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:03:50.919 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:03:51.124 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:03:51.463 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:03:51.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:03:51.565 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:03:51.565 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:03:51.723 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:03:51.723 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:04:21.740 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:04:21.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:04:21.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:04:21.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:04:21.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:04:22.132 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:04:22.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:04:22.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:04:22.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:04:22.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:04:22.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:04:22.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:04:22.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:04:24.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:04:24.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:04:24.845 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:04:24.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:04:24.853 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:04:24.865 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:04:24.865 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:04:24.865 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:04:24.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:04:24.865 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:04:24.865 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:04:24.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:04:24.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:04:24.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:04:25.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:04:25.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:04:25.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:04:25.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:04:25.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:04:25.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:04:25.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:04:25.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:04:25.171 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:04:25.247 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:04:15
2026-06-03T15:04:25.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86333, datetime.datetime(2026, 6, 3, 15, 4, 15), datetime.datetime(2026, 6, 3, 15, 4, 15), 'salt', 7.3, 99.97, None, 34.08, 109.54, 0.0, 821.19, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:04:25.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:04:25.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:04:25.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:04:15, diff=10.254951s, valid=True
2026-06-03T15:04:25.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:04:25.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:04:25.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:04:12, diff=13.258396s, valid=True
2026-06-03T15:04:25.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:04:25.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:04:25.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:04:11, diff=14.266298s, valid=True
2026-06-03T15:04:25.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:04:25.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:04:25.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:04:25.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:04:25.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:04:25.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:04:25.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:04:12, diff=13.269628s, valid=True
2026-06-03T15:04:25.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:04:25.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:04:25.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:04:25.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66062.270331s, valid=False
2026-06-03T15:04:25.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:04:25.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:04:25.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:04:25.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:04:25.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:04:25.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:04:25.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:04:25.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:04:25.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:04:25.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:04:25.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:04:25.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:04:25.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:04:25.654 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:04:25.859 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:04:26.198 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:04:26.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:04:26.302 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:04:26.302 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:04:26.464 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:04:26.464 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:04:56.495 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:04:56.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:04:56.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:04:56.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:04:56.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:04:56.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:04:56.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:04:56.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:04:56.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:04:56.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:04:56.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:04:56.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:04:56.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:04:59.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:04:59.633 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:04:59.634 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:04:59.634 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:04:59.645 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:04:59.657 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:04:59.658 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:04:59.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:04:59.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:04:59.659 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:04:59.659 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:04:59.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:04:59.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:04:59.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:04:59.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:04:59.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:04:59.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:04:59.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:04:59.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:04:59.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:04:59.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:04:59.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:04:59.969 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:05:00.043 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:04:46
2026-06-03T15:05:00.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86334, datetime.datetime(2026, 6, 3, 15, 4, 46), datetime.datetime(2026, 6, 3, 15, 4, 45), 'salt', 7.33, 100.0, None, 37.44, 99.4, -0.01, 821.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:05:00.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:05:00.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:05:00.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:04:45, diff=15.049833s, valid=True
2026-06-03T15:05:00.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:05:00.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:05:00.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:05:12, diff=-11.946949s, valid=True
2026-06-03T15:05:00.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:05:00.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:05:00.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:04:43, diff=17.06151s, valid=True
2026-06-03T15:05:00.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:05:00.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:05:00.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:05:00.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:05:00.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:05:00.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:05:00.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:05:12, diff=-11.935093s, valid=True
2026-06-03T15:05:00.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:05:00.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:05:00.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:05:00.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66097.065611s, valid=False
2026-06-03T15:05:00.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:05:00.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:05:00.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:05:00.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:05:00.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:05:00.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:05:00.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:05:00.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:05:00.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:05:00.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:05:00.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:05:00.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:05:00.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:05:00.392 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:05:00.599 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:05:00.945 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:05:01.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:05:01.050 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:05:01.050 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:05:01.211 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:05:01.211 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:05:31.242 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:05:31.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:05:31.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:05:31.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:05:31.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:05:31.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:05:31.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:05:31.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:05:31.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:05:31.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:05:31.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:05:31.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:05:31.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:05:34.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:05:34.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:05:34.445 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:05:34.445 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:05:34.455 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:05:34.467 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:05:34.468 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:05:34.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:05:34.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:05:34.469 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:05:34.469 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:05:34.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:05:34.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:05:34.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:05:34.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:05:34.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:05:34.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:05:34.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:05:34.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:05:34.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:05:34.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:05:34.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:05:34.812 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:05:34.883 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:05:16
2026-06-03T15:05:34.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86335, datetime.datetime(2026, 6, 3, 15, 5, 16), datetime.datetime(2026, 6, 3, 15, 5, 15), 'salt', 7.3, 99.9, None, 39.38, 99.72, 0.01, 821.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:05:34.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:05:34.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:05:34.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:05:15, diff=19.89029s, valid=True
2026-06-03T15:05:34.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:05:34.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:05:34.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:05:12, diff=22.893768s, valid=True
2026-06-03T15:05:34.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:05:34.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:05:34.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:05:15, diff=19.901914s, valid=True
2026-06-03T15:05:34.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:05:34.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:05:34.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:05:34.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:05:34.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:05:34.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:05:34.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:05:12, diff=22.905722s, valid=True
2026-06-03T15:05:34.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:05:34.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:05:34.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:05:34.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66131.906579s, valid=False
2026-06-03T15:05:34.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:05:34.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:05:34.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:05:34.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:05:34.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:05:34.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:05:34.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:05:34.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:05:35.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:05:35.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:05:35.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:05:35.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:05:35.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:05:35.300 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:05:35.508 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:05:35.852 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:05:35.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:05:35.956 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:05:35.956 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:05:36.126 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:05:36.126 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:06:06.157 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:06:06.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:06:06.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:06:06.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:06:06.728 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:06:06.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:06:06.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:06:06.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:06:06.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:06:06.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:06:06.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:06:06.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:06:06.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:06:09.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:06:09.833 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:06:09.834 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:06:09.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:06:09.842 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:06:09.854 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:06:09.855 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:06:09.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:06:09.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:06:09.855 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:06:09.855 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:06:09.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:06:09.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:06:09.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:06:10.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:06:10.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:06:10.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:06:10.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:06:10.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:06:10.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:06:10.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:06:10.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:06:10.155 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:06:10.226 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:05:47
2026-06-03T15:06:10.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86336, datetime.datetime(2026, 6, 3, 15, 5, 47), datetime.datetime(2026, 6, 3, 15, 5, 46), 'salt', 7.24, 99.94, None, 34.86, 104.65, 0.01, 821.25, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:06:10.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:06:10.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:06:10.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:05:46, diff=24.232944s, valid=True
2026-06-03T15:06:10.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:06:10.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:06:10.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:06:12, diff=-1.763887s, valid=True
2026-06-03T15:06:10.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:06:10.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:06:10.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:05:46, diff=24.243564s, valid=True
2026-06-03T15:06:10.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:06:10.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:06:10.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:06:10.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:06:10.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:06:10.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:06:10.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:06:12, diff=-1.753058s, valid=True
2026-06-03T15:06:10.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:06:10.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:06:10.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:06:10.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66167.247674s, valid=False
2026-06-03T15:06:10.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:06:10.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:06:10.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:06:10.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:06:10.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:06:10.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:06:10.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:06:10.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:06:10.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:06:10.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:06:10.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:06:10.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:06:10.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:06:10.565 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:06:10.771 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:06:11.112 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:06:11.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:06:11.215 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:06:11.215 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:06:11.371 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:06:11.371 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:06:41.402 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:06:41.402 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:06:41.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:06:41.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:06:41.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:06:41.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:06:41.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:06:41.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:06:41.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:06:41.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:06:41.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:06:41.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:06:41.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:06:45.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:06:45.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:06:45.077 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:06:45.077 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:06:45.086 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:06:45.099 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:06:45.099 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:06:45.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:06:45.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:06:45.101 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:06:45.101 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:06:45.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:06:45.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:06:45.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:06:45.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:06:45.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:06:45.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:06:45.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:06:45.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:06:45.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:06:45.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:06:45.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:06:45.440 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:06:45.513 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:06:17
2026-06-03T15:06:45.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86337, datetime.datetime(2026, 6, 3, 15, 6, 17), datetime.datetime(2026, 6, 3, 15, 6, 16), 'salt', 7.33, 100.04, None, 30.59, 106.27, -0.02, 821.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:06:45.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:06:45.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:06:45.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:06:16, diff=29.520434s, valid=True
2026-06-03T15:06:45.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:06:45.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:06:45.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:06:12, diff=33.523997s, valid=True
2026-06-03T15:06:45.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:06:45.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:06:45.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:06:08, diff=37.532211s, valid=True
2026-06-03T15:06:45.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:06:45.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:06:45.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:06:45.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:06:45.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:06:45.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:06:45.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:06:12, diff=33.535924s, valid=True
2026-06-03T15:06:45.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:06:45.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:06:45.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:06:45.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66202.536759s, valid=False
2026-06-03T15:06:45.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:06:45.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:06:45.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:06:45.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:06:45.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:06:45.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:06:45.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:06:45.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:06:45.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:06:45.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:06:45.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:06:45.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:06:45.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:06:45.857 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:06:46.065 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:06:46.407 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:06:46.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:06:46.510 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:06:46.510 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:06:46.581 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:06:46.581 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:07:16.612 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:07:16.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:07:16.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:07:16.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:07:16.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:07:16.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:07:16.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:07:16.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:07:16.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:07:16.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:07:16.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:07:17.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:07:17.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:07:19.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:07:19.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:07:19.456 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:07:19.456 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:07:19.467 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:07:19.479 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:07:19.480 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:07:19.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:07:19.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:07:19.481 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:07:19.481 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:07:19.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:07:19.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:07:19.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:07:19.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:07:19.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:07:19.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:07:19.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:07:19.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:07:19.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:07:19.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:07:19.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:07:19.821 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:07:19.891 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:07:17
2026-06-03T15:07:19.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86339, datetime.datetime(2026, 6, 3, 15, 7, 17), datetime.datetime(2026, 6, 3, 15, 7, 17), 'salt', 7.2, 99.9, None, 35.35, 108.69, 0.01, 821.19, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:07:19.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:07:19.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:07:19.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:07:17, diff=2.898835s, valid=True
2026-06-03T15:07:19.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:07:19.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:07:19.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:07:12, diff=7.901736s, valid=True
2026-06-03T15:07:19.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:07:19.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:07:19.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:07:10, diff=9.908602s, valid=True
2026-06-03T15:07:19.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:07:19.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:07:19.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:07:19.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:07:19.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:07:19.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:07:19.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:07:12, diff=7.912434s, valid=True
2026-06-03T15:07:19.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:07:19.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:07:19.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:07:19.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66236.91324s, valid=False
2026-06-03T15:07:19.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:07:19.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:07:19.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:07:19.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:07:19.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:07:19.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:07:19.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:07:19.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:07:20.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:07:20.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:07:20.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:07:20.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:07:20.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:07:20.250 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:07:20.454 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:07:20.853 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:07:20.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:07:20.955 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:07:20.956 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:07:21.176 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:07:21.176 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:07:51.195 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:07:51.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:07:51.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:07:51.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:07:51.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:07:51.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:07:51.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:07:51.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:07:51.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:07:51.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:07:51.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:07:51.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:07:51.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:07:54.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:07:54.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:07:54.087 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:07:54.088 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:07:54.097 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:07:54.110 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:07:54.110 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:07:54.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:07:54.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:07:54.111 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:07:54.112 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:07:54.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:07:54.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:07:54.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:07:54.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:07:54.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:07:54.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:07:54.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:07:54.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:07:54.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:07:54.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:07:54.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:07:54.439 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:07:54.517 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:07:48
2026-06-03T15:07:54.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86340, datetime.datetime(2026, 6, 3, 15, 7, 48), datetime.datetime(2026, 6, 3, 15, 7, 47), 'salt', 7.27, 99.94, None, 38.04, 102.0, 0.0, 821.31, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:07:54.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:07:54.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:07:54.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:07:47, diff=7.52457s, valid=True
2026-06-03T15:07:54.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:07:54.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:07:54.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:08:12, diff=-17.471806s, valid=True
2026-06-03T15:07:54.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:07:54.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:07:54.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:07:42, diff=12.536407s, valid=True
2026-06-03T15:07:54.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:07:54.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:07:54.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:07:54.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:07:54.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:07:54.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:07:54.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:08:12, diff=-17.459858s, valid=True
2026-06-03T15:07:54.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:07:54.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:07:54.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:07:54.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66271.540955s, valid=False
2026-06-03T15:07:54.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:07:54.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:07:54.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:07:54.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:07:54.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:07:54.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:07:54.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:07:54.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:07:54.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:07:54.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:07:54.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:07:54.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:07:54.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:07:54.859 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:07:55.065 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:07:55.404 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:07:55.506 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:07:55.506 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:07:55.506 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:07:55.690 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:07:55.690 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:08:25.720 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:08:25.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:08:25.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:08:26.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:08:26.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:08:26.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:08:26.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:08:26.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:08:26.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:08:26.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:08:26.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:08:26.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:08:26.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:08:28.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:08:28.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:08:28.685 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:08:28.685 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:08:28.695 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:08:28.708 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:08:28.709 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:08:28.709 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:08:28.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:08:28.710 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:08:28.710 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:08:28.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:08:28.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:08:28.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:08:28.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:08:28.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:08:28.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:08:28.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:08:29.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:08:29.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:08:29.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:08:29.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:08:29.038 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:08:29.110 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:08:18
2026-06-03T15:08:29.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86341, datetime.datetime(2026, 6, 3, 15, 8, 18), datetime.datetime(2026, 6, 3, 15, 8, 17), 'salt', 7.3, 100.0, None, 40.65, 109.61, -0.01, 821.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:08:29.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:08:29.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:08:29.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:08:17, diff=12.117547s, valid=True
2026-06-03T15:08:29.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:08:29.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:08:29.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:08:12, diff=17.120972s, valid=True
2026-06-03T15:08:29.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:08:29.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:08:29.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:08:13, diff=16.129058s, valid=True
2026-06-03T15:08:29.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:08:29.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:08:29.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:08:29.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:08:29.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:08:29.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:08:29.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:08:12, diff=17.132711s, valid=True
2026-06-03T15:08:29.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:08:29.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:08:29.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:08:29.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66306.133483s, valid=False
2026-06-03T15:08:29.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:08:29.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:08:29.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:08:29.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:08:29.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:08:29.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:08:29.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:08:29.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:08:29.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:08:29.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:08:29.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:08:29.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:08:29.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:08:29.452 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:08:29.734 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:08:30.082 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:08:30.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:08:30.184 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:08:30.184 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:08:30.382 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:08:30.382 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:09:00.412 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:09:00.412 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:09:00.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:09:00.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:09:00.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:09:00.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:09:00.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:09:00.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:09:00.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:09:00.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:09:00.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:09:00.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:09:00.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:09:03.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:09:03.251 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:09:03.252 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:09:03.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:09:03.263 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:09:03.275 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:09:03.276 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:09:03.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:09:03.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:09:03.277 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:09:03.277 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:09:03.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:09:03.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:09:03.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:09:03.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:09:03.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:09:03.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:09:03.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:09:03.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:09:03.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:09:03.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:09:03.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:09:03.617 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:09:03.688 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:08:48
2026-06-03T15:09:03.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86342, datetime.datetime(2026, 6, 3, 15, 8, 48), datetime.datetime(2026, 6, 3, 15, 8, 47), 'salt', 7.37, 100.0, None, 40.15, 106.18, -0.01, 821.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:09:03.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:09:03.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:09:03.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:08:47, diff=16.695393s, valid=True
2026-06-03T15:09:03.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:09:03.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:09:03.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:09:12, diff=-8.301153s, valid=True
2026-06-03T15:09:03.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:09:03.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:09:03.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:08:45, diff=18.706937s, valid=True
2026-06-03T15:09:03.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:09:03.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:09:03.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:09:03.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:09:03.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:09:03.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:09:03.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:09:12, diff=-8.289369s, valid=True
2026-06-03T15:09:03.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:09:03.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:09:03.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:09:03.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66340.711425s, valid=False
2026-06-03T15:09:03.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:09:03.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:09:03.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:09:03.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:09:03.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:09:03.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:09:03.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:09:03.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:09:03.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:09:03.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:09:03.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:09:03.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:09:03.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:09:04.031 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:09:04.237 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:09:04.574 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:09:04.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:09:04.676 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:09:04.676 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:09:04.871 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:09:04.871 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:09:34.901 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:09:34.901 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:09:34.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:09:35.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:09:35.230 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:09:35.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:09:35.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:09:35.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:09:35.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:09:35.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:09:35.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:09:35.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:09:35.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:09:38.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:09:38.022 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:09:38.023 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:09:38.023 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:09:38.034 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:09:38.047 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:09:38.048 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:09:38.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:09:38.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:09:38.049 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:09:38.050 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:09:38.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:09:38.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:09:38.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:09:38.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:09:38.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:09:38.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:09:38.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:09:38.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:09:38.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:09:38.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:09:38.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:09:38.392 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:09:38.465 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:09:18
2026-06-03T15:09:38.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86343, datetime.datetime(2026, 6, 3, 15, 9, 18), datetime.datetime(2026, 6, 3, 15, 9, 18), 'salt', 7.24, 99.9, None, 34.3, 106.09, 0.01, 821.19, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:09:38.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:09:38.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:09:38.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:09:18, diff=20.472575s, valid=True
2026-06-03T15:09:38.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:09:38.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:09:38.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:09:12, diff=26.47599s, valid=True
2026-06-03T15:09:38.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:09:38.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:09:38.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:09:16, diff=22.483947s, valid=True
2026-06-03T15:09:38.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:09:38.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:09:38.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:09:38.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:09:38.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:09:38.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:09:38.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:09:12, diff=26.487567s, valid=True
2026-06-03T15:09:38.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:09:38.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:09:38.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:09:38.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66375.488349s, valid=False
2026-06-03T15:09:38.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:09:38.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:09:38.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:09:38.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:09:38.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:09:38.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:09:38.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:09:38.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:09:38.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:09:38.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:09:38.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:09:38.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:09:38.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:09:38.883 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:09:39.088 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:09:39.426 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:09:39.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:09:39.528 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:09:39.528 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:09:39.683 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:09:39.683 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:10:09.711 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:10:09.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:10:09.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:10:10.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:10:10.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:10:10.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:10:10.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:10:10.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:10:10.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:10:10.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:10:10.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:10:10.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:10:10.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:10:12.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:10:12.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:10:12.707 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:10:12.707 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:10:12.717 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:10:12.730 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:10:12.730 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:10:12.731 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:10:12.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:10:12.732 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:10:12.732 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:10:12.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:10:12.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:10:12.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:10:12.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:10:12.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:10:13.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:10:13.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:10:13.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:10:13.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:10:13.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:10:13.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:10:13.083 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:10:13.158 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:09:49
2026-06-03T15:10:13.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86344, datetime.datetime(2026, 6, 3, 15, 9, 49), datetime.datetime(2026, 6, 3, 15, 9, 48), 'salt', 7.3, 99.97, None, 38.49, 102.54, 0.0, 821.19, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:10:13.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:10:13.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:10:13.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:09:48, diff=25.164114s, valid=True
2026-06-03T15:10:13.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:10:13.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:10:13.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:10:12, diff=1.167012s, valid=True
2026-06-03T15:10:13.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:10:13.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:10:13.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:09:48, diff=25.173715s, valid=True
2026-06-03T15:10:13.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:10:13.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:10:13.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:10:13.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:10:13.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:10:13.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:10:13.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:10:12, diff=1.176757s, valid=True
2026-06-03T15:10:13.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:10:13.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:10:13.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:10:13.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66410.177415s, valid=False
2026-06-03T15:10:13.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:10:13.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:10:13.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:10:13.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:10:13.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:10:13.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:10:13.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:10:13.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:10:13.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:10:13.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:10:13.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:10:13.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:10:13.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:10:13.498 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:10:13.703 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:10:14.047 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:10:14.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:10:14.150 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:10:14.150 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:10:14.223 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:10:14.223 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:10:44.253 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:10:44.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:10:44.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:10:44.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:10:44.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:10:44.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:10:44.944 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:10:44.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:10:44.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:10:44.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:10:44.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:10:44.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:10:44.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:10:47.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:10:47.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:10:47.439 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:10:47.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:10:47.451 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:10:47.463 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:10:47.464 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:10:47.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:10:47.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:10:47.465 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:10:47.465 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:10:47.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:10:47.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:10:47.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:10:47.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:10:47.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:10:47.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:10:47.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:10:47.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:10:47.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:10:47.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:10:47.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:10:47.757 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:10:47.826 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:10:19
2026-06-03T15:10:47.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86345, datetime.datetime(2026, 6, 3, 15, 10, 19), datetime.datetime(2026, 6, 3, 15, 10, 18), 'salt', 7.3, 100.0, None, 31.54, 111.04, -0.01, 821.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:10:47.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:10:47.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:10:47.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:10:18, diff=29.833316s, valid=True
2026-06-03T15:10:47.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:10:47.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:10:47.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:10:12, diff=35.836568s, valid=True
2026-06-03T15:10:47.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:10:47.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:10:47.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:10:10, diff=37.844294s, valid=True
2026-06-03T15:10:47.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:10:47.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:10:47.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:10:47.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:10:47.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:10:47.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:10:47.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:10:12, diff=35.847812s, valid=True
2026-06-03T15:10:47.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:10:47.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:10:47.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:10:47.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66444.84857s, valid=False
2026-06-03T15:10:47.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:10:47.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:10:47.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:10:47.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:10:47.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:10:47.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:10:47.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:10:47.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:10:47.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:10:47.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:10:48.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:10:48.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:10:48.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:10:48.236 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:10:48.440 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:10:48.779 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:10:48.882 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:10:48.882 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:10:48.882 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:10:48.998 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:10:48.999 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:11:19.006 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:11:19.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:11:19.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:11:19.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:11:19.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:11:19.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:11:19.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:11:19.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:11:19.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:11:19.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:11:19.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:11:19.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:11:19.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:11:22.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:11:22.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:11:22.302 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:11:22.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:11:22.313 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:11:22.326 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:11:22.326 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:11:22.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:11:22.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:11:22.328 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:11:22.328 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:11:22.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:11:22.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:11:22.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:11:22.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:11:22.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:11:22.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:11:22.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:11:22.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:11:22.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:11:22.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:11:22.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:11:22.678 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:11:22.750 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:11:19
2026-06-03T15:11:22.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86347, datetime.datetime(2026, 6, 3, 15, 11, 19), datetime.datetime(2026, 6, 3, 15, 11, 19), 'salt', 7.3, 100.0, None, 34.12, 104.33, -0.01, 821.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:11:22.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:11:22.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:11:22.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:11:19, diff=3.757973s, valid=True
2026-06-03T15:11:22.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:11:22.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:11:22.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:11:12, diff=10.761471s, valid=True
2026-06-03T15:11:22.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:11:22.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:11:22.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:11:12, diff=10.769686s, valid=True
2026-06-03T15:11:22.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:11:22.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:11:22.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:11:22.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:11:22.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:11:22.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:11:22.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:11:12, diff=10.773397s, valid=True
2026-06-03T15:11:22.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:11:22.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:11:22.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:11:22.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66479.774221s, valid=False
2026-06-03T15:11:22.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:11:22.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:11:22.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:11:22.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:11:22.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:11:22.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:11:22.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:11:22.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:11:22.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:11:22.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:11:22.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:11:23.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:11:23.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:11:23.096 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:11:23.300 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:11:23.639 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:11:23.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:11:23.741 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:11:23.741 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:11:23.898 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:11:23.899 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:11:53.909 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:11:53.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:11:53.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:11:54.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:11:54.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:11:54.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:11:54.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:11:54.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:11:54.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:11:54.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:11:54.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:11:54.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:11:54.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:11:57.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:11:57.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:11:57.387 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:11:57.387 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:11:57.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:11:57.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:11:57.410 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:11:57.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:11:57.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:11:57.411 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:11:57.412 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:11:57.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:11:57.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:11:57.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:11:57.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:11:57.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:11:57.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:11:57.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:11:57.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:11:57.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:11:57.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:11:57.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:11:57.760 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:11:57.839 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:11:50
2026-06-03T15:11:57.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86348, datetime.datetime(2026, 6, 3, 15, 11, 50), datetime.datetime(2026, 6, 3, 15, 11, 49), 'salt', 7.3, 99.97, None, 36.24, 108.46, 0.0, 821.25, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:11:57.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:11:57.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:11:57.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:11:49, diff=8.846738s, valid=True
2026-06-03T15:11:57.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:11:57.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:11:57.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:12:12, diff=-14.149769s, valid=True
2026-06-03T15:11:57.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:11:57.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:11:57.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:11:43, diff=14.858346s, valid=True
2026-06-03T15:11:57.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:11:57.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:11:57.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:11:57.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:11:57.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:11:57.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:11:57.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:12:12, diff=-14.137942s, valid=True
2026-06-03T15:11:57.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:11:57.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:11:57.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:11:57.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66514.862874s, valid=False
2026-06-03T15:11:57.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:11:57.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:11:57.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:11:57.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:11:57.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:11:57.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:11:57.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:11:57.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:11:57.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:11:58.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:11:58.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:11:58.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:11:58.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:11:58.250 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:11:58.479 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:11:58.816 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:11:58.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:11:58.920 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:11:58.920 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:11:59.158 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:11:59.158 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:12:29.187 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:12:29.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:12:29.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:12:29.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:12:29.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:12:29.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:12:29.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:12:29.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:12:29.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:12:29.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:12:29.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:12:29.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:12:29.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:12:32.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:12:32.042 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:12:32.043 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:12:32.043 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:12:32.051 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:12:32.064 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:12:32.064 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:12:32.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:12:32.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:12:32.065 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:12:32.065 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:12:32.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:12:32.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:12:32.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:12:32.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:12:32.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:12:32.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:12:32.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:12:32.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:12:32.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:12:32.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:12:32.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:12:32.407 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:12:32.478 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:12:20
2026-06-03T15:12:32.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86349, datetime.datetime(2026, 6, 3, 15, 12, 20), datetime.datetime(2026, 6, 3, 15, 12, 19), 'salt', 7.27, 99.94, None, 40.68, 110.78, 0.0, 821.0, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:12:32.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:12:32.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:12:32.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:12:19, diff=13.48635s, valid=True
2026-06-03T15:12:32.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:12:32.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:12:32.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:12:12, diff=20.48985s, valid=True
2026-06-03T15:12:32.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:12:32.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:12:32.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:12:14, diff=18.49806s, valid=True
2026-06-03T15:12:32.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:12:32.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:12:32.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:12:32.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:12:32.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:12:32.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:12:32.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:12:12, diff=20.501769s, valid=True
2026-06-03T15:12:32.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:12:32.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:12:32.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:12:32.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66549.502561s, valid=False
2026-06-03T15:12:32.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:12:32.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:12:32.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:12:32.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:12:32.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:12:32.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:12:32.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:12:32.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:12:32.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:12:32.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:12:32.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:12:32.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:12:32.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:12:32.823 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:12:33.027 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:12:33.364 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:12:33.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:12:33.468 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:12:33.468 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:12:33.681 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:12:33.682 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:13:03.710 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:13:03.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:13:03.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:13:03.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:13:03.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:13:04.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:13:04.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:13:04.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:13:04.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:13:04.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:13:04.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:13:04.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:13:04.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:13:06.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:13:06.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:13:06.480 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:13:06.480 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:13:06.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:13:06.503 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:13:06.504 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:13:06.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:13:06.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:13:06.505 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:13:06.505 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:13:06.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:13:06.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:13:06.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:13:06.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:13:06.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:13:06.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:13:06.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:13:06.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:13:06.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:13:06.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:13:06.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:13:06.830 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:13:06.898 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:12:50
2026-06-03T15:13:06.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86350, datetime.datetime(2026, 6, 3, 15, 12, 50), datetime.datetime(2026, 6, 3, 15, 12, 49), 'salt', 7.27, 100.0, None, 36.8, 115.38, -0.01, 821.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:13:06.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:13:06.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:13:06.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:12:49, diff=17.904778s, valid=True
2026-06-03T15:13:06.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:13:06.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:13:06.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:13:12, diff=-5.092365s, valid=True
2026-06-03T15:13:06.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:13:06.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:13:06.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:12:46, diff=20.914411s, valid=True
2026-06-03T15:13:06.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:13:06.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:13:06.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:13:06.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:13:06.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:13:06.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:13:06.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:13:12, diff=-5.082503s, valid=True
2026-06-03T15:13:06.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:13:06.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:13:06.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:13:06.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66583.918151s, valid=False
2026-06-03T15:13:06.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:13:06.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:13:06.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:13:06.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:13:06.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:13:06.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:13:06.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:13:06.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:13:06.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:13:07.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:13:07.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:13:07.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:13:07.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:13:07.306 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:13:07.512 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:13:07.850 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:13:07.952 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:13:07.952 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:13:07.952 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:13:08.148 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:13:08.148 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:13:38.179 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:13:38.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:13:38.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:13:38.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:13:38.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:13:38.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:13:38.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:13:38.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:13:38.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:13:38.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:13:38.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:13:38.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:13:38.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:13:41.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:13:41.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:13:41.843 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:13:41.843 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:13:41.853 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:13:41.866 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:13:41.866 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:13:41.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:13:41.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:13:41.868 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:13:41.868 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:13:41.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:13:42.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:13:42.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:13:42.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:13:42.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:13:42.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:13:42.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:13:42.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:13:42.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:13:42.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:13:42.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:13:42.231 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:13:42.304 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:13:20
2026-06-03T15:13:42.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86351, datetime.datetime(2026, 6, 3, 15, 13, 20), datetime.datetime(2026, 6, 3, 15, 13, 20), 'salt', 7.2, 99.97, None, 34.86, 117.45, 0.0, 821.25, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:13:42.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:13:42.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:13:42.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:13:20, diff=22.311637s, valid=True
2026-06-03T15:13:42.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:13:42.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:13:42.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:13:12, diff=30.315088s, valid=True
2026-06-03T15:13:42.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:13:42.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:13:42.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:13:17, diff=25.32321s, valid=True
2026-06-03T15:13:42.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:13:42.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:13:42.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:13:42.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:13:42.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:13:42.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:13:42.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:13:12, diff=30.326948s, valid=True
2026-06-03T15:13:42.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:13:42.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:13:42.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:13:42.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66619.32777s, valid=False
2026-06-03T15:13:42.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:13:42.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:13:42.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:13:42.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:13:42.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:13:42.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:13:42.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:13:42.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:13:42.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:13:42.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:13:42.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:13:42.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:13:42.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:13:42.646 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:13:42.850 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:13:43.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:13:43.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:13:43.357 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:13:43.357 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:13:43.588 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:13:43.588 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:14:13.618 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:14:13.618 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:14:13.619 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:14:13.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:14:13.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:14:14.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:14:14.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:14:14.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:14:14.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:14:14.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:14:14.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:14:14.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:14:14.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:14:16.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:14:16.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:14:16.702 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:14:16.703 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:14:16.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:14:16.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:14:16.725 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:14:16.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:14:16.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:14:16.726 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:14:16.726 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:14:16.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:14:16.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:14:16.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:14:16.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:14:16.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:14:17.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:14:17.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:14:17.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T15:14:17.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:14:17.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:14:17.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:14:17.058 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:14:17.128 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:13:51
2026-06-03T15:14:17.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86352, datetime.datetime(2026, 6, 3, 15, 13, 51), datetime.datetime(2026, 6, 3, 15, 13, 50), 'salt', 7.33, 100.07, None, 33.24, 107.49, -0.02, 821.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:14:17.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:14:17.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:14:17.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:13:50, diff=27.135856s, valid=True
2026-06-03T15:14:17.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:14:17.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:14:17.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:14:12, diff=5.139351s, valid=True
2026-06-03T15:14:17.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:14:17.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:14:17.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:13:49, diff=28.147524s, valid=True
2026-06-03T15:14:17.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:14:17.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:14:17.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:14:17.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:14:17.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:14:17.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T15:14:17.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:14:12, diff=5.151272s, valid=True
2026-06-03T15:14:17.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:14:17.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:14:17.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:14:17.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66654.152081s, valid=False
2026-06-03T15:14:17.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:14:17.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:14:17.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:14:17.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:14:17.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:14:17.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:14:17.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:14:17.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:14:17.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:14:17.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:14:17.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:14:17.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:14:17.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:14:17.470 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:14:17.676 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:14:18.014 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:14:18.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:14:18.117 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:14:18.117 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:14:18.285 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:14:18.285 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:14:48.302 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:14:48.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:14:48.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:14:48.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:14:48.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:14:48.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:14:48.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:14:48.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:14:48.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:14:48.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:14:48.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:14:48.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:14:48.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:14:52.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:14:52.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:14:52.244 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:14:52.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:14:52.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:14:52.266 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:14:52.267 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:14:52.267 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:14:52.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:14:52.268 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:14:52.268 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:14:52.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:14:52.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:14:52.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:14:52.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:14:52.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:14:52.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:14:52.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:14:52.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:14:52.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:14:52.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:14:52.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:14:52.600 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:14:52.675 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:14:51
2026-06-03T15:14:52.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86354, datetime.datetime(2026, 6, 3, 15, 14, 51), datetime.datetime(2026, 6, 3, 15, 14, 50), 'salt', 7.17, 99.9, None, 34.3, 107.92, 0.01, 821.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:14:52.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:14:52.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:14:52.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:14:50, diff=2.682517s, valid=True
2026-06-03T15:14:52.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:14:52.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:14:52.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:15:12, diff=-19.314216s, valid=True
2026-06-03T15:14:52.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:14:52.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:14:52.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:14:42, diff=10.693493s, valid=True
2026-06-03T15:14:52.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:14:52.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:14:52.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:14:52.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:14:52.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:14:52.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:14:52.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:15:12, diff=-19.302976s, valid=True
2026-06-03T15:14:52.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:14:52.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:14:52.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:14:52.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66689.697795s, valid=False
2026-06-03T15:14:52.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:14:52.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:14:52.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:14:52.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:14:52.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:14:52.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:14:52.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:14:52.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:14:52.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:14:52.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:14:52.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:14:52.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:14:52.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:14:53.017 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:14:53.296 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:14:53.635 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:14:53.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:14:53.737 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:14:53.738 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:14:53.807 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:14:53.807 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:15:23.832 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:15:23.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:15:23.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:15:24.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:15:24.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:15:24.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:15:24.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:15:24.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:15:24.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:15:24.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:15:24.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:15:24.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:15:24.396 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:15:27.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:15:27.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:15:27.067 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:15:27.067 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:15:27.079 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:15:27.091 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:15:27.092 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:15:27.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:15:27.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:15:27.093 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:15:27.093 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:15:27.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:15:27.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:15:27.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:15:27.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:15:27.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:15:27.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:15:27.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:15:27.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:15:27.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:15:27.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:15:27.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:15:27.432 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:15:27.502 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:15:21
2026-06-03T15:15:27.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86355, datetime.datetime(2026, 6, 3, 15, 15, 21), datetime.datetime(2026, 6, 3, 15, 15, 21), 'salt', 7.27, 100.0, None, 28.93, 110.76, -0.01, 821.25, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:15:27.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:15:27.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:15:27.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:15:21, diff=6.510224s, valid=True
2026-06-03T15:15:27.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:15:27.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:15:27.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:15:12, diff=15.513725s, valid=True
2026-06-03T15:15:27.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:15:27.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:15:27.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:15:13, diff=14.521918s, valid=True
2026-06-03T15:15:27.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:15:27.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:15:27.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:15:27.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:15:27.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:15:27.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:15:27.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:15:12, diff=15.525638s, valid=True
2026-06-03T15:15:27.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:15:27.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:15:27.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:15:27.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66724.526448s, valid=False
2026-06-03T15:15:27.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:15:27.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:15:27.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:15:27.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:15:27.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:15:27.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:15:27.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:15:27.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:15:27.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:15:27.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:15:27.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:15:27.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:15:27.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:15:27.846 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:15:28.051 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:15:28.390 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:15:28.492 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:15:28.492 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:15:28.492 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:15:28.656 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:15:28.657 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:15:58.666 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:15:58.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:15:58.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:15:58.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:15:58.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:15:59.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:15:59.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:15:59.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:15:59.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:15:59.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:15:59.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:15:59.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:15:59.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:16:01.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:16:01.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:16:01.742 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:16:01.742 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:16:01.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:16:01.764 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:16:01.765 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:16:01.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:16:01.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:16:01.766 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:16:01.766 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:16:01.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:16:01.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:16:01.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:16:02.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:16:02.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:16:02.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:16:02.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:16:02.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:16:02.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:16:02.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:16:02.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:16:02.096 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:16:02.170 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:15:52
2026-06-03T15:16:02.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86356, datetime.datetime(2026, 6, 3, 15, 15, 52), datetime.datetime(2026, 6, 3, 15, 15, 51), 'salt', 7.24, 99.94, None, 32.71, 114.72, 0.01, 821.31, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:16:02.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:16:02.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:16:02.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:15:51, diff=11.177988s, valid=True
2026-06-03T15:16:02.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:16:02.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:16:02.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:16:12, diff=-9.818262s, valid=True
2026-06-03T15:16:02.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:16:02.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:16:02.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:15:44, diff=18.189328s, valid=True
2026-06-03T15:16:02.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:16:02.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:16:02.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:16:02.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:16:02.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:16:02.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:16:02.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:16:12, diff=-9.806957s, valid=True
2026-06-03T15:16:02.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:16:02.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:16:02.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:16:02.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66759.193826s, valid=False
2026-06-03T15:16:02.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:16:02.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:16:02.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:16:02.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:16:02.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:16:02.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:16:02.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:16:02.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:16:02.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:16:02.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:16:02.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:16:02.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:16:02.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:16:02.584 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:16:02.788 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:16:03.127 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:16:03.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:16:03.229 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:16:03.229 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:16:03.395 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:16:03.395 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:16:33.425 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:16:33.425 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:16:33.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:16:33.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:16:33.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:16:33.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:16:33.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:16:33.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:16:33.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:16:33.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:16:33.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:16:33.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:16:33.831 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:16:36.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:16:36.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:16:36.483 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:16:36.483 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:16:36.493 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:16:36.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:16:36.506 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:16:36.506 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:16:36.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:16:36.507 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:16:36.507 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:16:36.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:16:36.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:16:36.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:16:36.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:16:36.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:16:36.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:16:36.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:16:36.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:16:36.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:16:36.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:16:36.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:16:36.847 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:16:36.916 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:16:22
2026-06-03T15:16:36.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86357, datetime.datetime(2026, 6, 3, 15, 16, 22), datetime.datetime(2026, 6, 3, 15, 16, 21), 'salt', 7.24, 99.94, None, 35.99, 113.32, 0.01, 821.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:16:36.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:16:36.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:16:36.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:16:21, diff=15.923482s, valid=True
2026-06-03T15:16:36.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:16:36.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:16:36.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:16:12, diff=24.926989s, valid=True
2026-06-03T15:16:36.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:16:36.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:16:36.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:16:15, diff=21.93529s, valid=True
2026-06-03T15:16:36.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:16:36.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:16:36.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:16:36.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:16:36.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:16:36.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:16:36.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:16:12, diff=24.939079s, valid=True
2026-06-03T15:16:36.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:16:36.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:16:36.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:16:36.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66793.939911s, valid=False
2026-06-03T15:16:36.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:16:36.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:16:36.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:16:36.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:16:36.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:16:37.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:16:37.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:16:37.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:16:37.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:16:37.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:16:37.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:16:37.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:16:37.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:16:37.261 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:16:37.469 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:16:37.861 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:16:37.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:16:37.963 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:16:37.963 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:16:38.147 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:16:38.147 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:17:08.177 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:17:08.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:17:08.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:17:08.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:17:08.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:17:08.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:17:08.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:17:08.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:17:08.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:17:08.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:17:08.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:17:08.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:17:08.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:17:11.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:17:11.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:17:11.482 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:17:11.482 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:17:11.493 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:17:11.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:17:11.506 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:17:11.507 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:17:11.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:17:11.507 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:17:11.507 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:17:11.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:17:11.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:17:11.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:17:11.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:17:11.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:17:11.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T15:17:11.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:17:11.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T15:17:11.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:17:11.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:17:11.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:17:11.865 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:17:11.935 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:16:52
2026-06-03T15:17:11.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86358, datetime.datetime(2026, 6, 3, 15, 16, 52), datetime.datetime(2026, 6, 3, 15, 16, 51), 'salt', 7.3, 99.97, None, 27.87, 119.77, 0.0, 821.31, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:17:11.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:17:11.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:17:11.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:16:51, diff=20.943405s, valid=True
2026-06-03T15:17:11.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:17:11.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T15:17:11.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:17:12, diff=-0.053096s, valid=True
2026-06-03T15:17:11.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:17:11.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:17:11.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:16:47, diff=24.955025s, valid=True
2026-06-03T15:17:11.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:17:11.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:17:11.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:17:11.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:17:11.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:17:11.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T15:17:11.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:17:12, diff=-0.041248s, valid=True
2026-06-03T15:17:11.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:17:11.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:17:11.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:17:11.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66828.959574s, valid=False
2026-06-03T15:17:11.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:17:11.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:17:11.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:17:11.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:17:11.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:17:12.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:17:12.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:17:12.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:17:12.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:17:12.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:17:12.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:17:12.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:17:12.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:17:12.347 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:17:12.552 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:17:12.896 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:17:12.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:17:12.999 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:17:12.999 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:17:13.697 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:17:13.697 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:17:43.727 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:17:43.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:17:43.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:17:44.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:17:44.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:17:44.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:17:44.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:17:44.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:17:44.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:17:44.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:17:44.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:17:44.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:17:44.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:17:47.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:17:47.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:17:47.137 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:17:47.138 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:17:47.149 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:17:47.161 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:17:47.162 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:17:47.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:17:47.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:17:47.163 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:17:47.163 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:17:47.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:17:47.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:17:47.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:17:47.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:17:47.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:17:47.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T15:17:47.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:17:47.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T15:17:47.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:17:47.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:17:47.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:17:47.496 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:17:47.574 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:17:22
2026-06-03T15:17:47.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86359, datetime.datetime(2026, 6, 3, 15, 17, 22), datetime.datetime(2026, 6, 3, 15, 17, 22), 'salt', 7.37, 99.94, None, 29.6, 126.48, 0.0, 821.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:17:47.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:17:47.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:17:47.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:17:22, diff=25.582017s, valid=True
2026-06-03T15:17:47.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:17:47.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T15:17:47.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:17:12, diff=35.585452s, valid=True
2026-06-03T15:17:47.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:17:47.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:17:47.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:17:18, diff=29.593601s, valid=True
2026-06-03T15:17:47.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:17:47.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:17:47.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:17:47.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:17:47.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:17:47.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T15:17:47.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:17:12, diff=35.597289s, valid=True
2026-06-03T15:17:47.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:17:47.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:17:47.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:17:47.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66864.598108s, valid=False
2026-06-03T15:17:47.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:17:47.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:17:47.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:17:47.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:17:47.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:17:47.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:17:47.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:17:47.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:17:47.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:17:47.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:17:47.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:17:47.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:17:47.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:17:47.918 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:17:48.123 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:17:48.462 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:17:48.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:17:48.564 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:17:48.564 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:17:48.785 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:17:48.785 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:18:18.810 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:18:18.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:18:18.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:18:19.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:18:19.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:18:19.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:18:19.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:18:19.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:18:19.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:18:19.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:18:19.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:18:19.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:18:19.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:18:22.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:18:22.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:18:22.077 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:18:22.077 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:18:22.088 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:18:22.101 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:18:22.101 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:18:22.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:18:22.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:18:22.103 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:18:22.103 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:18:22.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:18:22.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:18:22.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:18:22.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:18:22.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:18:22.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:18:22.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:18:22.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:18:22.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:18:22.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:18:22.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:18:22.443 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:18:22.512 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:17:53
2026-06-03T15:18:22.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86360, datetime.datetime(2026, 6, 3, 15, 17, 53), datetime.datetime(2026, 6, 3, 15, 17, 52), 'salt', 7.37, 100.0, None, 32.46, 128.13, -0.01, 821.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:18:22.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:18:22.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:18:22.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:17:52, diff=30.519873s, valid=True
2026-06-03T15:18:22.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:18:22.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:18:22.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:18:12, diff=10.523368s, valid=True
2026-06-03T15:18:22.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:18:22.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:18:22.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:17:50, diff=32.531551s, valid=True
2026-06-03T15:18:22.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:18:22.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:18:22.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:18:22.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:18:22.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:18:22.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:18:22.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:18:12, diff=10.535287s, valid=True
2026-06-03T15:18:22.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:18:22.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:18:22.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:18:22.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66899.536111s, valid=False
2026-06-03T15:18:22.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:18:22.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:18:22.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:18:22.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:18:22.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:18:22.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:18:22.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:18:22.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:18:22.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:18:22.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:18:22.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:18:22.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:18:22.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:18:22.926 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:18:23.132 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:18:23.472 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:18:23.574 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:18:23.575 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:18:23.575 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:18:23.829 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:18:23.829 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:18:53.852 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:18:53.852 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:18:53.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:18:54.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:18:54.314 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:18:54.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:18:54.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:18:54.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:18:54.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:18:54.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:18:54.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:18:54.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:18:54.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:18:57.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:18:57.284 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:18:57.285 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:18:57.285 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:18:57.293 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:18:57.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:18:57.304 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:18:57.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:18:57.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:18:57.305 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:18:57.305 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:18:57.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:18:57.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:18:57.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:18:57.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:18:57.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:18:57.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:18:57.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:18:57.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:18:57.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:18:57.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:18:57.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:18:57.638 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:18:57.714 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:18:53
2026-06-03T15:18:57.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86362, datetime.datetime(2026, 6, 3, 15, 18, 53), datetime.datetime(2026, 6, 3, 15, 18, 52), 'salt', 7.47, 100.04, None, 28.76, 119.4, -0.01, 821.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:18:57.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:18:57.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:18:57.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:18:52, diff=5.721776s, valid=True
2026-06-03T15:18:57.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:18:57.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:18:57.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:19:12, diff=-14.274895s, valid=True
2026-06-03T15:18:57.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:18:57.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:18:57.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:18:52, diff=5.733073s, valid=True
2026-06-03T15:18:57.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:18:57.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:18:57.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:18:57.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:18:57.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:18:57.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:18:57.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:19:12, diff=-14.263356s, valid=True
2026-06-03T15:18:57.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:18:57.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:18:57.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:18:57.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66934.737418s, valid=False
2026-06-03T15:18:57.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:18:57.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:18:57.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:18:57.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:18:57.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:18:57.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:18:57.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:18:57.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:18:57.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:18:57.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:18:57.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:18:57.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:18:58.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:18:58.054 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:18:58.260 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:18:58.598 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:18:58.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:18:58.704 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:18:58.704 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:18:58.880 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:18:58.880 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:19:28.900 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:19:28.900 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:19:28.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:19:29.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:19:29.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:19:29.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:19:29.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:19:29.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:19:29.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:19:29.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:19:29.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:19:29.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:19:29.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:19:32.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:19:32.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:19:32.035 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:19:32.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:19:32.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:19:32.058 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:19:32.059 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:19:32.059 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:19:32.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:19:32.060 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:19:32.060 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:19:32.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:19:32.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:19:32.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:19:32.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:19:32.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:19:32.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:19:32.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:19:32.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:19:32.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:19:32.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:19:32.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:19:32.467 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:19:32.550 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:19:23
2026-06-03T15:19:32.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86363, datetime.datetime(2026, 6, 3, 15, 19, 23), datetime.datetime(2026, 6, 3, 15, 19, 23), 'salt', 7.47, 100.07, None, 27.63, 109.75, -0.01, 821.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:19:32.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:19:32.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:19:32.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:19:23, diff=9.557801s, valid=True
2026-06-03T15:19:32.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:19:32.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:19:32.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:19:12, diff=20.561405s, valid=True
2026-06-03T15:19:32.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:19:32.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:19:32.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:19:15, diff=17.569816s, valid=True
2026-06-03T15:19:32.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:19:32.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:19:32.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:19:32.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:19:32.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:19:32.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:19:32.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:19:12, diff=20.57365s, valid=True
2026-06-03T15:19:32.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:19:32.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:19:32.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:19:32.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=66969.574489s, valid=False
2026-06-03T15:19:32.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:19:32.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:19:32.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:19:32.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:19:32.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:19:32.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:19:32.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:19:32.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:19:32.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:19:32.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:19:32.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:19:32.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:19:32.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:19:32.895 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:19:33.100 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:19:33.440 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:19:33.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:19:33.542 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:19:33.542 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:19:33.769 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:19:33.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:20:03.799 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:20:03.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:20:03.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:20:03.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:20:03.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:20:04.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:20:04.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:20:04.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:20:04.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:20:04.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:20:04.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:20:04.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:20:04.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:20:06.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:20:06.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:20:06.798 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:20:06.798 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:20:06.808 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:20:06.821 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:20:06.822 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:20:06.822 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:20:06.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:20:06.823 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:20:06.823 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:20:06.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:20:06.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:20:06.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:20:07.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:20:07.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:20:07.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:20:07.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:20:07.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:20:07.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:20:07.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:20:07.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:20:07.170 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:20:07.241 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:19:54
2026-06-03T15:20:07.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86364, datetime.datetime(2026, 6, 3, 15, 19, 54), datetime.datetime(2026, 6, 3, 15, 19, 53), 'salt', 7.33, 99.94, None, 38.04, 124.91, 0.0, 821.19, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T15:20:07.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:20:07.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:20:07.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:19:53, diff=14.249299s, valid=True
2026-06-03T15:20:07.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:20:07.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:20:07.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:20:12, diff=-4.747204s, valid=True
2026-06-03T15:20:07.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:20:07.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:20:07.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:19:45, diff=22.261044s, valid=True
2026-06-03T15:20:07.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:20:07.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:20:07.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:20:07.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:20:07.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:20:07.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:20:07.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:20:12, diff=-4.735194s, valid=True
2026-06-03T15:20:07.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:20:07.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:20:07.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:20:07.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67004.265672s, valid=False
2026-06-03T15:20:07.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:20:07.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:20:07.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:20:07.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:20:07.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:20:07.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:20:07.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:20:07.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:20:07.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:20:07.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:20:07.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:20:07.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:20:07.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:20:07.585 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:20:07.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:20:08.189 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:20:08.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:20:08.291 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:20:08.291 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:20:08.492 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:20:08.492 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:20:38.522 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:20:38.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:20:38.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:20:38.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:20:38.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:20:38.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:20:38.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:20:38.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:20:38.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:20:38.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:20:38.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:20:38.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:20:38.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:20:41.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:20:41.671 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:20:41.672 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:20:41.672 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:20:41.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:20:41.694 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:20:41.695 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:20:41.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:20:41.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:20:41.696 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:20:41.696 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:20:41.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:20:41.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:20:41.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:20:41.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:20:41.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:20:41.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:20:41.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:20:41.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:20:41.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:20:42.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:20:42.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:20:42.004 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:20:42.074 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:20:24
2026-06-03T15:20:42.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86365, datetime.datetime(2026, 6, 3, 15, 20, 24), datetime.datetime(2026, 6, 3, 15, 20, 23), 'salt', 7.43, 100.07, None, 32.36, 132.17, -0.02, 821.25, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T15:20:42.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:20:42.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:20:42.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:20:23, diff=19.081854s, valid=True
2026-06-03T15:20:42.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:20:42.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:20:42.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:20:12, diff=30.085232s, valid=True
2026-06-03T15:20:42.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:20:42.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:20:42.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:20:16, diff=26.093072s, valid=True
2026-06-03T15:20:42.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:20:42.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:20:42.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:20:42.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:20:42.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:20:42.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:20:42.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:20:12, diff=30.096688s, valid=True
2026-06-03T15:20:42.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:20:42.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:20:42.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:20:42.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67039.097469s, valid=False
2026-06-03T15:20:42.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:20:42.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:20:42.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:20:42.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:20:42.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:20:42.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:20:42.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:20:42.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:20:42.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:20:42.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:20:42.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:20:42.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:20:42.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:20:42.417 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:20:42.626 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:20:42.970 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:20:43.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:20:43.075 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:20:43.075 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:20:43.141 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:20:43.141 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:21:13.146 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:21:13.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:21:13.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:21:13.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:21:13.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:21:13.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:21:13.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:21:13.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:21:13.547 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:21:13.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:21:13.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:21:13.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:21:13.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:21:16.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:21:16.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:21:16.217 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:21:16.217 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:21:16.226 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:21:16.247 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:21:16.248 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:21:16.248 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:21:16.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:21:16.249 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:21:16.249 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:21:16.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:21:16.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:21:16.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:21:16.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:21:16.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:21:16.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:21:16.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:21:16.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:21:16.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:21:16.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:21:16.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:21:16.589 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:21:16.662 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:20:54
2026-06-03T15:21:16.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86366, datetime.datetime(2026, 6, 3, 15, 20, 54), datetime.datetime(2026, 6, 3, 15, 20, 53), 'salt', 7.4, 100.04, None, 34.15, 116.11, -0.01, 821.13, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T15:21:16.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:21:16.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:21:16.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:20:53, diff=23.670022s, valid=True
2026-06-03T15:21:16.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:21:16.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:21:16.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:21:12, diff=4.673511s, valid=True
2026-06-03T15:21:16.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:21:16.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:21:16.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:20:48, diff=28.681756s, valid=True
2026-06-03T15:21:16.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:21:16.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:21:16.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:21:16.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:21:16.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:21:16.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:21:16.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:21:12, diff=4.685881s, valid=True
2026-06-03T15:21:16.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:21:16.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:21:16.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:21:16.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67073.686753s, valid=False
2026-06-03T15:21:16.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:21:16.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:21:16.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:21:16.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:21:16.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:21:16.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:21:16.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:21:16.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:21:16.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:21:16.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:21:16.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:21:16.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:21:16.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:21:17.021 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:21:17.309 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:21:17.658 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:21:17.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:21:17.763 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:21:17.764 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:21:17.940 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:21:17.940 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:21:47.970 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:21:47.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:21:47.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:21:48.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:21:49.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:21:49.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:21:49.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:21:49.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:21:49.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:21:49.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:21:49.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:21:49.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:21:49.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:21:52.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:21:52.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:21:52.065 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:21:52.066 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:21:52.075 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:21:52.088 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:21:52.089 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:21:52.089 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:21:52.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:21:52.090 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:21:52.090 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:21:52.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:21:52.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:21:52.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:21:52.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:21:52.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:21:52.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T15:21:52.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:21:52.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T15:21:52.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:21:52.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:21:52.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:21:52.426 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:21:52.499 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:21:24
2026-06-03T15:21:52.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86367, datetime.datetime(2026, 6, 3, 15, 21, 24), datetime.datetime(2026, 6, 3, 15, 21, 24), 'salt', 7.24, 99.94, None, 34.82, 126.06, 0.01, 821.0, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T15:21:52.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:21:52.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:21:52.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:21:24, diff=28.506892s, valid=True
2026-06-03T15:21:52.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:21:52.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T15:21:52.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:21:12, diff=40.510377s, valid=True
2026-06-03T15:21:52.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:21:52.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:21:52.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:21:19, diff=33.518532s, valid=True
2026-06-03T15:21:52.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:21:52.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:21:52.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:21:52.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:21:52.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:21:52.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T15:21:52.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:21:12, diff=40.522295s, valid=True
2026-06-03T15:21:52.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:21:52.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:21:52.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:21:52.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67109.523108s, valid=False
2026-06-03T15:21:52.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:21:52.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:21:52.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:21:52.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:21:52.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:21:52.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:21:52.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:21:52.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:21:52.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:21:52.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:21:52.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:21:52.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:21:52.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:21:52.846 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:21:53.053 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:21:53.395 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:21:53.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:21:53.498 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:21:53.498 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:21:54.003 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:21:54.003 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:22:24.034 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:22:24.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:22:24.034 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:22:24.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:22:24.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:22:24.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:22:24.363 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:22:24.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:22:24.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:22:24.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:22:24.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:22:24.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:22:24.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:22:27.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:22:27.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:22:27.070 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:22:27.070 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:22:27.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:22:27.095 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:22:27.095 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:22:27.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:22:27.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:22:27.096 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:22:27.097 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:22:27.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:22:27.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:22:27.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:22:27.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:22:27.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:22:27.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:22:27.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:22:27.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:22:27.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:22:27.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:22:27.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:22:27.404 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:22:27.472 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:22:25
2026-06-03T15:22:27.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86369, datetime.datetime(2026, 6, 3, 15, 22, 25), datetime.datetime(2026, 6, 3, 15, 22, 24), 'salt', 7.3, 100.04, None, 30.38, 112.66, -0.01, 821.07, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T15:22:27.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:22:27.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:22:27.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:22:24, diff=3.47973s, valid=True
2026-06-03T15:22:27.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:22:27.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:22:27.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:22:12, diff=15.482958s, valid=True
2026-06-03T15:22:27.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:22:27.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:22:27.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:22:22, diff=5.490645s, valid=True
2026-06-03T15:22:27.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:22:27.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:22:27.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:22:27.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:22:27.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:22:27.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:22:27.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:22:12, diff=15.494119s, valid=True
2026-06-03T15:22:27.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:22:27.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:22:27.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:22:27.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67144.49489s, valid=False
2026-06-03T15:22:27.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:22:27.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:22:27.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:22:27.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:22:27.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:22:27.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:22:27.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:22:27.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:22:27.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:22:27.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:22:27.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:22:27.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:22:27.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:22:27.886 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:22:28.093 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:22:28.436 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:22:28.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:22:28.539 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:22:28.539 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:22:28.805 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:22:28.805 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:22:58.835 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:22:58.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:22:58.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:22:59.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:22:59.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:22:59.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:22:59.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:22:59.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:22:59.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:22:59.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:22:59.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:22:59.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:22:59.427 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:23:02.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:23:02.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:23:02.289 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:23:02.290 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:23:02.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:23:02.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:23:02.314 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:23:02.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:23:02.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:23:02.315 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:23:02.316 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:23:02.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:23:02.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:23:02.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:23:02.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:23:02.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:23:02.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:23:02.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:23:02.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:23:02.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:23:02.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:23:02.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:23:02.656 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:23:02.728 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:22:55
2026-06-03T15:23:02.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86370, datetime.datetime(2026, 6, 3, 15, 22, 55), datetime.datetime(2026, 6, 3, 15, 22, 54), 'salt', 7.3, 100.1, None, 30.8, 127.0, -0.02, 821.31, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:23:02.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:23:02.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:23:02.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:22:54, diff=8.735645s, valid=True
2026-06-03T15:23:02.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:23:02.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:23:02.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:23:12, diff=-9.260905s, valid=True
2026-06-03T15:23:02.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:23:02.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:23:02.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:22:53, diff=9.747077s, valid=True
2026-06-03T15:23:02.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:23:02.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:23:02.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:23:02.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:23:02.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:23:02.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:23:02.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:23:12, diff=-9.249274s, valid=True
2026-06-03T15:23:02.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:23:02.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:23:02.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:23:02.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67179.751497s, valid=False
2026-06-03T15:23:02.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:23:02.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:23:02.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:23:02.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:23:02.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:23:02.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:23:02.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:23:02.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:23:02.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:23:02.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:23:02.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:23:02.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:23:03.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:23:03.070 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:23:03.275 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:23:03.610 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:23:03.709 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:23:03.709 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:23:03.709 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:23:03.889 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:23:03.889 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:23:33.919 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:23:33.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:23:33.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:23:34.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:23:34.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:23:34.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:23:34.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:23:34.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:23:34.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:23:34.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:23:34.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:23:34.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:23:34.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:23:37.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:23:37.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:23:37.218 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:23:37.218 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:23:37.226 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:23:37.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:23:37.238 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:23:37.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:23:37.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:23:37.239 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:23:37.239 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:23:37.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:23:37.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:23:37.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:23:37.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:23:37.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:23:37.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:23:37.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:23:37.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:23:37.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:23:37.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:23:37.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:23:37.515 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:23:37.598 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:23:25
2026-06-03T15:23:37.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86371, datetime.datetime(2026, 6, 3, 15, 23, 25), datetime.datetime(2026, 6, 3, 15, 23, 25), 'salt', 7.27, 99.97, None, 27.84, 128.08, 0.0, 821.31, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:23:37.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:23:37.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:23:37.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:23:25, diff=12.604347s, valid=True
2026-06-03T15:23:37.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:23:37.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:23:37.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:23:12, diff=25.607634s, valid=True
2026-06-03T15:23:37.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:23:37.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:23:37.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:23:25, diff=12.615374s, valid=True
2026-06-03T15:23:37.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:23:37.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:23:37.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:23:37.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:23:37.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:23:37.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:23:37.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:23:12, diff=25.618738s, valid=True
2026-06-03T15:23:37.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:23:37.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:23:37.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:23:37.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67214.619438s, valid=False
2026-06-03T15:23:37.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:23:37.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:23:37.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:23:37.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:23:37.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:23:37.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:23:37.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:23:37.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:23:37.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:23:37.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:23:37.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:23:37.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:23:37.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:23:38.018 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:23:38.224 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:23:38.564 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:23:38.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:23:38.666 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:23:38.666 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:23:38.904 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:23:38.904 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:24:08.926 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:24:08.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:24:08.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:24:09.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:24:09.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:24:09.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:24:09.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:24:09.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:24:09.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:24:09.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:24:09.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:24:09.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:24:09.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:24:11.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:24:11.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:24:11.975 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:24:11.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:24:11.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:24:11.999 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:24:12.000 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:24:12.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:24:12.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:24:12.001 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:24:12.001 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:24:12.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:24:12.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:24:12.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:24:12.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:24:12.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:24:12.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:24:12.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:24:12.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:24:12.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:24:12.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:24:12.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:24:12.341 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:24:12.414 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:23:56
2026-06-03T15:24:12.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86372, datetime.datetime(2026, 6, 3, 15, 23, 56), datetime.datetime(2026, 6, 3, 15, 23, 55), 'salt', 7.33, 100.07, None, 33.94, 120.76, -0.02, 821.0, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:24:12.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:24:12.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:24:12.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:23:55, diff=17.421961s, valid=True
2026-06-03T15:24:12.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:24:12.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:24:12.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:24:12, diff=0.425464s, valid=True
2026-06-03T15:24:12.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:24:12.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:24:12.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:23:47, diff=25.433705s, valid=True
2026-06-03T15:24:12.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:24:12.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:24:12.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:24:12.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:24:12.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:24:12.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:24:12.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:24:12, diff=0.437442s, valid=True
2026-06-03T15:24:12.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:24:12.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:24:12.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:24:12.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67249.438262s, valid=False
2026-06-03T15:24:12.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:24:12.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:24:12.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:24:12.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:24:12.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:24:12.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:24:12.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:24:12.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:24:12.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:24:12.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:24:12.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:24:12.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:24:12.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:24:12.759 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:24:12.970 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:24:13.313 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:24:13.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:24:13.416 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:24:13.416 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:24:13.559 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:24:13.559 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:24:43.575 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:24:43.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:24:43.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:24:43.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:24:43.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:24:44.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:24:44.128 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:24:44.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:24:44.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:24:44.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:24:44.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:24:44.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:24:44.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:24:46.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:24:46.833 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:24:46.834 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:24:46.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:24:46.844 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:24:46.857 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:24:46.857 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:24:46.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:24:46.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:24:46.858 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:24:46.859 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:24:46.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:24:46.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:24:46.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:24:47.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:24:47.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:24:47.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:24:47.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:24:47.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:24:47.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:24:47.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:24:47.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:24:47.199 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:24:47.271 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:24:26
2026-06-03T15:24:47.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86373, datetime.datetime(2026, 6, 3, 15, 24, 26), datetime.datetime(2026, 6, 3, 15, 24, 25), 'salt', 7.24, 100.0, None, 33.98, 131.6, 0.0, 821.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:24:47.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:24:47.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:24:47.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:24:25, diff=22.278522s, valid=True
2026-06-03T15:24:47.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:24:47.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:24:47.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:24:12, diff=35.28201s, valid=True
2026-06-03T15:24:47.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:24:47.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:24:47.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:24:17, diff=30.290127s, valid=True
2026-06-03T15:24:47.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:24:47.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:24:47.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:24:47.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:24:47.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:24:47.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:24:47.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:24:12, diff=35.293861s, valid=True
2026-06-03T15:24:47.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:24:47.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:24:47.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:24:47.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67284.294697s, valid=False
2026-06-03T15:24:47.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:24:47.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:24:47.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:24:47.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:24:47.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:24:47.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:24:47.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:24:47.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:24:47.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:24:47.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:24:47.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:24:47.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:24:47.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:24:47.688 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:24:47.895 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:24:48.239 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:24:48.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:24:48.342 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:24:48.342 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:24:48.523 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:24:48.523 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:25:18.545 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:25:18.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:25:18.545 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:25:19.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:25:19.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:25:19.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:25:19.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:25:19.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:25:19.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:25:19.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:25:19.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:25:19.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:25:19.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:25:22.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:25:22.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:25:22.015 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:25:22.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:25:22.026 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:25:22.038 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:25:22.039 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:25:22.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:25:22.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:25:22.040 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:25:22.040 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:25:22.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:25:22.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:25:22.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:25:22.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:25:22.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:25:22.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:25:22.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:25:22.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:25:22.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:25:22.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:25:22.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:25:22.368 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:25:22.436 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:24:56
2026-06-03T15:25:22.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86374, datetime.datetime(2026, 6, 3, 15, 24, 56), datetime.datetime(2026, 6, 3, 15, 24, 55), 'salt', 7.17, 100.04, None, 35.07, 120.08, -0.01, 821.25, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:25:22.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:25:22.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:25:22.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:24:55, diff=27.443966s, valid=True
2026-06-03T15:25:22.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:25:22.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:25:22.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:25:12, diff=10.44734s, valid=True
2026-06-03T15:25:22.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:25:22.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:25:22.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:24:49, diff=33.455223s, valid=True
2026-06-03T15:25:22.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:25:22.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:25:22.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:25:22.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:25:22.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:25:22.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:25:22.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:25:12, diff=10.458821s, valid=True
2026-06-03T15:25:22.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:25:22.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:25:22.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:25:22.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67319.459594s, valid=False
2026-06-03T15:25:22.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:25:22.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:25:22.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:25:22.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:25:22.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:25:22.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:25:22.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:25:22.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:25:22.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:25:22.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:25:22.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:25:22.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:25:22.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:25:22.783 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:25:22.988 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:25:23.343 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:25:23.445 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:25:23.445 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:25:23.445 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:25:23.685 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:25:23.685 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:25:53.715 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:25:53.715 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:25:53.715 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:25:54.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:25:54.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:25:54.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:25:54.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:25:54.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:25:54.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:25:54.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:25:54.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:25:54.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:25:54.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:25:56.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:25:56.987 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:25:56.988 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:25:56.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:25:56.999 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:25:57.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:25:57.012 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:25:57.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:25:57.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:25:57.013 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:25:57.013 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:25:57.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:25:57.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:25:57.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:25:57.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:25:57.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:25:57.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:25:57.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:25:57.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:25:57.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:25:57.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:25:57.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:25:57.333 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:25:57.403 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:25:57
2026-06-03T15:25:57.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86376, datetime.datetime(2026, 6, 3, 15, 25, 57), datetime.datetime(2026, 6, 3, 15, 25, 56), 'salt', 7.1, 99.97, None, 35.32, 122.0, 0.0, 821.31, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:25:57.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:25:57.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:25:57.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:25:56, diff=1.410772s, valid=True
2026-06-03T15:25:57.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:25:57.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:25:57.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:26:12, diff=-14.58584s, valid=True
2026-06-03T15:25:57.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:25:57.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:25:57.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:25:51, diff=6.421963s, valid=True
2026-06-03T15:25:57.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:25:57.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:25:57.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:25:57.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:25:57.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:25:57.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:25:57.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:26:12, diff=-14.574498s, valid=True
2026-06-03T15:25:57.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:25:57.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:25:57.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:25:57.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67354.426284s, valid=False
2026-06-03T15:25:57.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:25:57.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:25:57.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:25:57.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:25:57.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:25:57.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:25:57.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:25:57.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:25:57.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:25:57.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:25:57.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:25:57.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:25:57.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:25:57.743 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:25:57.964 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:25:58.305 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:25:58.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:25:58.411 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:25:58.411 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:25:58.560 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:25:58.560 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:26:28.584 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:26:28.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:26:28.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:26:29.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:26:29.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:26:29.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:26:29.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:26:29.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:26:29.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:26:29.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:26:29.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:26:29.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:26:29.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:26:32.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:26:32.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:26:32.703 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:26:32.704 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:26:32.713 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:26:32.725 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:26:32.726 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:26:32.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:26:32.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:26:32.727 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:26:32.727 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:26:32.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:26:32.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:26:32.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:26:32.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:26:32.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:26:33.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:26:33.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:26:33.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:26:33.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:26:33.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:26:33.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:26:33.066 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:26:33.138 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:26:27
2026-06-03T15:26:33.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86377, datetime.datetime(2026, 6, 3, 15, 26, 27), datetime.datetime(2026, 6, 3, 15, 26, 26), 'salt', 7.2, 100.1, None, 34.97, 126.56, -0.02, 821.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:26:33.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:26:33.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:26:33.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:26:26, diff=7.145663s, valid=True
2026-06-03T15:26:33.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:26:33.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:26:33.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:26:12, diff=21.149258s, valid=True
2026-06-03T15:26:33.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:26:33.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:26:33.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:26:23, diff=10.157494s, valid=True
2026-06-03T15:26:33.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:26:33.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:26:33.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:26:33.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:26:33.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:26:33.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:26:33.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:26:12, diff=21.161242s, valid=True
2026-06-03T15:26:33.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:26:33.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:26:33.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:26:33.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67390.162056s, valid=False
2026-06-03T15:26:33.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:26:33.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:26:33.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:26:33.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:26:33.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:26:33.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:26:33.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:26:33.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:26:33.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:26:33.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:26:33.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:26:33.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:26:33.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:26:33.481 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:26:33.686 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:26:34.026 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:26:34.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:26:34.183 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:26:34.183 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:26:34.369 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:26:34.369 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:27:04.397 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:27:04.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:27:04.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:27:04.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:27:04.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:27:04.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:27:04.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:27:04.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:27:04.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:27:04.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:27:04.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:27:04.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:27:04.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:27:07.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:27:07.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:27:07.557 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:27:07.557 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:27:07.569 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:27:07.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:27:07.582 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:27:07.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:27:07.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:27:07.583 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:27:07.583 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:27:07.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:27:07.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:27:07.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:27:07.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:27:07.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:27:07.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:27:07.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:27:07.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:27:07.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:27:07.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:27:07.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:27:07.947 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:27:08.030 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:26:57
2026-06-03T15:27:08.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86378, datetime.datetime(2026, 6, 3, 15, 26, 57), datetime.datetime(2026, 6, 3, 15, 26, 56), 'salt', 7.1, 100.0, None, 32.67, 123.83, -0.01, 821.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:27:08.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:27:08.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:27:08.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:26:56, diff=12.038064s, valid=True
2026-06-03T15:27:08.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:27:08.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:27:08.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:27:12, diff=-3.95828s, valid=True
2026-06-03T15:27:08.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:27:08.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:27:08.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:26:54, diff=14.05029s, valid=True
2026-06-03T15:27:08.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:27:08.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:27:08.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:27:08.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:27:08.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:27:08.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:27:08.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:27:12, diff=-3.945849s, valid=True
2026-06-03T15:27:08.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:27:08.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:27:08.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:27:08.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67425.05499s, valid=False
2026-06-03T15:27:08.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:27:08.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:27:08.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:27:08.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:27:08.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:27:08.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:27:08.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:27:08.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:27:08.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:27:08.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:27:08.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:27:08.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:27:08.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:27:08.379 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:27:08.585 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:27:08.958 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:27:09.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:27:09.061 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:27:09.061 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:27:09.286 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:27:09.287 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:27:39.312 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:27:39.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:27:39.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:27:39.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:27:39.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:27:40.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:27:40.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:27:40.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:27:40.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:27:40.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:27:40.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:27:40.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:27:40.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:27:43.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:27:43.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:27:43.117 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:27:43.117 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:27:43.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:27:43.140 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:27:43.140 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:27:43.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:27:43.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:27:43.141 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:27:43.142 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:27:43.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:27:43.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:27:43.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:27:43.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:27:43.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:27:43.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:27:43.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:27:43.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:27:43.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:27:43.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:27:43.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:27:43.493 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:27:43.563 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:27:27
2026-06-03T15:27:43.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86379, datetime.datetime(2026, 6, 3, 15, 27, 27), datetime.datetime(2026, 6, 3, 15, 27, 27), 'salt', 7.07, 99.94, None, 33.94, 126.91, 0.0, 821.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:27:43.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:27:43.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:27:43.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:27:27, diff=16.57109s, valid=True
2026-06-03T15:27:43.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:27:43.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:27:43.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:27:12, diff=31.574444s, valid=True
2026-06-03T15:27:43.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:27:43.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:27:43.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:27:26, diff=17.582562s, valid=True
2026-06-03T15:27:43.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:27:43.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:27:43.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:27:43.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:27:43.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:27:43.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:27:43.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:27:12, diff=31.586263s, valid=True
2026-06-03T15:27:43.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:27:43.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:27:43.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:27:43.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67460.587056s, valid=False
2026-06-03T15:27:43.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:27:43.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:27:43.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:27:43.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:27:43.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:27:43.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:27:43.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:27:43.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:27:43.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:27:43.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:27:43.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:27:43.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:27:43.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:27:43.913 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:27:44.200 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:27:44.549 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:27:44.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:27:44.654 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:27:44.654 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:27:44.739 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:27:44.739 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:28:14.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:28:14.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:28:14.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:28:15.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:28:15.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:28:15.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:28:15.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:28:15.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:28:15.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:28:15.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:28:15.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:28:15.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:28:15.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:28:18.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:28:18.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:28:18.008 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:28:18.008 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:28:18.017 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:28:18.029 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:28:18.029 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:28:18.029 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:28:18.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:28:18.029 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:28:18.030 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:28:18.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:28:18.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:28:18.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:28:18.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:28:18.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:28:18.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:28:18.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:28:18.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:28:18.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:28:18.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:28:18.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:28:18.305 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:28:18.375 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:27:58
2026-06-03T15:28:18.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86380, datetime.datetime(2026, 6, 3, 15, 27, 58), datetime.datetime(2026, 6, 3, 15, 27, 57), 'salt', 7.14, 100.07, None, 33.77, 109.89, -0.01, 821.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:28:18.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:28:18.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:28:18.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:27:57, diff=21.38252s, valid=True
2026-06-03T15:28:18.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:28:18.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:28:18.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:28:12, diff=6.385581s, valid=True
2026-06-03T15:28:18.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:28:18.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:28:18.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:27:57, diff=21.392966s, valid=True
2026-06-03T15:28:18.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:28:18.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:28:18.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:28:18.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:28:18.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:28:18.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:28:18.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:28:12, diff=6.396295s, valid=True
2026-06-03T15:28:18.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:28:18.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:28:18.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:28:18.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67495.397021s, valid=False
2026-06-03T15:28:18.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:28:18.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:28:18.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:28:18.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:28:18.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:28:18.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:28:18.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:28:18.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:28:18.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:28:18.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:28:18.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:28:18.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:28:18.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:28:18.717 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:28:18.930 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:28:19.278 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:28:19.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:28:19.384 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:28:19.384 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:28:19.702 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:28:19.702 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:28:49.718 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:28:49.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:28:49.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:28:50.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:28:50.199 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:28:50.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:28:50.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:28:50.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:28:50.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:28:50.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:28:50.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:28:50.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:28:50.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:28:53.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:28:53.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:28:53.220 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:28:53.221 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:28:53.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:28:53.243 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:28:53.244 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:28:53.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:28:53.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:28:53.245 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:28:53.245 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:28:53.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:28:53.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:28:53.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:28:53.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:28:53.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:28:53.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T15:28:53.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:28:53.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T15:28:53.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:28:53.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:28:53.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:28:53.577 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:28:53.651 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:28:28
2026-06-03T15:28:53.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86381, datetime.datetime(2026, 6, 3, 15, 28, 28), datetime.datetime(2026, 6, 3, 15, 28, 27), 'salt', 7.04, 100.04, None, 37.4, 124.63, -0.01, 821.25, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:28:53.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:28:53.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:28:53.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:28:27, diff=26.658365s, valid=True
2026-06-03T15:28:53.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:28:53.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T15:28:53.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:28:12, diff=41.661717s, valid=True
2026-06-03T15:28:53.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:28:53.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:28:53.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:28:19, diff=34.669645s, valid=True
2026-06-03T15:28:53.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:28:53.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:28:53.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:28:53.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:28:53.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:28:53.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T15:28:53.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:28:12, diff=41.673239s, valid=True
2026-06-03T15:28:53.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:28:53.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:28:53.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:28:53.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67530.674016s, valid=False
2026-06-03T15:28:53.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:28:53.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:28:53.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:28:53.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:28:53.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:28:53.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:28:53.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:28:53.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:28:53.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:28:53.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:28:53.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:28:53.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:28:54.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:28:54.062 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:28:54.266 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:28:54.606 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:28:54.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:28:54.708 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:28:54.708 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:28:54.879 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:28:54.879 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:29:24.890 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:29:24.890 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:29:24.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:29:25.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:29:25.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:29:25.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:29:25.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:29:25.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:29:25.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:29:25.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:29:25.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:29:25.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:29:25.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:29:27.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:29:28.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:29:28.007 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:29:28.008 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:29:28.017 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:29:28.029 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:29:28.030 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:29:28.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:29:28.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:29:28.031 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:29:28.031 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:29:28.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:29:28.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:29:28.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:29:28.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:29:28.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:29:28.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:29:28.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:29:28.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:29:28.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:29:28.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:29:28.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:29:28.300 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:29:28.369 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:28:58
2026-06-03T15:29:28.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86382, datetime.datetime(2026, 6, 3, 15, 28, 58), datetime.datetime(2026, 6, 3, 15, 28, 58), 'salt', 7.0, 100.04, None, 33.73, 119.16, -0.01, 821.19, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:29:28.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:29:28.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:29:28.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:28:58, diff=30.376101s, valid=True
2026-06-03T15:29:28.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:29:28.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:29:28.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:29:12, diff=16.379304s, valid=True
2026-06-03T15:29:28.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:29:28.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:29:28.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:28:50, diff=38.387036s, valid=True
2026-06-03T15:29:28.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:29:28.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:29:28.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:29:28.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:29:28.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:29:28.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:29:28.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:29:12, diff=16.390462s, valid=True
2026-06-03T15:29:28.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:29:28.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:29:28.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:29:28.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67565.391211s, valid=False
2026-06-03T15:29:28.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:29:28.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:29:28.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:29:28.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:29:28.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:29:28.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:29:28.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:29:28.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:29:28.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:29:28.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:29:28.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:29:28.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:29:28.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:29:28.710 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:29:28.914 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:29:29.254 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:29:29.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:29:29.357 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:29:29.357 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:29:29.520 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:29:29.521 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:29:59.547 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:29:59.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:29:59.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:29:59.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:29:59.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:29:59.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:29:59.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:29:59.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:29:59.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:29:59.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:29:59.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:29:59.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:29:59.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:30:02.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:30:02.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:30:02.589 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:30:02.589 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:30:02.597 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:30:02.609 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:30:02.609 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:30:02.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:30:02.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:30:02.610 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:30:02.610 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:30:02.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:30:02.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:30:02.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:30:02.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:30:02.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:30:02.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:30:02.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:30:02.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:30:02.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:30:02.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:30:02.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:30:02.892 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:30:02.963 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:29:59
2026-06-03T15:30:02.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86384, datetime.datetime(2026, 6, 3, 15, 29, 59), datetime.datetime(2026, 6, 3, 15, 29, 58), 'salt', 7.0, 100.37, None, 35.04, 131.91, -0.06, 821.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:30:02.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:30:02.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:30:02.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:29:58, diff=4.970743s, valid=True
2026-06-03T15:30:02.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:30:02.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:30:02.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:30:12, diff=-9.025981s, valid=True
2026-06-03T15:30:02.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:30:02.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:30:02.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:29:53, diff=9.981809s, valid=True
2026-06-03T15:30:02.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:30:02.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:30:02.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:30:02.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:30:02.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:30:02.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:30:02.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:30:12, diff=-9.014602s, valid=True
2026-06-03T15:30:02.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:30:02.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:30:02.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:30:02.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67599.986199s, valid=False
2026-06-03T15:30:02.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:30:02.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:30:02.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:30:02.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:30:02.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:30:03.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:30:03.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:30:03.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:30:03.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:30:03.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:30:03.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:30:03.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:30:03.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:30:03.382 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:30:03.594 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:30:03.944 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:30:04.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:30:04.049 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:30:04.049 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:30:04.303 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:30:04.303 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:30:34.333 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:30:34.333 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:30:34.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:30:34.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:30:34.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:30:34.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:30:34.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:30:34.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:30:34.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:30:34.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:30:34.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:30:34.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:30:34.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:30:37.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:30:37.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:30:37.439 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:30:37.439 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:30:37.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:30:37.458 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:30:37.458 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:30:37.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:30:37.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:30:37.458 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:30:37.458 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:30:37.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:30:37.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:30:37.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:30:37.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:30:37.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:30:37.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:30:37.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:30:37.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:30:37.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:30:37.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:30:37.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:30:37.759 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:30:37.832 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:30:29
2026-06-03T15:30:37.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86385, datetime.datetime(2026, 6, 3, 15, 30, 29), datetime.datetime(2026, 6, 3, 15, 30, 28), 'salt', 7.0, 99.94, None, 38.14, 124.7, 0.0, 821.0, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:30:37.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:30:37.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:30:37.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:30:28, diff=9.848994s, valid=True
2026-06-03T15:30:37.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:30:37.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:30:37.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:30:12, diff=25.852577s, valid=True
2026-06-03T15:30:37.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:30:37.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:30:37.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:30:24, diff=13.860582s, valid=True
2026-06-03T15:30:37.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:30:37.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:30:37.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:30:37.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:30:37.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:30:37.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:30:37.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:30:12, diff=25.864257s, valid=True
2026-06-03T15:30:37.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:30:37.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:30:37.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:30:37.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67634.865076s, valid=False
2026-06-03T15:30:37.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:30:37.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:30:37.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:30:37.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:30:37.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:30:37.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:30:37.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:30:37.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:30:37.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:30:38.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:30:38.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:30:38.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:30:38.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:30:38.202 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:30:38.407 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:30:38.744 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:30:38.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:30:38.846 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:30:38.846 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:30:39.004 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:30:39.004 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:31:09.012 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:31:09.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:31:09.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:31:09.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:31:09.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:31:09.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:31:09.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:31:09.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:31:09.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:31:09.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:31:09.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:31:09.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:31:09.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:31:12.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:31:12.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:31:12.185 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:31:12.185 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:31:12.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:31:12.208 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:31:12.208 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:31:12.209 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:31:12.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:31:12.209 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:31:12.210 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:31:12.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:31:12.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:31:12.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:31:12.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:31:12.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:31:12.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:31:12.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:31:12.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:31:12.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:31:12.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:31:12.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:31:12.552 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:31:12.626 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:30:59
2026-06-03T15:31:12.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86386, datetime.datetime(2026, 6, 3, 15, 30, 59), datetime.datetime(2026, 6, 3, 15, 30, 58), 'salt', 7.04, 100.04, None, 32.43, 125.62, -0.01, 821.0, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:31:12.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:31:12.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:31:12.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:30:58, diff=14.634336s, valid=True
2026-06-03T15:31:12.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:31:12.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:31:12.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:31:12, diff=0.637825s, valid=True
2026-06-03T15:31:12.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:31:12.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:31:12.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:30:55, diff=17.646003s, valid=True
2026-06-03T15:31:12.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:31:12.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:31:12.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:31:12.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:31:12.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:31:12.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:31:12.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:31:12, diff=0.64971s, valid=True
2026-06-03T15:31:12.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:31:12.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:31:12.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:31:12.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67669.650519s, valid=False
2026-06-03T15:31:12.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:31:12.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:31:12.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:31:12.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:31:12.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:31:12.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:31:12.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:31:12.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:31:12.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:31:12.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:31:12.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:31:12.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:31:12.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:31:13.036 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:31:13.265 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:31:13.606 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:31:13.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:31:13.713 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:31:13.713 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:31:13.889 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:31:13.889 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:31:43.919 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:31:43.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:31:43.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:31:44.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:31:44.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:31:44.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:31:44.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:31:44.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:31:44.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:31:44.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:31:44.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:31:44.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:31:44.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:31:47.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:31:47.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:31:47.332 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:31:47.332 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:31:47.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:31:47.354 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:31:47.354 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:31:47.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:31:47.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:31:47.355 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:31:47.356 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:31:47.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:31:47.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:31:47.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:31:47.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:31:47.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:31:47.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:31:47.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:31:47.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:31:47.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:31:47.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:31:47.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:31:47.703 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:31:47.776 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:31:29
2026-06-03T15:31:47.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86387, datetime.datetime(2026, 6, 3, 15, 31, 29), datetime.datetime(2026, 6, 3, 15, 31, 29), 'salt', 6.97, 100.07, None, 32.43, 129.0, -0.02, 821.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:31:47.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:31:47.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:31:47.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:31:29, diff=18.783814s, valid=True
2026-06-03T15:31:47.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:31:47.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:31:47.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:31:12, diff=35.787441s, valid=True
2026-06-03T15:31:47.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:31:47.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:31:47.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:31:27, diff=20.795594s, valid=True
2026-06-03T15:31:47.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:31:47.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:31:47.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:31:47.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:31:47.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:31:47.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:31:47.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:31:12, diff=35.799327s, valid=True
2026-06-03T15:31:47.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:31:47.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:31:47.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:31:47.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67704.80015s, valid=False
2026-06-03T15:31:47.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:31:47.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:31:47.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:31:47.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:31:47.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:31:47.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:31:47.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:31:47.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:31:47.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:31:47.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:31:47.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:31:48.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:31:48.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:31:48.122 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:31:48.328 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:31:48.665 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:31:48.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:31:48.769 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:31:48.769 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:31:48.854 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:31:48.854 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:32:18.859 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:32:18.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:32:18.860 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:32:19.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:32:19.181 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:32:19.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:32:19.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:32:19.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:32:19.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:32:19.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:32:19.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:32:19.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:32:19.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:32:22.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:32:22.546 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:32:22.546 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:32:22.546 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:32:22.555 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:32:22.566 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:32:22.567 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:32:22.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:32:22.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:32:22.567 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:32:22.567 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:32:22.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:32:22.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:32:22.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:32:22.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:32:22.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:32:22.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:32:22.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:32:22.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:32:22.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:32:22.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:32:22.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:32:22.872 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:32:22.948 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:32:00
2026-06-03T15:32:22.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86388, datetime.datetime(2026, 6, 3, 15, 32), datetime.datetime(2026, 6, 3, 15, 31, 59), 'salt', 7.04, 100.07, None, 35.11, 120.33, -0.01, 821.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:32:22.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:32:22.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:32:22.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:31:59, diff=23.955386s, valid=True
2026-06-03T15:32:22.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:32:22.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:32:22.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:32:12, diff=10.958809s, valid=True
2026-06-03T15:32:22.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:32:22.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:32:22.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:31:58, diff=24.966757s, valid=True
2026-06-03T15:32:22.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:32:22.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:32:22.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:32:22.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:32:22.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:32:22.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:32:22.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:32:12, diff=10.970325s, valid=True
2026-06-03T15:32:22.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:32:22.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:32:22.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:32:22.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67739.971103s, valid=False
2026-06-03T15:32:22.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:32:22.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:32:22.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:32:22.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:32:22.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:32:23.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:32:23.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:32:23.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:32:23.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:32:23.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:32:23.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:32:23.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:32:23.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:32:23.290 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:32:23.495 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:32:23.830 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:32:23.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:32:23.930 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:32:23.930 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:32:24.139 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:32:24.140 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:32:54.170 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:32:54.170 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:32:54.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:32:54.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:32:54.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:32:55.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:32:55.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:32:55.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:32:55.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:32:55.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:32:55.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:32:55.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:32:55.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:32:57.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:32:57.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:32:57.830 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:32:57.830 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:32:57.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:32:57.854 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:32:57.855 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:32:57.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:32:57.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:32:57.856 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:32:57.856 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:32:57.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:32:57.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:32:57.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:32:58.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:32:58.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:32:58.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T15:32:58.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:32:58.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T15:32:58.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:32:58.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:32:58.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:32:58.206 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:32:58.278 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:32:30
2026-06-03T15:32:58.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86389, datetime.datetime(2026, 6, 3, 15, 32, 30), datetime.datetime(2026, 6, 3, 15, 32, 29), 'salt', 7.0, 100.0, None, 27.91, 106.39, -0.01, 821.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:32:58.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:32:58.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:32:58.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:32:29, diff=29.286371s, valid=True
2026-06-03T15:32:58.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:32:58.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T15:32:58.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:32:12, diff=46.289848s, valid=True
2026-06-03T15:32:58.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:32:58.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:32:58.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:32:30, diff=28.298152s, valid=True
2026-06-03T15:32:58.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:32:58.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:32:58.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:32:58.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:32:58.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:32:58.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T15:32:58.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:32:12, diff=46.301893s, valid=True
2026-06-03T15:32:58.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:32:58.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:32:58.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:32:58.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67775.3027s, valid=False
2026-06-03T15:32:58.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:32:58.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:32:58.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:32:58.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:32:58.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:32:58.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:32:58.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:32:58.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:32:58.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:32:58.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:32:58.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:32:58.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:32:58.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:32:58.622 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:32:58.826 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:32:59.165 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:32:59.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:32:59.328 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:32:59.328 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:32:59.807 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:32:59.807 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:33:29.836 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:33:29.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:33:29.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:33:30.117 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:33:30.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:33:30.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:33:30.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:33:30.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:33:30.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:33:30.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:33:30.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:33:30.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:33:30.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:33:33.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:33:33.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:33:33.648 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:33:33.648 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:33:33.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:33:33.670 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:33:33.671 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:33:33.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:33:33.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:33:33.672 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:33:33.672 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:33:33.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:33:33.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:33:33.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:33:33.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:33:33.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:33:33.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:33:33.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:33:34.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:33:34.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:33:34.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:33:34.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:33:34.038 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:33:34.115 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:33:30
2026-06-03T15:33:34.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86391, datetime.datetime(2026, 6, 3, 15, 33, 30), datetime.datetime(2026, 6, 3, 15, 33, 30), 'salt', 6.97, 100.07, None, 31.76, 112.94, -0.02, 821.0, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:33:34.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:33:34.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:33:34.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:33:30, diff=4.123292s, valid=True
2026-06-03T15:33:34.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:33:34.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:33:34.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:33:12, diff=22.126901s, valid=True
2026-06-03T15:33:34.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:33:34.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:33:34.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:33:22, diff=12.135466s, valid=True
2026-06-03T15:33:34.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:33:34.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:33:34.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:33:34.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:33:34.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:33:34.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:33:34.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:33:12, diff=22.139408s, valid=True
2026-06-03T15:33:34.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:33:34.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:33:34.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:33:34.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67811.140255s, valid=False
2026-06-03T15:33:34.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:33:34.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:33:34.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:33:34.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:33:34.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:33:34.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:33:34.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:33:34.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:33:34.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:33:34.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:33:34.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:33:34.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:33:34.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:33:34.462 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:33:34.670 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:33:35.014 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:33:35.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:33:35.117 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:33:35.117 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:33:35.258 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:33:35.258 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:34:05.278 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:34:05.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:34:05.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:34:05.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:34:05.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:34:05.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:34:05.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:34:05.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:34:05.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:34:05.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:34:05.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:34:05.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:34:05.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:34:08.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:34:08.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:34:08.421 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:34:08.422 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:34:08.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:34:08.445 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:34:08.445 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:34:08.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:34:08.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:34:08.447 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:34:08.447 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:34:08.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:34:08.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:34:08.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:34:08.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:34:08.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:34:08.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:34:08.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:34:08.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:34:08.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:34:08.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:34:08.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:34:08.800 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:34:08.872 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:34:01
2026-06-03T15:34:08.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86392, datetime.datetime(2026, 6, 3, 15, 34, 1), datetime.datetime(2026, 6, 3, 15, 34), 'salt', 7.07, 100.0, None, 35.21, 120.8, -0.01, 820.94, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:34:08.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:34:08.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:34:08.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:34:00, diff=8.880435s, valid=True
2026-06-03T15:34:08.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:34:08.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:34:08.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:34:12, diff=-3.115945s, valid=True
2026-06-03T15:34:08.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:34:08.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:34:08.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:33:53, diff=15.892543s, valid=True
2026-06-03T15:34:08.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:34:08.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:34:08.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:34:08.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:34:08.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:34:08.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:34:08.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:34:12, diff=-3.103537s, valid=True
2026-06-03T15:34:08.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:34:08.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:34:08.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:34:08.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67845.89729s, valid=False
2026-06-03T15:34:08.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:34:08.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:34:08.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:34:08.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:34:08.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:34:08.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:34:08.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:34:08.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:34:08.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:34:09.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:34:09.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:34:09.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:34:09.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:34:09.223 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:34:09.508 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:34:09.871 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:34:09.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:34:09.996 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:34:09.996 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:34:10.239 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:34:10.239 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:34:40.269 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:34:40.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:34:40.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:34:40.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:34:40.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:34:40.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:34:40.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:34:40.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:34:40.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:34:40.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:34:40.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:34:40.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:34:40.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:34:43.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:34:43.667 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:34:43.668 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:34:43.668 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:34:43.678 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:34:43.691 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:34:43.692 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:34:43.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:34:43.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:34:43.693 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:34:43.693 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:34:43.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:34:43.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:34:43.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:34:43.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:34:43.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:34:43.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:34:43.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:34:44.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:34:44.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:34:44.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:34:44.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:34:44.034 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:34:44.107 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:34:31
2026-06-03T15:34:44.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86393, datetime.datetime(2026, 6, 3, 15, 34, 31), datetime.datetime(2026, 6, 3, 15, 34, 30), 'salt', 7.07, 100.04, None, 33.03, 123.76, -0.01, 820.94, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:34:44.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:34:44.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:34:44.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:34:30, diff=14.115145s, valid=True
2026-06-03T15:34:44.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:34:44.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:34:44.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:34:12, diff=32.118663s, valid=True
2026-06-03T15:34:44.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:34:44.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:34:44.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:34:25, diff=19.126803s, valid=True
2026-06-03T15:34:44.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:34:44.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:34:44.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:34:44.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:34:44.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:34:44.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:34:44.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:34:12, diff=32.130583s, valid=True
2026-06-03T15:34:44.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:34:44.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:34:44.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:34:44.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67881.131438s, valid=False
2026-06-03T15:34:44.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:34:44.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:34:44.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:34:44.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:34:44.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:34:44.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:34:44.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:34:44.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:34:44.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:34:44.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:34:44.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:34:44.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:34:44.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:34:44.454 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:34:44.662 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:34:45.004 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:34:45.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:34:45.107 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:34:45.107 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:34:45.259 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:34:45.259 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:35:15.261 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:35:15.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:35:15.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:35:15.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:35:15.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:35:15.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:35:15.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:35:15.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:35:15.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:35:15.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:35:15.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:35:15.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:35:15.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:35:18.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:35:18.377 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:35:18.378 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:35:18.378 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:35:18.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:35:18.401 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:35:18.402 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:35:18.402 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:35:18.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:35:18.403 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:35:18.403 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:35:18.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:35:18.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:35:18.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:35:18.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:35:18.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:35:18.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:35:18.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:35:18.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:35:18.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:35:18.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:35:18.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:35:18.749 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:35:18.820 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:35:02
2026-06-03T15:35:18.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86394, datetime.datetime(2026, 6, 3, 15, 35, 2), datetime.datetime(2026, 6, 3, 15, 35, 1), 'salt', 6.97, 99.9, None, 40.05, 121.86, 0.01, 821.0, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:35:18.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:35:18.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:35:18.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:35:01, diff=17.828345s, valid=True
2026-06-03T15:35:18.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:35:18.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:35:18.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:35:12, diff=6.831963s, valid=True
2026-06-03T15:35:18.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:35:18.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:35:18.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:34:56, diff=22.840266s, valid=True
2026-06-03T15:35:18.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:35:18.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:35:18.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:35:18.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:35:18.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:35:18.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:35:18.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:35:12, diff=6.844009s, valid=True
2026-06-03T15:35:18.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:35:18.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:35:18.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:35:18.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67915.844834s, valid=False
2026-06-03T15:35:18.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:35:18.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:35:18.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:35:18.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:35:18.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:35:18.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:35:18.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:35:18.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:35:18.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:35:18.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:35:19.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:35:19.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:35:19.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:35:19.236 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:35:19.439 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:35:19.779 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:35:19.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:35:19.891 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:35:19.891 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:35:19.970 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:35:19.970 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:35:50.000 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:35:50.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:35:50.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:35:50.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:35:50.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:35:50.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:35:50.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:35:50.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:35:50.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:35:50.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:35:50.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:35:50.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:35:50.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:35:53.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:35:53.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:35:53.377 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:35:53.377 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:35:53.386 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:35:53.399 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:35:53.400 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:35:53.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:35:53.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:35:53.401 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:35:53.401 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:35:53.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:35:53.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:35:53.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:35:53.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:35:53.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:35:53.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:35:53.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:35:53.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T15:35:53.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:35:53.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:35:53.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:35:53.745 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:35:53.815 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:35:32
2026-06-03T15:35:53.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86395, datetime.datetime(2026, 6, 3, 15, 35, 32), datetime.datetime(2026, 6, 3, 15, 35, 31), 'salt', 7.07, 100.07, None, 38.35, 119.98, -0.02, 821.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:35:53.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:35:53.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:35:53.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:35:31, diff=22.823272s, valid=True
2026-06-03T15:35:53.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:35:53.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:35:53.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:35:12, diff=41.826763s, valid=True
2026-06-03T15:35:53.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:35:53.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:35:53.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:35:28, diff=25.83484s, valid=True
2026-06-03T15:35:53.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:35:53.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:35:53.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:35:53.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:35:53.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:35:53.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T15:35:53.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:35:12, diff=41.838545s, valid=True
2026-06-03T15:35:53.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:35:53.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:35:53.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:35:53.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67950.83937s, valid=False
2026-06-03T15:35:53.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:35:53.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:35:53.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:35:53.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:35:53.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:35:53.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:35:53.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:35:53.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:35:53.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:35:53.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:35:54.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:35:54.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:35:54.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:35:54.158 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:35:54.363 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:35:54.701 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:35:54.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:35:54.804 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:35:54.804 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:35:54.943 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:35:54.943 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:36:24.974 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:36:24.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:36:24.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:36:25.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:36:25.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:36:26.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:36:26.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:36:26.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:36:26.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:36:26.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:36:26.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:36:26.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:36:26.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:36:28.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:36:28.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:36:28.785 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:36:28.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:36:28.796 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:36:28.809 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:36:28.809 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:36:28.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:36:28.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:36:28.810 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:36:28.811 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:36:28.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:36:28.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:36:28.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:36:29.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:36:29.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:36:29.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T15:36:29.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:36:29.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T15:36:29.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:36:29.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:36:29.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:36:29.147 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:36:29.217 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:36:02
2026-06-03T15:36:29.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86396, datetime.datetime(2026, 6, 3, 15, 36, 2), datetime.datetime(2026, 6, 3, 15, 36, 1), 'salt', 7.04, 100.0, None, 35.11, 119.4, 0.0, 820.88, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:36:29.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:36:29.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:36:29.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:36:01, diff=28.224797s, valid=True
2026-06-03T15:36:29.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:36:29.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T15:36:29.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:35:12, diff=77.228267s, valid=True
2026-06-03T15:36:29.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:36:29.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:36:29.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:35:59, diff=30.236525s, valid=True
2026-06-03T15:36:29.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:36:29.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:36:29.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:36:29.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:36:29.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:36:29.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T15:36:29.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:35:12, diff=77.24025s, valid=True
2026-06-03T15:36:29.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:36:29.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:36:29.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:36:29.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=67986.24106s, valid=False
2026-06-03T15:36:29.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:36:29.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:36:29.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:36:29.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:36:29.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:36:29.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:36:29.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:36:29.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:36:29.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:36:29.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:36:29.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:36:29.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:36:29.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:36:29.630 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:36:29.856 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:36:30.208 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:36:30.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:36:30.312 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:36:30.312 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:36:30.384 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:36:30.385 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:37:00.415 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:37:00.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:37:00.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:37:00.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:37:00.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:37:00.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:37:00.860 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:37:00.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:37:00.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:37:00.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:37:00.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:37:00.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:37:00.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:37:04.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:37:04.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:37:04.277 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:37:04.277 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:37:04.289 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:37:04.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:37:04.302 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:37:04.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:37:04.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:37:04.303 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:37:04.303 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:37:04.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:37:04.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:37:04.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:37:04.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:37:04.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:37:04.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:37:04.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:37:04.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:37:04.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:37:04.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:37:04.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:37:04.639 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:37:04.719 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:37:03
2026-06-03T15:37:04.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86398, datetime.datetime(2026, 6, 3, 15, 37, 3), datetime.datetime(2026, 6, 3, 15, 37, 2), 'salt', 6.97, 100.0, None, 42.87, 122.92, -0.01, 820.94, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:37:04.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:37:04.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:37:04.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:37:02, diff=2.726275s, valid=True
2026-06-03T15:37:04.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:37:04.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:37:04.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:35:12, diff=112.729681s, valid=True
2026-06-03T15:37:04.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:37:04.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:37:04.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:37:02, diff=2.737591s, valid=True
2026-06-03T15:37:04.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:37:04.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:37:04.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:37:04.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:37:04.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:37:04.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:37:04.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:35:12, diff=112.741223s, valid=True
2026-06-03T15:37:04.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:37:04.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:37:04.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:37:04.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68021.742013s, valid=False
2026-06-03T15:37:04.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:37:04.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:37:04.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:37:04.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:37:04.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:37:04.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:37:04.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:37:04.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:37:04.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:37:04.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:37:04.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:37:04.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:37:05.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:37:05.062 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:37:05.260 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:37:05.593 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:37:05.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:37:05.695 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:37:05.695 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:37:05.907 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:37:05.907 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:37:35.937 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:37:35.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:37:35.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:37:36.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:37:36.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:37:36.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:37:36.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:37:36.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:37:36.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:37:36.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:37:36.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:37:36.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:37:36.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:37:39.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:37:39.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:37:39.238 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:37:39.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:37:39.248 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:37:39.260 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:37:39.261 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:37:39.261 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:37:39.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:37:39.262 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:37:39.262 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:37:39.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:37:39.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:37:39.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:37:39.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:37:39.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:37:39.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:37:39.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:37:39.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:37:39.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:37:39.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:37:39.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:37:39.672 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:37:39.750 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:37:33
2026-06-03T15:37:39.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86399, datetime.datetime(2026, 6, 3, 15, 37, 33), datetime.datetime(2026, 6, 3, 15, 37, 32), 'salt', 7.0, 100.0, None, 34.58, 126.67, -0.01, 820.94, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:37:39.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:37:39.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:37:39.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:37:32, diff=7.756824s, valid=True
2026-06-03T15:37:39.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:37:39.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:37:39.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:35:12, diff=147.759638s, valid=True
2026-06-03T15:37:39.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:37:39.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:37:39.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:37:24, diff=15.766195s, valid=True
2026-06-03T15:37:39.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:37:39.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:37:39.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:37:39.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:37:39.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:37:39.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:37:39.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:35:12, diff=147.769191s, valid=True
2026-06-03T15:37:39.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:37:39.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:37:39.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:37:39.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68056.769847s, valid=False
2026-06-03T15:37:39.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:37:39.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:37:39.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:37:39.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:37:39.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:37:39.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:37:39.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:37:39.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:37:39.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:37:39.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:37:39.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:37:40.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:37:40.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:37:40.131 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:37:40.333 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:37:40.667 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:37:40.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:37:40.769 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:37:40.769 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:37:40.852 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:37:40.853 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:38:10.883 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:38:10.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:38:10.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:38:11.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:38:11.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:38:11.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:38:11.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:38:11.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:38:11.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:38:11.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:38:11.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:38:11.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:38:11.483 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:38:14.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:38:14.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:38:14.164 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:38:14.165 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:38:14.175 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:38:14.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:38:14.188 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:38:14.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:38:14.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:38:14.189 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:38:14.190 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:38:14.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:38:14.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:38:14.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:38:14.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:38:14.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:38:14.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:38:14.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:38:14.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:38:14.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:38:14.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:38:14.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:38:14.533 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:38:14.619 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:38:03
2026-06-03T15:38:14.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86400, datetime.datetime(2026, 6, 3, 15, 38, 3), datetime.datetime(2026, 6, 3, 15, 38, 3), 'salt', 7.0, 100.04, None, 40.68, 123.79, -0.01, 820.76, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:38:14.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:38:14.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:38:14.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:38:03, diff=11.626535s, valid=True
2026-06-03T15:38:14.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:38:14.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:38:14.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:35:12, diff=182.630022s, valid=True
2026-06-03T15:38:14.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:38:14.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:38:14.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:37:55, diff=19.638243s, valid=True
2026-06-03T15:38:14.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:38:14.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:38:14.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:38:14.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:38:14.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:38:14.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:38:14.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:35:12, diff=182.64199s, valid=True
2026-06-03T15:38:14.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:38:14.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:38:14.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:38:14.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68091.642811s, valid=False
2026-06-03T15:38:14.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:38:14.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:38:14.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:38:14.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:38:14.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:38:14.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:38:14.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:38:14.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:38:14.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:38:14.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:38:14.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:38:14.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:38:14.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:38:14.965 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:38:15.164 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:38:15.497 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:38:15.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:38:15.598 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:38:15.598 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:38:15.756 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:38:15.756 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:38:45.783 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:38:45.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:38:45.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:38:46.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:38:46.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:38:46.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:38:46.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:38:46.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:38:46.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:38:46.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:38:46.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:38:46.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:38:46.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:38:49.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:38:49.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:38:49.104 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:38:49.104 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:38:49.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:38:49.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:38:49.127 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:38:49.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:38:49.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:38:49.128 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:38:49.129 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:38:49.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:38:49.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:38:49.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:38:49.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:38:49.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:38:49.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:38:49.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:38:49.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:38:49.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:38:49.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:38:49.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:38:49.472 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:38:49.543 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:38:34
2026-06-03T15:38:49.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86401, datetime.datetime(2026, 6, 3, 15, 38, 34), datetime.datetime(2026, 6, 3, 15, 38, 33), 'salt', 7.04, 100.04, None, 43.36, 121.18, -0.01, 821.0, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:38:49.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:38:49.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:38:49.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:38:33, diff=16.550685s, valid=True
2026-06-03T15:38:49.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:38:49.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:38:49.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:39:12, diff=-22.445828s, valid=True
2026-06-03T15:38:49.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:38:49.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:38:49.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:38:26, diff=23.56224s, valid=True
2026-06-03T15:38:49.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:38:49.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:38:49.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:38:49.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:38:49.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:38:49.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:38:49.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:39:12, diff=-22.434052s, valid=True
2026-06-03T15:38:49.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:38:49.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:38:49.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:38:49.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68126.566766s, valid=False
2026-06-03T15:38:49.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:38:49.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:38:49.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:38:49.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:38:49.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:38:49.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:38:49.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:38:49.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:38:49.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:38:49.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:38:49.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:38:49.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:38:49.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:38:49.888 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:38:50.111 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:38:50.462 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:38:50.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:38:50.562 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:38:50.562 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:38:50.715 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:38:50.715 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:39:20.746 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:39:20.746 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:39:20.746 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:39:21.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:39:21.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:39:21.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:39:21.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:39:21.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:39:21.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:39:21.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:39:21.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:39:21.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:39:21.477 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:39:24.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:39:24.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:39:24.124 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:39:24.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:39:24.135 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:39:24.147 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:39:24.148 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:39:24.148 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:39:24.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:39:24.149 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:39:24.149 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:39:24.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:39:24.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:39:24.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:39:24.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:39:24.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:39:24.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:39:24.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:39:24.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:39:24.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:39:24.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:39:24.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:39:24.481 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:39:24.551 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:39:05
2026-06-03T15:39:24.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86402, datetime.datetime(2026, 6, 3, 15, 39, 5), datetime.datetime(2026, 6, 3, 15, 39, 4), 'salt', 7.0, 99.97, None, 38.74, 127.92, 0.0, 820.82, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:39:24.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:39:24.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:39:24.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:39:04, diff=20.559209s, valid=True
2026-06-03T15:39:24.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:39:24.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:39:24.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:39:12, diff=12.562686s, valid=True
2026-06-03T15:39:24.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:39:24.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:39:24.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:38:57, diff=27.57092s, valid=True
2026-06-03T15:39:24.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:39:24.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:39:24.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:39:24.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:39:24.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:39:24.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:39:24.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:39:12, diff=12.574651s, valid=True
2026-06-03T15:39:24.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:39:24.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:39:24.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:39:24.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68161.575447s, valid=False
2026-06-03T15:39:24.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:39:24.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:39:24.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:39:24.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:39:24.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:39:24.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:39:24.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:39:24.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:39:24.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:39:24.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:39:24.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:39:24.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:39:24.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:39:24.895 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:39:25.091 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:39:25.480 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:39:25.579 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:39:25.579 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:39:25.579 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:39:27.368 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:39:27.368 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:39:57.398 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:39:57.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:39:57.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:39:57.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:39:57.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:39:57.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:39:57.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:39:57.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:39:57.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:39:57.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:39:57.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:39:57.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:39:57.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:40:00.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:40:00.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:40:00.680 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:40:00.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:40:00.690 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:40:00.703 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:40:00.704 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:40:00.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:40:00.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:40:00.705 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:40:00.705 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:40:00.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:40:00.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:40:00.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:40:00.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:40:00.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:40:00.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:40:00.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:40:01.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:40:01.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:40:01.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:40:01.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:40:01.035 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:40:01.105 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:39:35
2026-06-03T15:40:01.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86403, datetime.datetime(2026, 6, 3, 15, 39, 35), datetime.datetime(2026, 6, 3, 15, 39, 34), 'salt', 7.0, 100.04, None, 41.99, 122.73, -0.01, 820.88, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:40:01.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:40:01.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:40:01.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:39:34, diff=27.112927s, valid=True
2026-06-03T15:40:01.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:40:01.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:40:01.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:40:12, diff=-10.883703s, valid=True
2026-06-03T15:40:01.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:40:01.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:40:01.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:39:29, diff=32.124185s, valid=True
2026-06-03T15:40:01.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:40:01.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:40:01.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:40:01.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:40:01.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:40:01.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:40:01.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:40:12, diff=-10.872192s, valid=True
2026-06-03T15:40:01.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:40:01.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:40:01.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:40:01.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68198.128739s, valid=False
2026-06-03T15:40:01.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:40:01.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:40:01.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:40:01.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:40:01.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:40:01.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:40:01.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:40:01.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:40:01.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:40:01.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:40:01.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:40:01.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:40:01.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:40:01.447 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:40:01.645 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:40:02.012 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:40:02.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:40:02.113 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:40:02.113 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:40:02.376 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:40:02.376 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:40:32.406 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:40:32.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:40:32.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:40:32.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:40:32.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:40:33.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:40:33.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:40:33.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:40:33.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:40:33.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:40:33.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:40:33.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:40:33.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:40:35.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:40:35.901 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:40:35.901 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:40:35.902 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:40:35.911 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:40:35.923 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:40:35.924 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:40:35.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:40:35.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:40:35.925 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:40:35.925 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:40:35.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:40:36.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:40:36.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:40:36.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:40:36.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:40:36.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:40:36.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:40:36.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:40:36.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:40:36.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:40:36.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:40:36.261 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:40:36.332 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:40:35
2026-06-03T15:40:36.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86405, datetime.datetime(2026, 6, 3, 15, 40, 35), datetime.datetime(2026, 6, 3, 15, 40, 35), 'salt', 6.97, 100.0, None, 30.1, 122.71, -0.01, 821.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:40:36.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:40:36.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:40:36.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:40:35, diff=1.340096s, valid=True
2026-06-03T15:40:36.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:40:36.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:40:36.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:41:12, diff=-35.656431s, valid=True
2026-06-03T15:40:36.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:40:36.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:40:36.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:40:32, diff=4.35156s, valid=True
2026-06-03T15:40:36.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:40:36.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:40:36.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:40:36.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:40:36.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:40:36.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:40:36.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:41:12, diff=-35.644741s, valid=True
2026-06-03T15:40:36.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:40:36.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:40:36.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:40:36.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68233.356089s, valid=False
2026-06-03T15:40:36.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:40:36.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:40:36.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:40:36.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:40:36.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:40:36.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:40:36.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:40:36.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:40:36.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:40:36.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:40:36.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:40:36.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:40:36.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:40:36.678 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:40:36.957 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:40:37.293 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:40:37.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:40:37.397 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:40:37.397 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:40:37.626 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:40:37.627 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:41:07.630 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:41:07.631 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:41:07.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:41:07.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:41:07.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:41:08.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:41:08.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:41:08.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:41:08.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:41:08.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:41:08.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:41:08.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:41:08.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:41:10.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:41:10.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:41:10.713 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:41:10.713 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:41:10.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:41:10.732 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:41:10.733 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:41:10.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:41:10.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:41:10.733 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:41:10.733 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:41:10.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:41:10.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:41:10.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:41:10.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:41:10.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:41:10.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:41:10.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:41:11.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:41:11.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:41:11.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:41:11.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:41:11.025 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:41:11.094 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:41:06
2026-06-03T15:41:11.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86406, datetime.datetime(2026, 6, 3, 15, 41, 6), datetime.datetime(2026, 6, 3, 15, 41, 5), 'salt', 6.97, 99.94, None, 36.84, 128.17, 0.0, 820.82, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:41:11.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:41:11.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:41:11.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:41:05, diff=6.100986s, valid=True
2026-06-03T15:41:11.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:41:11.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:41:11.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:41:12, diff=-0.895812s, valid=True
2026-06-03T15:41:11.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:41:11.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:41:11.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:41:03, diff=8.111388s, valid=True
2026-06-03T15:41:11.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:41:11.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:41:11.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:41:11.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:41:11.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:41:11.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:41:11.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:41:12, diff=-0.885429s, valid=True
2026-06-03T15:41:11.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:41:11.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:41:11.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:41:11.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68268.115232s, valid=False
2026-06-03T15:41:11.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:41:11.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:41:11.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:41:11.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:41:11.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:41:11.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:41:11.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:41:11.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:41:11.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:41:11.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:41:11.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:41:11.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:41:11.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:41:11.431 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:41:11.627 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:41:11.963 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:41:12.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:41:12.064 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:41:12.064 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:41:12.242 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:41:12.242 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:41:42.245 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:41:42.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:41:42.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:41:42.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:41:42.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:41:43.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:41:43.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:41:43.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:41:43.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:41:43.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:41:43.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:41:43.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:41:43.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:41:46.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:41:46.079 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:41:46.079 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:41:46.080 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:41:46.089 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:41:46.101 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:41:46.102 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:41:46.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:41:46.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:41:46.103 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:41:46.103 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:41:46.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:41:46.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:41:46.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:41:46.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:41:46.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:41:46.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:41:46.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:41:46.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:41:46.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:41:46.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:41:46.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:41:46.440 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:41:46.511 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:41:36
2026-06-03T15:41:46.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86407, datetime.datetime(2026, 6, 3, 15, 41, 36), datetime.datetime(2026, 6, 3, 15, 41, 35), 'salt', 7.1, 100.07, None, 28.44, 122.14, -0.02, 820.88, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:41:46.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:41:46.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:41:46.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:41:35, diff=11.519316s, valid=True
2026-06-03T15:41:46.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:41:46.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:41:46.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:42:12, diff=-25.477159s, valid=True
2026-06-03T15:41:46.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:41:46.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:41:46.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:41:35, diff=11.531081s, valid=True
2026-06-03T15:41:46.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:41:46.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:41:46.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:41:46.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:41:46.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:41:46.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:41:46.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:42:12, diff=-25.46518s, valid=True
2026-06-03T15:41:46.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:41:46.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:41:46.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:41:46.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68303.535639s, valid=False
2026-06-03T15:41:46.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:41:46.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:41:46.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:41:46.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:41:46.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:41:46.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:41:46.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:41:46.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:41:46.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:41:46.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:41:46.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:41:46.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:41:46.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:41:46.928 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:41:47.128 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:41:47.462 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:41:47.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:41:47.563 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:41:47.564 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:41:47.747 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:41:47.747 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:42:17.778 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:42:17.778 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:42:17.778 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:42:17.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:42:17.944 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:42:18.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:42:18.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:42:18.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:42:18.181 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:42:18.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:42:18.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:42:18.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:42:18.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:42:20.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:42:20.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:42:20.871 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:42:20.871 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:42:20.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:42:20.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:42:20.894 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:42:20.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:42:20.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:42:20.895 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:42:20.896 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:42:20.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:42:21.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:42:21.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:42:21.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:42:21.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:42:21.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:42:21.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:42:21.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:42:21.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:42:21.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:42:21.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:42:21.230 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:42:21.301 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:42:06
2026-06-03T15:42:21.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86408, datetime.datetime(2026, 6, 3, 15, 42, 6), datetime.datetime(2026, 6, 3, 15, 42, 5), 'salt', 7.17, 100.1, None, 35.42, 117.05, -0.02, 820.76, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:42:21.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:42:21.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:42:21.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:42:05, diff=16.308805s, valid=True
2026-06-03T15:42:21.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:42:21.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:42:21.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:42:12, diff=9.312274s, valid=True
2026-06-03T15:42:21.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:42:21.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:42:21.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:41:57, diff=24.320392s, valid=True
2026-06-03T15:42:21.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:42:21.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:42:21.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:42:21.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:42:21.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:42:21.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:42:21.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:42:12, diff=9.324104s, valid=True
2026-06-03T15:42:21.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:42:21.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:42:21.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:42:21.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68338.324935s, valid=False
2026-06-03T15:42:21.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:42:21.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:42:21.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:42:21.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:42:21.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:42:21.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:42:21.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:42:21.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:42:21.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:42:21.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:42:21.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:42:21.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:42:21.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:42:21.650 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:42:21.847 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:42:22.190 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:42:22.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:42:22.294 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:42:22.294 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:42:22.465 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:42:22.465 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:42:52.495 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:42:52.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:42:52.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:42:52.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:42:52.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:42:52.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:42:52.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:42:52.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:42:52.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:42:52.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:42:52.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:42:52.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:42:52.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:42:55.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:42:55.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:42:55.504 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:42:55.504 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:42:55.515 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:42:55.527 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:42:55.528 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:42:55.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:42:55.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:42:55.529 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:42:55.529 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:42:55.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:42:55.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:42:55.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:42:55.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:42:55.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:42:55.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:42:55.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:42:55.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:42:55.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:42:55.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:42:55.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:42:55.861 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:42:55.932 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:42:36
2026-06-03T15:42:55.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86409, datetime.datetime(2026, 6, 3, 15, 42, 36), datetime.datetime(2026, 6, 3, 15, 42, 36), 'salt', 7.14, 100.04, None, 35.25, 134.54, -0.01, 820.88, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:42:55.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:42:55.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:42:55.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:42:36, diff=19.939482s, valid=True
2026-06-03T15:42:55.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:42:55.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:42:55.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:43:12, diff=-16.057042s, valid=True
2026-06-03T15:42:55.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:42:55.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:42:55.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:42:27, diff=28.951048s, valid=True
2026-06-03T15:42:55.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:42:55.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:42:55.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:42:55.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:42:55.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:42:55.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:42:55.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:43:12, diff=-16.045214s, valid=True
2026-06-03T15:42:55.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:42:55.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:42:55.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:42:55.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68372.955581s, valid=False
2026-06-03T15:42:55.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:42:55.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:42:55.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:42:55.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:42:55.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:42:56.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:42:56.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:42:56.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:42:56.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:42:56.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:42:56.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:42:56.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:42:56.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:42:56.340 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:42:56.537 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:42:56.863 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:42:56.962 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:42:56.962 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:42:56.962 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:42:57.032 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:42:57.032 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:43:27.057 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:43:27.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:43:27.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:43:27.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:43:27.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:43:27.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:43:27.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:43:27.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:43:27.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:43:28.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:43:28.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:43:28.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:43:28.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:43:30.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:43:30.863 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:43:30.864 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:43:30.864 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:43:30.873 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:43:30.887 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:43:30.888 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:43:30.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:43:30.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:43:30.889 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:43:30.889 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:43:30.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:43:31.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:43:31.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:43:31.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:43:31.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:43:31.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:43:31.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:43:31.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:43:31.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:43:31.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:43:31.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:43:31.237 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:43:31.310 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:43:07
2026-06-03T15:43:31.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86410, datetime.datetime(2026, 6, 3, 15, 43, 7), datetime.datetime(2026, 6, 3, 15, 43, 6), 'salt', 7.07, 100.04, None, 39.09, 112.33, -0.01, 820.82, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:43:31.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:43:31.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:43:31.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:43:06, diff=25.317872s, valid=True
2026-06-03T15:43:31.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:43:31.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:43:31.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:43:12, diff=19.321249s, valid=True
2026-06-03T15:43:31.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:43:31.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:43:31.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:42:58, diff=33.329302s, valid=True
2026-06-03T15:43:31.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:43:31.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:43:31.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:43:31.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:43:31.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:43:31.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:43:31.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:43:12, diff=19.332967s, valid=True
2026-06-03T15:43:31.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:43:31.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:43:31.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:43:31.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68408.333753s, valid=False
2026-06-03T15:43:31.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:43:31.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:43:31.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:43:31.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:43:31.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:43:31.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:43:31.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:43:31.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:43:31.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:43:31.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:43:31.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:43:31.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:43:31.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:43:31.654 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:43:31.852 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:43:32.180 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:43:32.282 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:43:32.282 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:43:32.282 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:43:32.445 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:43:32.445 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:44:02.457 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:44:02.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:44:02.458 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:44:02.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:44:02.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:44:02.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:44:02.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:44:02.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:44:02.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:44:02.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:44:02.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:44:02.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:44:02.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:44:05.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:44:05.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:44:05.521 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:44:05.521 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:44:05.532 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:44:05.545 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:44:05.546 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:44:05.546 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:44:05.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:44:05.547 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:44:05.547 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:44:05.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:44:05.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:44:05.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:44:05.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:44:05.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:44:05.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:44:05.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:44:05.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:44:05.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:44:05.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:44:05.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:44:05.882 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:44:05.952 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:43:37
2026-06-03T15:44:05.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86411, datetime.datetime(2026, 6, 3, 15, 43, 37), datetime.datetime(2026, 6, 3, 15, 43, 36), 'salt', 7.07, 100.07, None, 38.64, 114.49, -0.02, 820.82, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:44:05.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:44:05.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:44:05.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:43:36, diff=29.960206s, valid=True
2026-06-03T15:44:05.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:44:05.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:44:05.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:44:12, diff=-6.036309s, valid=True
2026-06-03T15:44:05.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:44:05.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:44:05.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:43:30, diff=35.971819s, valid=True
2026-06-03T15:44:05.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:44:05.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:44:05.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:44:05.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:44:05.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:44:05.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:44:05.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:44:12, diff=-6.024481s, valid=True
2026-06-03T15:44:05.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:44:05.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:44:05.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:44:05.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68442.976333s, valid=False
2026-06-03T15:44:05.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:44:05.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:44:05.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:44:05.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:44:05.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:44:06.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:44:06.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:44:06.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:44:06.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:44:06.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:44:06.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:44:06.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:44:06.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:44:06.297 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:44:06.493 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:44:06.825 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:44:06.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:44:06.925 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:44:06.925 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:44:07.108 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:44:07.108 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:44:37.138 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:44:37.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:44:37.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:44:37.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:44:37.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:44:37.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:44:37.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:44:38.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:44:38.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:44:38.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:44:38.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:44:38.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:44:38.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:44:40.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:44:40.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:44:40.678 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:44:40.678 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:44:40.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:44:40.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:44:40.700 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:44:40.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:44:40.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:44:40.700 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:44:40.701 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:44:40.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:44:40.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:44:40.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:44:40.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:44:40.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:44:40.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:44:40.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:44:41.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:44:41.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:44:41.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:44:41.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:44:41.026 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:44:41.096 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:44:37
2026-06-03T15:44:41.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86413, datetime.datetime(2026, 6, 3, 15, 44, 37), datetime.datetime(2026, 6, 3, 15, 44, 37), 'salt', 6.97, 100.0, None, 43.08, 127.38, -0.01, 820.82, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:44:41.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:44:41.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:44:41.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:44:37, diff=4.10409s, valid=True
2026-06-03T15:44:41.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:44:41.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:44:41.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:45:12, diff=-30.892436s, valid=True
2026-06-03T15:44:41.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:44:41.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:44:41.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:44:33, diff=8.115811s, valid=True
2026-06-03T15:44:41.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:44:41.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:44:41.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:44:41.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:44:41.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:44:41.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:44:41.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:45:12, diff=-30.880421s, valid=True
2026-06-03T15:44:41.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:44:41.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:44:41.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:44:41.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68478.12041s, valid=False
2026-06-03T15:44:41.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:44:41.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:44:41.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:44:41.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:44:41.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:44:41.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:44:41.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:44:41.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:44:41.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:44:41.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:44:41.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:44:41.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:44:41.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:44:41.444 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:44:41.640 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:44:42.031 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:44:42.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:44:42.131 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:44:42.131 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:44:42.215 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:44:42.215 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:45:12.245 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:45:12.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:45:12.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:45:12.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:45:12.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:45:12.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:45:12.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:45:12.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:45:12.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:45:12.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:45:12.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:45:12.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:45:12.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:45:15.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:45:15.409 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:45:15.410 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:45:15.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:45:15.421 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:45:15.434 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:45:15.434 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:45:15.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:45:15.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:45:15.435 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:45:15.436 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:45:15.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:45:15.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:45:15.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:45:15.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:45:15.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:45:15.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:45:15.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:45:15.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:45:15.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:45:15.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:45:15.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:45:15.788 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:45:15.861 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:45:08
2026-06-03T15:45:15.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86414, datetime.datetime(2026, 6, 3, 15, 45, 8), datetime.datetime(2026, 6, 3, 15, 45, 7), 'salt', 6.94, 100.0, None, 43.75, 104.77, 0.0, 821.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:45:15.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:45:15.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:45:15.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:45:07, diff=8.8684s, valid=True
2026-06-03T15:45:15.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:45:15.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:45:15.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:45:12, diff=3.871628s, valid=True
2026-06-03T15:45:15.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:45:15.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:45:15.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:45:04, diff=11.878868s, valid=True
2026-06-03T15:45:15.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:45:15.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:45:15.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:45:15.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:45:15.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:45:15.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:45:15.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:45:12, diff=3.882018s, valid=True
2026-06-03T15:45:15.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:45:15.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:45:15.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:45:15.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68512.882701s, valid=False
2026-06-03T15:45:15.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:45:15.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:45:15.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:45:15.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:45:15.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:45:15.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:45:15.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:45:15.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:45:15.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:45:16.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:45:16.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:45:16.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:45:16.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:45:16.201 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:45:16.398 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:45:16.729 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:45:16.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:45:16.830 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:45:16.830 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:45:17.013 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:45:17.013 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:45:47.044 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:45:47.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:45:47.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:45:47.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:45:47.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:45:47.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:45:47.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:45:47.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:45:47.428 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:45:47.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:45:47.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:45:47.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:45:47.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:45:50.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:45:50.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:45:50.179 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:45:50.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:45:50.187 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:45:50.199 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:45:50.200 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:45:50.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:45:50.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:45:50.201 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:45:50.201 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:45:50.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:45:50.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:45:50.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:45:50.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:45:50.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:45:50.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:45:50.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:45:50.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:45:50.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:45:50.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:45:50.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:45:50.519 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:45:50.588 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:45:38
2026-06-03T15:45:50.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86415, datetime.datetime(2026, 6, 3, 15, 45, 38), datetime.datetime(2026, 6, 3, 15, 45, 37), 'salt', 6.84, 99.94, None, 46.36, 115.45, 0.01, 820.88, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T15:45:50.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:45:50.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:45:50.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:45:37, diff=13.595585s, valid=True
2026-06-03T15:45:50.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:45:50.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:45:50.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:46:12, diff=-21.401082s, valid=True
2026-06-03T15:45:50.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:45:50.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:45:50.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:45:36, diff=14.606917s, valid=True
2026-06-03T15:45:50.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:45:50.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:45:50.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:45:50.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:45:50.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:45:50.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:45:50.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:46:12, diff=-21.389526s, valid=True
2026-06-03T15:45:50.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:45:50.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:45:50.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:45:50.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68547.611258s, valid=False
2026-06-03T15:45:50.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:45:50.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:45:50.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:45:50.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:45:50.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:45:50.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:45:50.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:45:50.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:45:50.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:45:50.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:45:50.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:45:50.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:45:50.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:45:50.928 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:45:51.198 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:45:51.532 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:45:51.633 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:45:51.633 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:45:51.633 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:45:51.841 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:45:51.841 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:46:21.870 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:46:21.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:46:21.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:46:22.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:46:22.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:46:22.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:46:22.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:46:22.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:46:22.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:46:22.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:46:22.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:46:22.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:46:22.483 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:46:25.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:46:25.523 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:46:25.524 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:46:25.524 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:46:25.535 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:46:25.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:46:25.548 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:46:25.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:46:25.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:46:25.550 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:46:25.550 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:46:25.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:46:25.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:46:25.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:46:25.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:46:25.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:46:25.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:46:25.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:46:25.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:46:25.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:46:25.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:46:25.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:46:25.881 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:46:25.951 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:46:08
2026-06-03T15:46:25.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86416, datetime.datetime(2026, 6, 3, 15, 46, 8), datetime.datetime(2026, 6, 3, 15, 46, 7), 'salt', 6.97, 100.0, None, 47.31, 118.55, -0.01, 820.82, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T15:46:25.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:46:25.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:46:25.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:46:07, diff=18.958591s, valid=True
2026-06-03T15:46:25.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:46:25.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:46:25.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:46:12, diff=13.961974s, valid=True
2026-06-03T15:46:25.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:46:25.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:46:25.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:46:07, diff=18.969936s, valid=True
2026-06-03T15:46:25.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:46:25.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:46:25.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:46:25.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:46:25.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:46:25.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:46:25.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:46:12, diff=13.973496s, valid=True
2026-06-03T15:46:25.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:46:25.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:46:25.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:46:25.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68582.974285s, valid=False
2026-06-03T15:46:25.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:46:25.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:46:25.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:46:25.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:46:25.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:46:26.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:46:26.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:46:26.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:46:26.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:46:26.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:46:26.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:46:26.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:46:26.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:46:26.293 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:46:26.489 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:46:26.821 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:46:26.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:46:26.922 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:46:26.922 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:46:27.089 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:46:27.089 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:46:57.095 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:46:57.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:46:57.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:46:57.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:46:57.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:46:57.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:46:57.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:46:57.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:46:57.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:46:57.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:46:57.698 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:46:57.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:46:57.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:47:00.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:47:00.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:47:00.396 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:47:00.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:47:00.407 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:47:00.419 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:47:00.420 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:47:00.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:47:00.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:47:00.421 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:47:00.421 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:47:00.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:47:00.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:47:00.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:47:00.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:47:00.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:47:00.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:47:00.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:47:00.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:47:00.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:47:00.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:47:00.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:47:00.756 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:47:00.827 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:46:39
2026-06-03T15:47:00.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86417, datetime.datetime(2026, 6, 3, 15, 46, 39), datetime.datetime(2026, 6, 3, 15, 46, 38), 'salt', 6.97, 100.07, None, 41.67, 120.83, -0.02, 820.94, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:47:00.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:47:00.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:47:00.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:46:38, diff=22.835062s, valid=True
2026-06-03T15:47:00.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:47:00.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:47:00.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:47:12, diff=-11.161495s, valid=True
2026-06-03T15:47:00.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:47:00.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:47:00.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:46:29, diff=31.846447s, valid=True
2026-06-03T15:47:00.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:47:00.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:47:00.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:47:00.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:47:00.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:47:00.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:47:00.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:47:12, diff=-11.149948s, valid=True
2026-06-03T15:47:00.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:47:00.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:47:00.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:47:00.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68617.850861s, valid=False
2026-06-03T15:47:00.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:47:00.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:47:00.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:47:00.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:47:00.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:47:00.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:47:00.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:47:00.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:47:00.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:47:00.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:47:01.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:47:01.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:47:01.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:47:01.248 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:47:01.451 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:47:01.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:47:01.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:47:01.909 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:47:01.909 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:47:02.199 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:47:02.199 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:47:32.219 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:47:32.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:47:32.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:47:32.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:47:32.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:47:32.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:47:32.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:47:32.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:47:32.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:47:32.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:47:32.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:47:32.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:47:32.671 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:47:35.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:47:35.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:47:35.355 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:47:35.355 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:47:35.364 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:47:35.377 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:47:35.378 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:47:35.378 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:47:35.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:47:35.379 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:47:35.379 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:47:35.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:47:35.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:47:35.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:47:35.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:47:35.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:47:35.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:47:35.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:47:35.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:47:35.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:47:35.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:47:35.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:47:35.712 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:47:35.786 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:47:09
2026-06-03T15:47:35.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86418, datetime.datetime(2026, 6, 3, 15, 47, 9), datetime.datetime(2026, 6, 3, 15, 47, 8), 'salt', 6.9, 100.07, None, 43.68, 110.9, -0.02, 820.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:47:35.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:47:35.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:47:35.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:47:08, diff=27.793245s, valid=True
2026-06-03T15:47:35.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:47:35.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:47:35.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:47:12, diff=23.7967s, valid=True
2026-06-03T15:47:35.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:47:35.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:47:35.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:47:00, diff=35.80491s, valid=True
2026-06-03T15:47:35.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:47:35.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:47:35.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:47:35.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:47:35.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:47:35.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:47:35.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:47:12, diff=23.808607s, valid=True
2026-06-03T15:47:35.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:47:35.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:47:35.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:47:35.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68652.809423s, valid=False
2026-06-03T15:47:35.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:47:35.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:47:35.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:47:35.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:47:35.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:47:35.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:47:35.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:47:35.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:47:35.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:47:35.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:47:36.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:47:36.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:47:36.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:47:36.130 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:47:36.338 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:47:36.669 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:47:36.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:47:36.769 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:47:36.769 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:47:37.023 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:47:37.023 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:48:07.053 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:48:07.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:48:07.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:48:07.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:48:07.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:48:07.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:48:07.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:48:07.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:48:07.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:48:07.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:48:07.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:48:07.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:48:07.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:48:10.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:48:10.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:48:10.164 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:48:10.164 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:48:10.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:48:10.186 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:48:10.187 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:48:10.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:48:10.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:48:10.187 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:48:10.187 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:48:10.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:48:10.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:48:10.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:48:10.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:48:10.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:48:10.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:48:10.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:48:10.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:48:10.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:48:10.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:48:10.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:48:10.590 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:48:10.663 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:48:09
2026-06-03T15:48:10.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86420, datetime.datetime(2026, 6, 3, 15, 48, 9), datetime.datetime(2026, 6, 3, 15, 48, 9), 'salt', 7.0, 100.07, None, 41.03, 125.41, -0.02, 820.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:48:10.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:48:10.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:48:10.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:48:09, diff=1.669435s, valid=True
2026-06-03T15:48:10.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:48:10.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:48:10.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:48:12, diff=-1.327727s, valid=True
2026-06-03T15:48:10.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:48:10.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:48:10.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:48:03, diff=7.679021s, valid=True
2026-06-03T15:48:10.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:48:10.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:48:10.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:48:10.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:48:10.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:48:10.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:48:10.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:48:12, diff=-1.317983s, valid=True
2026-06-03T15:48:10.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:48:10.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:48:10.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:48:10.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68687.682666s, valid=False
2026-06-03T15:48:10.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:48:10.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:48:10.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:48:10.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:48:10.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:48:10.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:48:10.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:48:10.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:48:10.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:48:10.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:48:10.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:48:10.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:48:10.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:48:11.000 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:48:11.199 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:48:11.532 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:48:11.634 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:48:11.634 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:48:11.634 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:48:11.814 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:48:11.814 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:48:41.837 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:48:41.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:48:41.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:48:42.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:48:42.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:48:43.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:48:43.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:48:43.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:48:43.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:48:43.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:48:43.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:48:43.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:48:43.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:48:45.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:48:45.838 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:48:45.838 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:48:45.838 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:48:45.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:48:45.858 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:48:45.858 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:48:45.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:48:45.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:48:45.859 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:48:45.859 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:48:45.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:48:45.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:48:45.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:48:46.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:48:46.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:48:46.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:48:46.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:48:46.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:48:46.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:48:46.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:48:46.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:48:46.140 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:48:46.210 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:48:40
2026-06-03T15:48:46.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86421, datetime.datetime(2026, 6, 3, 15, 48, 40), datetime.datetime(2026, 6, 3, 15, 48, 39), 'salt', 7.0, 100.07, None, 41.39, 120.66, -0.02, 820.88, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:48:46.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:48:46.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:48:46.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:48:39, diff=7.217652s, valid=True
2026-06-03T15:48:46.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:48:46.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:48:46.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:49:12, diff=-25.779075s, valid=True
2026-06-03T15:48:46.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:48:46.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:48:46.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:48:35, diff=11.228548s, valid=True
2026-06-03T15:48:46.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:48:46.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:48:46.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:48:46.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:48:46.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:48:46.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:48:46.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:49:12, diff=-25.767891s, valid=True
2026-06-03T15:48:46.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:48:46.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:48:46.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:48:46.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68723.232872s, valid=False
2026-06-03T15:48:46.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:48:46.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:48:46.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:48:46.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:48:46.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:48:46.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:48:46.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:48:46.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:48:46.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:48:46.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:48:46.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:48:46.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:48:46.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:48:46.553 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:48:46.750 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:48:47.080 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:48:47.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:48:47.181 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:48:47.181 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:48:47.429 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:48:47.430 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:49:17.460 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:49:17.460 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:49:17.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:49:17.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:49:17.933 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:49:18.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:49:18.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:49:18.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:49:18.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:49:18.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:49:18.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:49:18.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:49:18.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:49:20.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:49:20.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:49:20.912 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:49:20.912 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:49:20.922 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:49:20.935 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:49:20.936 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:49:20.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:49:20.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:49:20.937 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:49:20.937 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:49:20.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:49:21.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:49:21.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:49:21.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:49:21.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:49:21.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:49:21.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:49:21.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:49:21.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:49:21.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:49:21.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:49:21.265 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:49:21.336 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:49:10
2026-06-03T15:49:21.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86422, datetime.datetime(2026, 6, 3, 15, 49, 10), datetime.datetime(2026, 6, 3, 15, 49, 9), 'salt', 6.9, 99.97, None, 37.01, 118.72, -0.01, 820.82, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:49:21.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:49:21.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:49:21.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:49:09, diff=12.344001s, valid=True
2026-06-03T15:49:21.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:49:21.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:49:21.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:49:12, diff=9.347423s, valid=True
2026-06-03T15:49:21.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:49:21.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:49:21.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:49:06, diff=15.355345s, valid=True
2026-06-03T15:49:21.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:49:21.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:49:21.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:49:21.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:49:21.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:49:21.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:49:21.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:49:12, diff=9.358973s, valid=True
2026-06-03T15:49:21.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:49:21.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:49:21.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:49:21.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68758.359764s, valid=False
2026-06-03T15:49:21.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:49:21.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:49:21.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:49:21.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:49:21.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:49:21.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:49:21.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:49:21.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:49:21.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:49:21.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:49:21.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:49:21.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:49:21.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:49:21.680 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:49:21.877 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:49:22.209 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:49:22.309 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:49:22.309 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:49:22.309 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:49:22.570 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:49:22.570 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:49:52.573 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:49:52.574 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:49:52.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:49:52.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:49:52.746 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:49:52.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:49:52.993 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:49:53.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:49:53.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:49:53.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:49:53.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:49:53.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:49:53.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:49:55.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:49:55.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:49:55.742 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:49:55.743 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:49:55.751 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:49:55.764 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:49:55.764 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:49:55.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:49:55.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:49:55.766 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:49:55.766 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:49:55.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:49:55.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:49:55.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:49:56.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:49:56.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:49:56.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:49:56.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:49:56.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:49:56.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:49:56.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:49:56.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:49:56.110 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:49:56.182 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:49:40
2026-06-03T15:49:56.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86423, datetime.datetime(2026, 6, 3, 15, 49, 40), datetime.datetime(2026, 6, 3, 15, 49, 39), 'salt', 6.97, 100.07, None, 43.68, 124.28, -0.02, 820.76, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:49:56.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:49:56.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:49:56.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:49:39, diff=17.189373s, valid=True
2026-06-03T15:49:56.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:49:56.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:49:56.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:50:12, diff=-15.807125s, valid=True
2026-06-03T15:49:56.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:49:56.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:49:56.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:49:37, diff=19.201215s, valid=True
2026-06-03T15:49:56.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:49:56.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:49:56.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:49:56.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:49:56.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:49:56.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:49:56.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:50:12, diff=-15.795019s, valid=True
2026-06-03T15:49:56.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:49:56.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:49:56.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:49:56.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68793.205804s, valid=False
2026-06-03T15:49:56.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:49:56.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:49:56.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:49:56.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:49:56.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:49:56.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:49:56.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:49:56.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:49:56.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:49:56.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:49:56.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:49:56.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:49:56.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:49:56.525 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:49:56.722 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:49:57.110 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:49:57.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:49:57.211 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:49:57.211 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:49:58.538 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:49:58.538 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:50:28.568 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:50:28.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:50:28.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:50:28.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:50:28.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:50:28.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:50:28.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:50:29.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:50:29.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:50:29.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:50:29.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:50:29.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:50:29.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:50:31.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:50:31.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:50:31.715 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:50:31.716 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:50:31.725 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:50:31.738 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:50:31.739 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:50:31.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:50:31.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:50:31.740 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:50:31.740 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:50:31.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:50:31.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:50:31.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:50:31.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:50:31.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:50:32.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:50:32.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:50:32.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:50:32.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:50:32.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:50:32.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:50:32.084 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:50:32.166 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:50:10
2026-06-03T15:50:32.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86424, datetime.datetime(2026, 6, 3, 15, 50, 10), datetime.datetime(2026, 6, 3, 15, 50, 10), 'salt', 7.04, 100.1, None, 42.13, 122.31, -0.02, 820.58, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:50:32.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:50:32.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:50:32.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:50:10, diff=22.174321s, valid=True
2026-06-03T15:50:32.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:50:32.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:50:32.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:50:12, diff=20.177814s, valid=True
2026-06-03T15:50:32.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:50:32.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:50:32.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:50:09, diff=23.185901s, valid=True
2026-06-03T15:50:32.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:50:32.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:50:32.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:50:32.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:50:32.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:50:32.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:50:32.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:50:12, diff=20.189616s, valid=True
2026-06-03T15:50:32.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:50:32.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:50:32.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:50:32.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68829.190432s, valid=False
2026-06-03T15:50:32.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:50:32.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:50:32.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:50:32.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:50:32.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:50:32.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:50:32.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:50:32.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:50:32.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:50:32.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:50:32.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:50:32.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:50:32.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:50:32.511 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:50:32.716 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:50:33.058 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:50:33.161 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:50:33.161 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:50:33.161 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:50:33.344 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:50:33.344 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:51:03.374 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:51:03.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:51:03.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:51:03.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:51:03.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:51:04.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:51:04.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:51:04.117 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:51:04.117 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:51:04.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:51:04.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:51:04.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:51:04.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:51:06.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:51:06.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:51:06.712 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:51:06.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:51:06.722 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:51:06.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:51:06.735 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:51:06.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:51:06.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:51:06.736 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:51:06.737 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:51:06.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:51:06.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:51:06.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:51:06.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:51:06.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:51:06.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:51:06.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:51:07.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:51:07.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:51:07.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:51:07.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:51:07.043 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:51:07.113 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:50:41
2026-06-03T15:51:07.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86425, datetime.datetime(2026, 6, 3, 15, 50, 41), datetime.datetime(2026, 6, 3, 15, 50, 40), 'salt', 7.04, 100.07, None, 38.0, 124.37, -0.01, 820.76, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:51:07.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:51:07.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:51:07.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:50:40, diff=27.1197s, valid=True
2026-06-03T15:51:07.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:51:07.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:51:07.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:51:12, diff=-4.877332s, valid=True
2026-06-03T15:51:07.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:51:07.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:51:07.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:50:40, diff=27.129455s, valid=True
2026-06-03T15:51:07.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:51:07.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:51:07.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:51:07.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:51:07.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:51:07.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:51:07.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:51:12, diff=-4.867399s, valid=True
2026-06-03T15:51:07.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:51:07.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:51:07.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:51:07.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68864.133265s, valid=False
2026-06-03T15:51:07.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:51:07.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:51:07.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:51:07.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:51:07.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:51:07.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:51:07.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:51:07.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:51:07.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:51:07.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:51:07.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:51:07.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:51:07.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:51:07.566 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:51:07.772 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:51:08.111 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:51:08.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:51:08.215 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:51:08.215 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:51:08.410 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:51:08.411 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:51:38.440 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:51:38.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:51:38.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:51:38.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:51:38.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:51:39.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:51:39.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:51:39.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:51:39.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:51:39.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:51:39.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:51:39.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:51:39.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:51:41.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:51:41.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:51:41.831 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:51:41.831 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:51:41.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:51:41.853 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:51:41.854 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:51:41.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:51:41.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:51:41.855 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:51:41.855 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:51:41.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:51:42.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:51:42.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:51:42.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:51:42.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:51:42.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:51:42.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:51:42.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:51:42.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:51:42.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:51:42.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:51:42.200 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:51:42.273 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:51:41
2026-06-03T15:51:42.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86427, datetime.datetime(2026, 6, 3, 15, 51, 41), datetime.datetime(2026, 6, 3, 15, 51, 40), 'salt', 7.07, 100.07, None, 32.57, 113.08, -0.02, 820.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:51:42.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:51:42.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:51:42.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:51:40, diff=2.280971s, valid=True
2026-06-03T15:51:42.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:51:42.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:51:42.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:52:12, diff=-29.71555s, valid=True
2026-06-03T15:51:42.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:51:42.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:51:42.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:51:33, diff=9.292769s, valid=True
2026-06-03T15:51:42.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:51:42.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:51:42.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:51:42.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:51:42.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:51:42.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:51:42.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:52:12, diff=-29.703555s, valid=True
2026-06-03T15:51:42.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:51:42.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:51:42.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:51:42.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68899.297271s, valid=False
2026-06-03T15:51:42.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:51:42.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:51:42.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:51:42.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:51:42.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:51:42.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:51:42.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:51:42.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:51:42.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:51:42.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:51:42.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:51:42.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:51:42.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:51:42.620 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:51:42.830 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:51:43.173 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:51:43.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:51:43.276 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:51:43.276 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:51:43.360 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:51:43.361 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:52:13.372 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:52:13.372 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:52:13.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:52:13.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:52:13.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:52:13.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:52:13.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:52:13.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:52:13.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:52:13.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:52:13.940 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:52:13.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:52:13.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:52:16.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:52:16.608 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:52:16.609 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:52:16.609 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:52:16.618 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:52:16.631 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:52:16.632 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:52:16.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:52:16.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:52:16.633 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:52:16.633 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:52:16.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:52:16.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:52:16.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:52:16.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:52:16.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:52:16.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:52:16.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:52:16.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:52:16.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:52:16.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:52:16.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:52:16.968 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:52:17.038 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:52:11
2026-06-03T15:52:17.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86428, datetime.datetime(2026, 6, 3, 15, 52, 11), datetime.datetime(2026, 6, 3, 15, 52, 11), 'salt', 7.1, 100.14, None, 31.79, 121.37, -0.03, 820.76, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:52:17.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:52:17.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:52:17.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:52:11, diff=6.045863s, valid=True
2026-06-03T15:52:17.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:52:17.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:52:17.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:52:12, diff=5.04918s, valid=True
2026-06-03T15:52:17.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:52:17.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:52:17.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:52:04, diff=13.057179s, valid=True
2026-06-03T15:52:17.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:52:17.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:52:17.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:52:17.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:52:17.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:52:17.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:52:17.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:52:12, diff=5.060744s, valid=True
2026-06-03T15:52:17.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:52:17.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:52:17.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:52:17.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68934.06151s, valid=False
2026-06-03T15:52:17.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:52:17.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:52:17.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:52:17.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:52:17.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:52:17.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:52:17.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:52:17.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:52:17.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:52:17.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:52:17.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:52:17.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:52:17.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:52:17.453 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:52:17.659 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:52:17.998 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:52:18.101 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:52:18.101 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:52:18.101 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:52:18.298 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:52:18.298 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:52:48.326 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:52:48.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:52:48.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:52:48.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:52:48.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:52:48.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:52:48.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:52:48.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:52:48.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:52:48.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:52:48.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:52:48.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:52:48.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:52:51.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:52:51.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:52:51.565 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:52:51.565 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:52:51.574 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:52:51.587 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:52:51.588 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:52:51.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:52:51.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:52:51.589 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:52:51.589 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:52:51.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:52:51.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:52:51.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:52:51.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:52:51.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:52:51.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:52:51.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:52:51.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:52:51.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:52:51.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:52:51.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:52:51.897 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:52:51.967 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:52:42
2026-06-03T15:52:51.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86429, datetime.datetime(2026, 6, 3, 15, 52, 42), datetime.datetime(2026, 6, 3, 15, 52, 41), 'salt', 7.07, 100.07, None, 31.47, 113.53, -0.02, 820.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:52:51.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:52:51.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:52:51.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:52:41, diff=10.97459s, valid=True
2026-06-03T15:52:51.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:52:51.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:52:51.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:53:12, diff=-20.022185s, valid=True
2026-06-03T15:52:51.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:52:51.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:52:51.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:52:36, diff=15.985412s, valid=True
2026-06-03T15:52:51.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:52:51.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:52:51.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:52:51.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:52:51.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:52:51.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:52:51.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:53:12, diff=-20.011075s, valid=True
2026-06-03T15:52:51.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:52:51.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:52:51.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:52:51.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=68968.989687s, valid=False
2026-06-03T15:52:51.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:52:51.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:52:51.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:52:51.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:52:51.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:52:52.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:52:52.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:52:52.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:52:52.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:52:52.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:52:52.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:52:52.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:52:52.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:52:52.307 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:52:52.517 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:52:52.854 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:52:52.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:52:52.957 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:52:52.957 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:52:53.215 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:52:53.216 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:53:23.246 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:53:23.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:53:23.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:53:23.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:53:23.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:53:23.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:53:23.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:53:23.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:53:23.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:53:23.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:53:23.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:53:23.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:53:23.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:53:26.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:53:26.145 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:53:26.146 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:53:26.146 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:53:26.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:53:26.167 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:53:26.167 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:53:26.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:53:26.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:53:26.167 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:53:26.167 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:53:26.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:53:26.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:53:26.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:53:26.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:53:26.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:53:26.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:53:26.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:53:26.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:53:26.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:53:26.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:53:26.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:53:26.464 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:53:26.535 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:53:12
2026-06-03T15:53:26.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86430, datetime.datetime(2026, 6, 3, 15, 53, 12), datetime.datetime(2026, 6, 3, 15, 53, 11), 'salt', 7.04, 100.07, None, 40.01, 130.52, -0.01, 820.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:53:26.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:53:26.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:53:26.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:53:11, diff=15.543043s, valid=True
2026-06-03T15:53:26.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:53:26.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:53:26.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:53:12, diff=14.546281s, valid=True
2026-06-03T15:53:26.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:53:26.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:53:26.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:53:07, diff=19.553866s, valid=True
2026-06-03T15:53:26.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:53:26.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:53:26.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:53:26.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:53:26.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:53:26.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:53:26.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:53:12, diff=14.557303s, valid=True
2026-06-03T15:53:26.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:53:26.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:53:26.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:53:26.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69003.558088s, valid=False
2026-06-03T15:53:26.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:53:26.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:53:26.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:53:26.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:53:26.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:53:26.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:53:26.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:53:26.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:53:26.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:53:26.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:53:26.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:53:26.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:53:26.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:53:26.877 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:53:27.084 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:53:27.426 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:53:27.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:53:27.528 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:53:27.528 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:53:27.600 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:53:27.601 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:53:57.631 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:53:57.631 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:53:57.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:53:57.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:53:57.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:53:58.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:53:58.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:53:58.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:53:58.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:53:58.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:53:58.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:53:58.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:53:58.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:54:00.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:54:00.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:54:00.457 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:54:00.457 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:54:00.469 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:54:00.482 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:54:00.482 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:54:00.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:54:00.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:54:00.483 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:54:00.484 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:54:00.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:54:00.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:54:00.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:54:00.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:54:00.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:54:00.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:54:00.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:54:00.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:54:00.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:54:00.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:54:00.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:54:00.829 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:54:00.901 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:53:42
2026-06-03T15:54:00.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86431, datetime.datetime(2026, 6, 3, 15, 53, 42), datetime.datetime(2026, 6, 3, 15, 53, 41), 'salt', 6.94, 100.04, None, 30.98, 111.96, -0.01, 820.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:54:00.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:54:00.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:54:00.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:53:41, diff=19.908497s, valid=True
2026-06-03T15:54:00.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:54:00.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:54:00.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:54:12, diff=-11.088136s, valid=True
2026-06-03T15:54:00.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:54:00.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:54:00.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:53:39, diff=21.919888s, valid=True
2026-06-03T15:54:00.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:54:00.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:54:00.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:54:00.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:54:00.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:54:00.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:54:00.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:54:12, diff=-11.076495s, valid=True
2026-06-03T15:54:00.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:54:00.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:54:00.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:54:00.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69037.924311s, valid=False
2026-06-03T15:54:00.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:54:00.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:54:00.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:54:00.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:54:00.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:54:00.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:54:00.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:54:00.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:54:01.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:54:01.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:54:01.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:54:01.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:54:01.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:54:01.243 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:54:01.448 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:54:01.849 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:54:01.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:54:01.950 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:54:01.951 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:54:02.173 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:54:02.173 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:54:32.203 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:54:32.203 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:54:32.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:54:32.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:54:32.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:54:33.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:54:33.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:54:33.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:54:33.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:54:33.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:54:33.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:54:33.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:54:33.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:54:35.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:54:35.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:54:35.947 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:54:35.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:54:35.957 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:54:35.970 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:54:35.971 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:54:35.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:54:35.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:54:35.972 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:54:35.972 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:54:35.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:54:36.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:54:36.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:54:36.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:54:36.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:54:36.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:54:36.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:54:36.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:54:36.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:54:36.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:54:36.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:54:36.330 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:54:36.403 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:54:12
2026-06-03T15:54:36.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86432, datetime.datetime(2026, 6, 3, 15, 54, 12), datetime.datetime(2026, 6, 3, 15, 54, 12), 'salt', 6.97, 100.04, None, 42.37, 112.71, -0.01, 820.82, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:54:36.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:54:36.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:54:36.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:54:12, diff=24.410604s, valid=True
2026-06-03T15:54:36.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:54:36.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:54:36.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:54:12, diff=24.414109s, valid=True
2026-06-03T15:54:36.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:54:36.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:54:36.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:54:10, diff=26.422277s, valid=True
2026-06-03T15:54:36.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:54:36.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:54:36.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:54:36.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:54:36.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:54:36.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:54:36.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:54:12, diff=24.42604s, valid=True
2026-06-03T15:54:36.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:54:36.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:54:36.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:54:36.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69073.426865s, valid=False
2026-06-03T15:54:36.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:54:36.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:54:36.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:54:36.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:54:36.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:54:36.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:54:36.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:54:36.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:54:36.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:54:36.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:54:36.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:54:36.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:54:36.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:54:36.745 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:54:36.950 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:54:37.292 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:54:37.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:54:37.396 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:54:37.396 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:54:37.592 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:54:37.592 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:55:07.623 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:55:07.623 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:55:07.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:55:07.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:55:07.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:55:08.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:55:08.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:55:08.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:55:08.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:55:08.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:55:08.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:55:08.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:55:08.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:55:10.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:55:10.592 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:55:10.593 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:55:10.593 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:55:10.604 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:55:10.617 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:55:10.618 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:55:10.618 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:55:10.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:55:10.619 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:55:10.619 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:55:10.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:55:10.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:55:10.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:55:10.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:55:10.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:55:10.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:55:10.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:55:10.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:55:10.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:55:10.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:55:10.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:55:10.938 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:55:11.007 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:54:43
2026-06-03T15:55:11.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86433, datetime.datetime(2026, 6, 3, 15, 54, 43), datetime.datetime(2026, 6, 3, 15, 54, 42), 'salt', 6.94, 100.04, None, 39.27, 117.92, -0.01, 820.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:55:11.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:55:11.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:55:11.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:54:42, diff=29.013566s, valid=True
2026-06-03T15:55:11.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:55:11.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:55:11.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:55:12, diff=-0.983602s, valid=True
2026-06-03T15:55:11.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:55:11.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:55:11.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:54:42, diff=29.023104s, valid=True
2026-06-03T15:55:11.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:55:11.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:55:11.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:55:11.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:55:11.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:55:11.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:55:11.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:55:12, diff=-0.973705s, valid=True
2026-06-03T15:55:11.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:55:11.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:55:11.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:55:11.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69108.027058s, valid=False
2026-06-03T15:55:11.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:55:11.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:55:11.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:55:11.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:55:11.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:55:11.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:55:11.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:55:11.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:55:11.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:55:11.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:55:11.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:55:11.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:55:11.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:55:11.419 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:55:11.623 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:55:11.961 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:55:12.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:55:12.064 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:55:12.064 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:55:12.297 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:55:12.297 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:55:42.328 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:55:42.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:55:42.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:55:42.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:55:42.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:55:42.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:55:42.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:55:42.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:55:42.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:55:42.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:55:42.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:55:42.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:55:42.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:55:45.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:55:45.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:55:45.075 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:55:45.075 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:55:45.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:55:45.098 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:55:45.098 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:55:45.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:55:45.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:55:45.099 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:55:45.100 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:55:45.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:55:45.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:55:45.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:55:45.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:55:45.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:55:45.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:55:45.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:55:45.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:55:45.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:55:45.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:55:45.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:55:45.437 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:55:45.505 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:55:43
2026-06-03T15:55:45.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86435, datetime.datetime(2026, 6, 3, 15, 55, 43), datetime.datetime(2026, 6, 3, 15, 55, 42), 'salt', 6.94, 100.01, None, 36.31, 105.85, 0.0, 820.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:55:45.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:55:45.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:55:45.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:55:42, diff=3.512848s, valid=True
2026-06-03T15:55:45.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:55:45.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:55:45.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:56:12, diff=-26.483692s, valid=True
2026-06-03T15:55:45.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:55:45.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:55:45.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:55:34, diff=11.524444s, valid=True
2026-06-03T15:55:45.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:55:45.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:55:45.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:55:45.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:55:45.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:55:45.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:55:45.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:56:12, diff=-26.471827s, valid=True
2026-06-03T15:55:45.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:55:45.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:55:45.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:55:45.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69142.528986s, valid=False
2026-06-03T15:55:45.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:55:45.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:55:45.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:55:45.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:55:45.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:55:45.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:55:45.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:55:45.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:55:45.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:55:45.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:55:45.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:55:45.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:55:45.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:55:45.850 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:55:46.058 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:55:46.410 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:55:46.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:55:46.519 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:55:46.519 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:55:46.752 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:55:46.752 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:56:16.770 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:56:16.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:56:16.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:56:17.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:56:17.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:56:17.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:56:17.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:56:17.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:56:17.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:56:17.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:56:17.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:56:17.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:56:17.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:56:20.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:56:20.580 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:56:20.580 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:56:20.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:56:20.590 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:56:20.603 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:56:20.604 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:56:20.604 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:56:20.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:56:20.605 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:56:20.605 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:56:20.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:56:20.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:56:20.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:56:20.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:56:20.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:56:20.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:56:20.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:56:20.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:56:20.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:56:20.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:56:20.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:56:20.932 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:56:21.005 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:56:13
2026-06-03T15:56:21.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86436, datetime.datetime(2026, 6, 3, 15, 56, 13), datetime.datetime(2026, 6, 3, 15, 56, 13), 'salt', 6.94, 100.04, None, 40.89, 108.46, -0.01, 820.76, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:56:21.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:56:21.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:56:21.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:56:13, diff=8.012546s, valid=True
2026-06-03T15:56:21.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:56:21.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:56:21.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:56:12, diff=9.015901s, valid=True
2026-06-03T15:56:21.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:56:21.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:56:21.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:56:06, diff=15.023709s, valid=True
2026-06-03T15:56:21.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:56:21.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:56:21.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:56:21.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:56:21.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:56:21.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:56:21.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:56:12, diff=9.027343s, valid=True
2026-06-03T15:56:21.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:56:21.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:56:21.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:56:21.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69178.028141s, valid=False
2026-06-03T15:56:21.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:56:21.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:56:21.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:56:21.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:56:21.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:56:21.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:56:21.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:56:21.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:56:21.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:56:21.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:56:21.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:56:21.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:56:21.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:56:21.419 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:56:21.627 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:56:21.974 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:56:22.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:56:22.078 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:56:22.078 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:56:22.253 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:56:22.253 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:56:52.283 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:56:52.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:56:52.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:56:52.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:56:52.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:56:52.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:56:52.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:56:52.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:56:52.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:56:52.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:56:52.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:56:52.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:56:52.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:56:55.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:56:55.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:56:55.104 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:56:55.104 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:56:55.113 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:56:55.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:56:55.128 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:56:55.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:56:55.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:56:55.129 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:56:55.129 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:56:55.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:56:55.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:56:55.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:56:55.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:56:55.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:56:55.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:56:55.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:56:55.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:56:55.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:56:55.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:56:55.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:56:55.460 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:56:55.529 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:56:44
2026-06-03T15:56:55.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86437, datetime.datetime(2026, 6, 3, 15, 56, 44), datetime.datetime(2026, 6, 3, 15, 56, 43), 'salt', 6.94, 100.01, None, 41.25, 112.71, 0.0, 820.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:56:55.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:56:55.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:56:55.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:56:43, diff=12.537139s, valid=True
2026-06-03T15:56:55.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:56:55.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:56:55.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:57:12, diff=-16.459431s, valid=True
2026-06-03T15:56:55.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:56:55.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:56:55.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:56:37, diff=18.548685s, valid=True
2026-06-03T15:56:55.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:56:55.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:56:55.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:56:55.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:56:55.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:56:55.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:56:55.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:57:12, diff=-16.447673s, valid=True
2026-06-03T15:56:55.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:56:55.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:56:55.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:56:55.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69212.553132s, valid=False
2026-06-03T15:56:55.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:56:55.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:56:55.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:56:55.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:56:55.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:56:55.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:56:55.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:56:55.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:56:55.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:56:55.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:56:55.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:56:55.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:56:55.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:56:55.871 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:56:56.075 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:56:56.413 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:56:56.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:56:56.516 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:56:56.516 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:56:56.683 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:56:56.684 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:57:26.700 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:57:26.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:57:26.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:57:26.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:57:26.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:57:27.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:57:27.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:57:27.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:57:27.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:57:27.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:57:27.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:57:27.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:57:27.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:57:29.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:57:29.921 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:57:29.921 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:57:29.921 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:57:29.930 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:57:29.949 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:57:29.949 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:57:29.949 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:57:29.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:57:29.950 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:57:29.950 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:57:29.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:57:30.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:57:30.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:57:30.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:57:30.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:57:30.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:57:30.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:57:30.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:57:30.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:57:30.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:57:30.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:57:30.217 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:57:30.288 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:57:14
2026-06-03T15:57:30.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86438, datetime.datetime(2026, 6, 3, 15, 57, 14), datetime.datetime(2026, 6, 3, 15, 57, 13), 'salt', 6.9, 100.01, None, 30.98, 114.49, -0.01, 820.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:57:30.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:57:30.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:57:30.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:57:13, diff=17.294607s, valid=True
2026-06-03T15:57:30.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:57:30.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:57:30.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:57:12, diff=18.297645s, valid=True
2026-06-03T15:57:30.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:57:30.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:57:30.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:57:09, diff=21.304913s, valid=True
2026-06-03T15:57:30.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:57:30.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:57:30.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:57:30.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:57:30.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:57:30.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:57:30.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:57:12, diff=18.308157s, valid=True
2026-06-03T15:57:30.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:57:30.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:57:30.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:57:30.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69247.308869s, valid=False
2026-06-03T15:57:30.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:57:30.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:57:30.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:57:30.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:57:30.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:57:30.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:57:30.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:57:30.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:57:30.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:57:30.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:57:30.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:57:30.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:57:30.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:57:30.626 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:57:30.836 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:57:31.180 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:57:31.284 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:57:31.284 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:57:31.284 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:57:31.514 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:57:31.515 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:58:01.545 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:58:01.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:58:01.545 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:58:02.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:58:02.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:58:02.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:58:02.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:58:02.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:58:02.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:58:02.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:58:02.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:58:02.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:58:02.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:58:04.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:58:04.892 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:58:04.893 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:58:04.893 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:58:04.903 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:58:04.916 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:58:04.917 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:58:04.917 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:58:04.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:58:04.918 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:58:04.918 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:58:04.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:58:05.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:58:05.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:58:05.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:58:05.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:58:05.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:58:05.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:58:05.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:58:05.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:58:05.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:58:05.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:58:05.242 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:58:05.314 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:57:45
2026-06-03T15:58:05.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86439, datetime.datetime(2026, 6, 3, 15, 57, 45), datetime.datetime(2026, 6, 3, 15, 57, 43), 'salt', 6.9, 100.01, None, 34.08, 102.66, -0.01, 820.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:58:05.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:58:05.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:58:05.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:57:43, diff=22.32136s, valid=True
2026-06-03T15:58:05.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:58:05.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:58:05.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:58:12, diff=-6.67514s, valid=True
2026-06-03T15:58:05.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:58:05.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:58:05.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:57:40, diff=25.332903s, valid=True
2026-06-03T15:58:05.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:58:05.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:58:05.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:58:05.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:58:05.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:58:05.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:58:05.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:58:12, diff=-6.663459s, valid=True
2026-06-03T15:58:05.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:58:05.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:58:05.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:58:05.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69282.337334s, valid=False
2026-06-03T15:58:05.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:58:05.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:58:05.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:58:05.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:58:05.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:58:05.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:58:05.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:58:05.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:58:05.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:58:05.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:58:05.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:58:05.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:58:05.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:58:05.657 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:58:05.865 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:58:06.267 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:58:06.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:58:06.370 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:58:06.370 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:58:06.599 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:58:06.599 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:58:36.599 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:58:36.599 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:58:36.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:58:36.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:58:36.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:58:37.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:58:37.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:58:37.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:58:37.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:58:37.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:58:37.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:58:37.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:58:37.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:58:39.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:58:39.893 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:58:39.893 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:58:39.893 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:58:39.901 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:58:39.913 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:58:39.914 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:58:39.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:58:39.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:58:39.914 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:58:39.914 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:58:39.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:58:40.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:58:40.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:58:40.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:58:40.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:58:40.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:58:40.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:58:40.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:58:40.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:58:40.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:58:40.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:58:40.207 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:58:40.275 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:58:15
2026-06-03T15:58:40.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86440, datetime.datetime(2026, 6, 3, 15, 58, 15), datetime.datetime(2026, 6, 3, 15, 58, 14), 'salt', 6.97, 100.07, None, 41.53, 113.18, -0.02, 820.58, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:58:40.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:58:40.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:58:40.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:58:14, diff=26.282373s, valid=True
2026-06-03T15:58:40.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:58:40.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:58:40.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:58:12, diff=28.285445s, valid=True
2026-06-03T15:58:40.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:58:40.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:58:40.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:58:14, diff=26.292797s, valid=True
2026-06-03T15:58:40.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:58:40.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:58:40.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:58:40.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:58:40.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:58:40.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:58:40.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:58:12, diff=28.296053s, valid=True
2026-06-03T15:58:40.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:58:40.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:58:40.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:58:40.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69317.296771s, valid=False
2026-06-03T15:58:40.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:58:40.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:58:40.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:58:40.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:58:40.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:58:40.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:58:40.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:58:40.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:58:40.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:58:40.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:58:40.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:58:40.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:58:40.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:58:40.632 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:58:40.839 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:58:41.178 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:58:41.281 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:58:41.281 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:58:41.281 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:58:41.365 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:58:41.365 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:59:11.395 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:59:11.395 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:59:11.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:59:11.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:59:11.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:59:12.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:59:12.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:59:12.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:59:12.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:59:12.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:59:12.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:59:12.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:59:12.128 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:59:14.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:59:14.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:59:14.844 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:59:14.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:59:14.855 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:59:14.868 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:59:14.869 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:59:14.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:59:14.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:59:14.870 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:59:14.870 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:59:14.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:59:15.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T15:59:15.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:59:15.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T15:59:15.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:59:15.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:59:15.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:59:15.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T15:59:15.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:59:15.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:59:15.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:59:15.205 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:59:15.278 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:58:45
2026-06-03T15:59:15.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86441, datetime.datetime(2026, 6, 3, 15, 58, 45), datetime.datetime(2026, 6, 3, 15, 58, 44), 'salt', 7.0, 100.07, None, 42.55, 109.56, -0.02, 820.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T15:59:15.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:59:15.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T15:59:15.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:58:44, diff=31.285298s, valid=True
2026-06-03T15:59:15.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:59:15.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:59:15.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:59:12, diff=3.288699s, valid=True
2026-06-03T15:59:15.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:59:15.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T15:59:15.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:58:45, diff=30.296573s, valid=True
2026-06-03T15:59:15.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:59:15.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:59:15.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:59:15.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:59:15.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:59:15.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T15:59:15.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:59:12, diff=3.300013s, valid=True
2026-06-03T15:59:15.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:59:15.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:59:15.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:59:15.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69352.300821s, valid=False
2026-06-03T15:59:15.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:59:15.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:59:15.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:59:15.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:59:15.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:59:15.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:59:15.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:59:15.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:59:15.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:59:15.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:59:15.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:59:15.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:59:15.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:59:15.691 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:59:15.896 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:59:16.234 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:59:16.337 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:59:16.338 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:59:16.338 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:59:16.514 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:59:16.514 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T15:59:46.544 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T15:59:46.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T15:59:46.545 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T15:59:47.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T15:59:47.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T15:59:47.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T15:59:47.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T15:59:47.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T15:59:47.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T15:59:47.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T15:59:47.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T15:59:47.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T15:59:47.310 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T15:59:50.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T15:59:50.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T15:59:50.011 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T15:59:50.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T15:59:50.018 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T15:59:50.029 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T15:59:50.030 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T15:59:50.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T15:59:50.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T15:59:50.030 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T15:59:50.030 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T15:59:50.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T15:59:50.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T15:59:50.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T15:59:50.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T15:59:50.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:59:50.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:59:50.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T15:59:50.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T15:59:50.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T15:59:50.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T15:59:50.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T15:59:50.327 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T15:59:50.394 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 15:59:46
2026-06-03T15:59:50.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86443, datetime.datetime(2026, 6, 3, 15, 59, 46), datetime.datetime(2026, 6, 3, 15, 59, 45), 'salt', 6.94, 100.01, None, 46.08, 116.91, 0.0, 820.77, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T15:59:50.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T15:59:50.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T15:59:50.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:59:45, diff=5.40108s, valid=True
2026-06-03T15:59:50.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T15:59:50.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:59:50.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:00:12, diff=-21.596022s, valid=True
2026-06-03T15:59:50.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T15:59:50.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T15:59:50.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 15:59:45, diff=5.410701s, valid=True
2026-06-03T15:59:50.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T15:59:50.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:59:50.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T15:59:50.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T15:59:50.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T15:59:50.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T15:59:50.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:00:12, diff=-21.58622s, valid=True
2026-06-03T15:59:50.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T15:59:50.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T15:59:50.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T15:59:50.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69387.414444s, valid=False
2026-06-03T15:59:50.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T15:59:50.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T15:59:50.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T15:59:50.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T15:59:50.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T15:59:50.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T15:59:50.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T15:59:50.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T15:59:50.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T15:59:50.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T15:59:50.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T15:59:50.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T15:59:50.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T15:59:50.735 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T15:59:50.944 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:59:51.286 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T15:59:51.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T15:59:51.387 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T15:59:51.387 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T15:59:51.600 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T15:59:51.600 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:00:21.630 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:00:21.631 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:00:21.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:00:21.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:00:21.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:00:22.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:00:22.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:00:22.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:00:22.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:00:22.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:00:22.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:00:22.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:00:22.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:00:24.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:00:24.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:00:24.865 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:00:24.865 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:00:24.876 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:00:24.889 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:00:24.889 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:00:24.890 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:00:24.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:00:24.891 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:00:24.891 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:00:24.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:00:25.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:00:25.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:00:25.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:00:25.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:00:25.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:00:25.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:00:25.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:00:25.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:00:25.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:00:25.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:00:25.219 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:00:25.289 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:00:16
2026-06-03T16:00:25.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86444, datetime.datetime(2026, 6, 3, 16, 0, 16), datetime.datetime(2026, 6, 3, 16, 0, 15), 'salt', 6.97, 100.07, None, 40.93, 113.95, -0.02, 820.77, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:00:25.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:00:25.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:00:25.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:00:15, diff=10.296261s, valid=True
2026-06-03T16:00:25.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:00:25.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:00:25.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:00:12, diff=13.299637s, valid=True
2026-06-03T16:00:25.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:00:25.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:00:25.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:00:15, diff=10.307564s, valid=True
2026-06-03T16:00:25.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:00:25.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:00:25.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:00:25.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:00:25.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:00:25.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:00:25.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:00:12, diff=13.311175s, valid=True
2026-06-03T16:00:25.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:00:25.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:00:25.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:00:25.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69422.31196s, valid=False
2026-06-03T16:00:25.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:00:25.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:00:25.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:00:25.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:00:25.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:00:25.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:00:25.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:00:25.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:00:25.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:00:25.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:00:25.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:00:25.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:00:25.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:00:25.702 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:00:25.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:00:26.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:00:26.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:00:26.360 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:00:26.360 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:00:26.540 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:00:26.541 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:00:56.560 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:00:56.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:00:56.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:00:56.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:00:56.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:00:57.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:00:57.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:00:57.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:00:57.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:00:57.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:00:57.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:00:57.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:00:57.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:00:59.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:00:59.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:00:59.908 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:00:59.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:00:59.917 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:00:59.929 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:00:59.929 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:00:59.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:00:59.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:00:59.929 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:00:59.930 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:00:59.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:01:00.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:01:00.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:01:00.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:01:00.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:01:00.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:01:00.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:01:00.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:01:00.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:01:00.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:01:00.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:01:00.220 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:01:00.292 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:00:46
2026-06-03T16:01:00.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86445, datetime.datetime(2026, 6, 3, 16, 0, 46), datetime.datetime(2026, 6, 3, 16, 0, 46), 'salt', 6.91, 100.04, None, 41.53, 114.96, -0.01, 820.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:01:00.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:01:00.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:01:00.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:00:46, diff=14.298812s, valid=True
2026-06-03T16:01:00.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:01:00.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:01:00.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:01:12, diff=-11.698037s, valid=True
2026-06-03T16:01:00.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:01:00.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:01:00.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:00:46, diff=14.309487s, valid=True
2026-06-03T16:01:00.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:01:00.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:01:00.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:01:00.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:01:00.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:01:00.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:01:00.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:01:12, diff=-11.687126s, valid=True
2026-06-03T16:01:00.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:01:00.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:01:00.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:01:00.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69457.313598s, valid=False
2026-06-03T16:01:00.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:01:00.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:01:00.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:01:00.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:01:00.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:01:00.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:01:00.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:01:00.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:01:00.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:01:00.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:01:00.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:01:00.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:01:00.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:01:00.631 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:01:00.837 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:01:01.193 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:01:01.314 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:01:01.314 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:01:01.314 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:01:01.564 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:01:01.564 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:01:31.584 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:01:31.584 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:01:31.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:01:31.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:01:31.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:01:31.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:01:31.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:01:32.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:01:32.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:01:32.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:01:32.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:01:32.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:01:32.019 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:01:35.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:01:35.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:01:35.024 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:01:35.024 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:01:35.034 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:01:35.047 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:01:35.048 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:01:35.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:01:35.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:01:35.049 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:01:35.049 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:01:35.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:01:35.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:01:35.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:01:35.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:01:35.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:01:35.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:01:35.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:01:35.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:01:35.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:01:35.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:01:35.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:01:35.356 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:01:35.430 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:01:17
2026-06-03T16:01:35.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86446, datetime.datetime(2026, 6, 3, 16, 1, 17), datetime.datetime(2026, 6, 3, 16, 1, 16), 'salt', 6.94, 100.04, None, 39.09, 113.13, -0.01, 820.71, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:01:35.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:01:35.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:01:35.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:01:16, diff=19.437719s, valid=True
2026-06-03T16:01:35.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:01:35.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:01:35.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:01:12, diff=23.441056s, valid=True
2026-06-03T16:01:35.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:01:35.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:01:35.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:01:16, diff=19.448828s, valid=True
2026-06-03T16:01:35.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:01:35.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:01:35.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:01:35.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:01:35.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:01:35.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:01:35.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:01:12, diff=23.452364s, valid=True
2026-06-03T16:01:35.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:01:35.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:01:35.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:01:35.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69492.453142s, valid=False
2026-06-03T16:01:35.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:01:35.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:01:35.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:01:35.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:01:35.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:01:35.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:01:35.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:01:35.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:01:35.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:01:35.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:01:35.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:01:35.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:01:35.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:01:35.836 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:01:36.042 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:01:36.386 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:01:36.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:01:36.488 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:01:36.488 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:01:36.667 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:01:36.667 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:02:06.697 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:02:06.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:02:06.698 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:02:07.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:02:07.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:02:07.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:02:07.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:02:07.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:02:07.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:02:07.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:02:07.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:02:07.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:02:07.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:02:10.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:02:10.363 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:02:10.364 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:02:10.364 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:02:10.387 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:02:10.399 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:02:10.400 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:02:10.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:02:10.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:02:10.401 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:02:10.401 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:02:10.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:02:10.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:02:10.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:02:10.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:02:10.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:02:10.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:02:10.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:02:10.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:02:10.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:02:10.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:02:10.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:02:10.749 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:02:10.824 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:01:47
2026-06-03T16:02:10.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86447, datetime.datetime(2026, 6, 3, 16, 1, 47), datetime.datetime(2026, 6, 3, 16, 1, 46), 'salt', 6.94, 100.04, None, 39.31, 101.42, -0.01, 820.77, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:02:10.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:02:10.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:02:10.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:01:46, diff=24.832298s, valid=True
2026-06-03T16:02:10.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:02:10.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:02:10.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:02:12, diff=-1.164162s, valid=True
2026-06-03T16:02:10.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:02:10.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:02:10.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:01:47, diff=23.843752s, valid=True
2026-06-03T16:02:10.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:02:10.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:02:10.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:02:10.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:02:10.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:02:10.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:02:10.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:02:12, diff=-1.15275s, valid=True
2026-06-03T16:02:10.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:02:10.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:02:10.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:02:10.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69527.84797s, valid=False
2026-06-03T16:02:10.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:02:10.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:02:10.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:02:10.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:02:10.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:02:10.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:02:10.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:02:10.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:02:10.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:02:10.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:02:11.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:02:11.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:02:11.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:02:11.163 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:02:11.369 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:02:11.708 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:02:11.811 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:02:11.811 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:02:11.811 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:02:12.054 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:02:12.054 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:02:42.062 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:02:42.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:02:42.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:02:42.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:02:42.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:02:42.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:02:42.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:02:42.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:02:42.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:02:42.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:02:42.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:02:42.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:02:42.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:02:45.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:02:45.506 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:02:45.507 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:02:45.507 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:02:45.517 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:02:45.530 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:02:45.531 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:02:45.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:02:45.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:02:45.532 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:02:45.532 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:02:45.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:02:45.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:02:45.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:02:45.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:02:45.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:02:45.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:02:45.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:02:45.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:02:45.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:02:45.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:02:45.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:02:45.887 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:02:45.957 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:02:17
2026-06-03T16:02:45.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86448, datetime.datetime(2026, 6, 3, 16, 2, 17), datetime.datetime(2026, 6, 3, 16, 2, 17), 'salt', 6.87, 100.01, None, 37.72, 111.13, -0.01, 820.61, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:02:45.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:02:45.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:02:45.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:02:17, diff=28.963606s, valid=True
2026-06-03T16:02:45.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:02:45.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:02:45.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:02:12, diff=33.96671s, valid=True
2026-06-03T16:02:45.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:02:45.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:02:45.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:02:17, diff=28.973873s, valid=True
2026-06-03T16:02:45.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:02:45.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:02:45.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:02:45.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:02:45.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:02:45.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:02:45.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:02:12, diff=33.977126s, valid=True
2026-06-03T16:02:45.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:02:45.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:02:45.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:02:45.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69562.977834s, valid=False
2026-06-03T16:02:45.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:02:45.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:02:45.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:02:45.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:02:45.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:02:46.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:02:46.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:02:46.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:02:46.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:02:46.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:02:46.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:02:46.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:02:46.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:02:46.292 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:02:46.500 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:02:46.841 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:02:46.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:02:46.944 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:02:46.944 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:02:47.145 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:02:47.145 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:03:17.160 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:03:17.160 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:03:17.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:03:17.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:03:17.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:03:17.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:03:17.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:03:17.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:03:17.993 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:03:18.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:03:18.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:03:18.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:03:18.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:03:20.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:03:20.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:03:20.576 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:03:20.577 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:03:20.588 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:03:20.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:03:20.601 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:03:20.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:03:20.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:03:20.602 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:03:20.602 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:03:20.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:03:20.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:03:20.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:03:20.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:03:20.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:03:20.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:03:20.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:03:20.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:03:20.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:03:20.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:03:20.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:03:20.951 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:03:21.024 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:03:18
2026-06-03T16:03:21.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86450, datetime.datetime(2026, 6, 3, 16, 3, 18), datetime.datetime(2026, 6, 3, 16, 3, 17), 'salt', 6.94, 100.07, None, 40.86, 120.03, -0.02, 820.71, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:03:21.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:03:21.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:03:21.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:03:17, diff=4.031456s, valid=True
2026-06-03T16:03:21.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:03:21.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:03:21.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:03:12, diff=9.034997s, valid=True
2026-06-03T16:03:21.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:03:21.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:03:21.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:03:17, diff=4.043078s, valid=True
2026-06-03T16:03:21.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:03:21.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:03:21.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:03:21.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:03:21.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:03:21.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:03:21.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:03:12, diff=9.04681s, valid=True
2026-06-03T16:03:21.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:03:21.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:03:21.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:03:21.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69598.047605s, valid=False
2026-06-03T16:03:21.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:03:21.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:03:21.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:03:21.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:03:21.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:03:21.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:03:21.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:03:21.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:03:21.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:03:21.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:03:21.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:03:21.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:03:21.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:03:21.370 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:03:21.640 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:03:21.985 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:03:22.088 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:03:22.089 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:03:22.089 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:03:22.267 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:03:22.268 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:03:52.298 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:03:52.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:03:52.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:03:52.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:03:52.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:03:52.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:03:52.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:03:52.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:03:52.715 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:03:52.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:03:52.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:03:52.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:03:52.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:03:56.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:03:56.068 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:03:56.069 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:03:56.069 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:03:56.080 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:03:56.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:03:56.094 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:03:56.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:03:56.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:03:56.095 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:03:56.096 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:03:56.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:03:56.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:03:56.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:03:56.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:03:56.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:03:56.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:03:56.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:03:56.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:03:56.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:03:56.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:03:56.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:03:56.434 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:03:56.515 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:03:48
2026-06-03T16:03:56.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86451, datetime.datetime(2026, 6, 3, 16, 3, 48), datetime.datetime(2026, 6, 3, 16, 3, 47), 'salt', 6.87, 100.01, None, 39.41, 116.25, -0.01, 820.65, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:03:56.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:03:56.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:03:56.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:03:47, diff=9.522565s, valid=True
2026-06-03T16:03:56.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:03:56.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:03:56.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:04:12, diff=-15.473948s, valid=True
2026-06-03T16:03:56.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:03:56.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:03:56.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:03:48, diff=8.534178s, valid=True
2026-06-03T16:03:56.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:03:56.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:03:56.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:03:56.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:03:56.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:03:56.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:03:56.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:04:12, diff=-15.462066s, valid=True
2026-06-03T16:03:56.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:03:56.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:03:56.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:03:56.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69633.538754s, valid=False
2026-06-03T16:03:56.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:03:56.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:03:56.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:03:56.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:03:56.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:03:56.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:03:56.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:03:56.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:03:56.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:03:56.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:03:56.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:03:56.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:03:56.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:03:56.862 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:03:57.070 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:03:57.413 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:03:57.517 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:03:57.517 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:03:57.517 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:03:57.748 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:03:57.749 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:04:27.779 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:04:27.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:04:27.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:04:27.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:04:27.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:04:28.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:04:28.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:04:28.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:04:28.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:04:28.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:04:28.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:04:28.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:04:28.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:04:31.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:04:31.425 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:04:31.425 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:04:31.425 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:04:31.434 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:04:31.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:04:31.446 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:04:31.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:04:31.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:04:31.447 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:04:31.447 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:04:31.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:04:31.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:04:31.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:04:31.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:04:31.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:04:31.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:04:31.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:04:31.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:04:31.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:04:31.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:04:31.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:04:31.764 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:04:31.834 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:04:18
2026-06-03T16:04:31.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86452, datetime.datetime(2026, 6, 3, 16, 4, 18), datetime.datetime(2026, 6, 3, 16, 4, 18), 'salt', 6.97, 100.14, None, 37.58, 115.29, -0.03, 820.65, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:04:31.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:04:31.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:04:31.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:04:18, diff=13.840608s, valid=True
2026-06-03T16:04:31.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:04:31.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:04:31.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:04:12, diff=19.844015s, valid=True
2026-06-03T16:04:31.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:04:31.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:04:31.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:04:18, diff=13.85228s, valid=True
2026-06-03T16:04:31.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:04:31.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:04:31.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:04:31.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:04:31.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:04:31.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:04:31.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:04:12, diff=19.855931s, valid=True
2026-06-03T16:04:31.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:04:31.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:04:31.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:04:31.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69668.856743s, valid=False
2026-06-03T16:04:31.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:04:31.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:04:31.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:04:31.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:04:31.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:04:31.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:04:31.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:04:31.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:04:31.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:04:31.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:04:32.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:04:32.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:04:32.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:04:32.247 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:04:32.452 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:04:32.793 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:04:32.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:04:32.895 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:04:32.895 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:04:33.093 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:04:33.093 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:05:03.118 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:05:03.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:05:03.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:05:03.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:05:03.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:05:03.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:05:03.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:05:03.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:05:03.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:05:03.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:05:03.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:05:03.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:05:03.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:05:06.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:05:06.151 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:05:06.152 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:05:06.152 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:05:06.163 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:05:06.176 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:05:06.176 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:05:06.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:05:06.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:05:06.178 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:05:06.178 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:05:06.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:05:06.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:05:06.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:05:06.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:05:06.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:05:06.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:05:06.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:05:06.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:05:06.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:05:06.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:05:06.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:05:06.475 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:05:06.548 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:04:49
2026-06-03T16:05:06.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86453, datetime.datetime(2026, 6, 3, 16, 4, 49), datetime.datetime(2026, 6, 3, 16, 4, 48), 'salt', 6.94, 100.07, None, 36.84, 118.58, -0.02, 820.58, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:05:06.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:05:06.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:05:06.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:04:48, diff=18.555764s, valid=True
2026-06-03T16:05:06.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:05:06.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:05:06.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:05:12, diff=-5.440923s, valid=True
2026-06-03T16:05:06.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:05:06.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:05:06.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:04:48, diff=18.566911s, valid=True
2026-06-03T16:05:06.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:05:06.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:05:06.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:05:06.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:05:06.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:05:06.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:05:06.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:05:12, diff=-5.429557s, valid=True
2026-06-03T16:05:06.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:05:06.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:05:06.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:05:06.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69703.571221s, valid=False
2026-06-03T16:05:06.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:05:06.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:05:06.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:05:06.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:05:06.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:05:06.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:05:06.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:05:06.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:05:06.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:05:06.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:05:06.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:05:06.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:05:06.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:05:06.895 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:05:07.102 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:05:07.444 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:05:07.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:05:07.548 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:05:07.548 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:05:07.708 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:05:07.708 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:05:37.739 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:05:37.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:05:37.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:05:37.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:05:37.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:05:38.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:05:38.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:05:38.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:05:38.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:05:38.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:05:38.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:05:38.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:05:38.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:05:40.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:05:40.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:05:40.923 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:05:40.923 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:05:40.934 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:05:40.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:05:40.947 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:05:40.948 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:05:40.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:05:40.948 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:05:40.949 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:05:40.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:05:41.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:05:41.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:05:41.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:05:41.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:05:41.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:05:41.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:05:41.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:05:41.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:05:41.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:05:41.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:05:41.298 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:05:41.379 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:05:19
2026-06-03T16:05:41.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86454, datetime.datetime(2026, 6, 3, 16, 5, 19), datetime.datetime(2026, 6, 3, 16, 5, 18), 'salt', 6.91, 100.04, None, 45.27, 112.57, -0.01, 820.64, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T16:05:41.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:05:41.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:05:41.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:05:18, diff=23.387023s, valid=True
2026-06-03T16:05:41.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:05:41.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:05:41.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:05:12, diff=29.390496s, valid=True
2026-06-03T16:05:41.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:05:41.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:05:41.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:05:18, diff=23.398689s, valid=True
2026-06-03T16:05:41.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:05:41.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:05:41.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:05:41.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:05:41.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:05:41.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:05:41.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:05:12, diff=29.402398s, valid=True
2026-06-03T16:05:41.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:05:41.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:05:41.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:05:41.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69738.403215s, valid=False
2026-06-03T16:05:41.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:05:41.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:05:41.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:05:41.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:05:41.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:05:41.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:05:41.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:05:41.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:05:41.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:05:41.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:05:41.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:05:41.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:05:41.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:05:41.792 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:05:41.997 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:05:42.337 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:05:42.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:05:42.439 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:05:42.439 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:05:42.641 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:05:42.641 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:06:12.671 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:06:12.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:06:12.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:06:13.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:06:13.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:06:13.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:06:13.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:06:13.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:06:13.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:06:13.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:06:13.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:06:13.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:06:13.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:06:16.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:06:16.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:06:16.615 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:06:16.616 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:06:16.625 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:06:16.637 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:06:16.638 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:06:16.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:06:16.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:06:16.638 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:06:16.638 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:06:16.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:06:16.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:06:16.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:06:16.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:06:16.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:06:16.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:06:16.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:06:16.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:06:16.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:06:16.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:06:16.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:06:16.935 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:06:17.004 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:05:49
2026-06-03T16:06:17.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86455, datetime.datetime(2026, 6, 3, 16, 5, 49), datetime.datetime(2026, 6, 3, 16, 5, 49), 'salt', 6.87, 99.97, None, 34.65, 115.24, 0.0, 820.58, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:06:17.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:06:17.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:06:17.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:05:49, diff=28.011824s, valid=True
2026-06-03T16:06:17.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:06:17.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:06:17.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:06:12, diff=5.015104s, valid=True
2026-06-03T16:06:17.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:06:17.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:06:17.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:05:48, diff=29.022804s, valid=True
2026-06-03T16:06:17.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:06:17.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:06:17.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:06:17.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:06:17.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:06:17.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:06:17.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:06:12, diff=5.026249s, valid=True
2026-06-03T16:06:17.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:06:17.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:06:17.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:06:17.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69774.027024s, valid=False
2026-06-03T16:06:17.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:06:17.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:06:17.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:06:17.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:06:17.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:06:17.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:06:17.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:06:17.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:06:17.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:06:17.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:06:17.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:06:17.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:06:17.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:06:17.347 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:06:17.552 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:06:17.890 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:06:17.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:06:17.994 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:06:17.994 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:06:18.230 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:06:18.230 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:06:48.260 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:06:48.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:06:48.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:06:48.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:06:48.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:06:48.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:06:48.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:06:48.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:06:48.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:06:48.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:06:48.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:06:48.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:06:48.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:06:51.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:06:51.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:06:51.764 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:06:51.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:06:51.774 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:06:51.787 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:06:51.787 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:06:51.788 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:06:51.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:06:51.788 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:06:51.789 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:06:51.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:06:51.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:06:51.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:06:52.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:06:52.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:06:52.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:06:52.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:06:52.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:06:52.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:06:52.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:06:52.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:06:52.138 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:06:52.211 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:06:50
2026-06-03T16:06:52.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86457, datetime.datetime(2026, 6, 3, 16, 6, 50), datetime.datetime(2026, 6, 3, 16, 6, 49), 'salt', 7.04, 100.04, None, 37.33, 119.96, -0.01, 820.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:06:52.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:06:52.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:06:52.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:06:49, diff=3.217527s, valid=True
2026-06-03T16:06:52.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:06:52.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:06:52.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:07:12, diff=-19.779567s, valid=True
2026-06-03T16:06:52.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:06:52.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:06:52.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:06:49, diff=3.227196s, valid=True
2026-06-03T16:06:52.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:06:52.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:06:52.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:06:52.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:06:52.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:06:52.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:06:52.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:07:12, diff=-19.769748s, valid=True
2026-06-03T16:06:52.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:06:52.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:06:52.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:06:52.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69809.230922s, valid=False
2026-06-03T16:06:52.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:06:52.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:06:52.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:06:52.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:06:52.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:06:52.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:06:52.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:06:52.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:06:52.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:06:52.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:06:52.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:06:52.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:06:52.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:06:52.721 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:06:52.929 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:06:53.268 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:06:53.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:06:53.371 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:06:53.371 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:06:53.542 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:06:53.542 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:07:23.572 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:07:23.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:07:23.573 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:07:23.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:07:23.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:07:24.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:07:24.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:07:24.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:07:24.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:07:24.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:07:24.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:07:24.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:07:24.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:07:27.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:07:27.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:07:27.066 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:07:27.066 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:07:27.076 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:07:27.088 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:07:27.089 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:07:27.089 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:07:27.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:07:27.090 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:07:27.090 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:07:27.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:07:27.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:07:27.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:07:27.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:07:27.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:07:27.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:07:27.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:07:27.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:07:27.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:07:27.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:07:27.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:07:27.424 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:07:27.504 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:07:20
2026-06-03T16:07:27.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86458, datetime.datetime(2026, 6, 3, 16, 7, 20), datetime.datetime(2026, 6, 3, 16, 7, 19), 'salt', 7.04, 100.11, None, 43.4, 121.79, -0.02, 820.52, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:07:27.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:07:27.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:07:27.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:07:19, diff=8.511562s, valid=True
2026-06-03T16:07:27.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:07:27.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:07:27.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:07:12, diff=15.514931s, valid=True
2026-06-03T16:07:27.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:07:27.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:07:27.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:07:19, diff=8.522881s, valid=True
2026-06-03T16:07:27.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:07:27.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:07:27.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:07:27.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:07:27.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:07:27.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:07:27.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:07:12, diff=15.526441s, valid=True
2026-06-03T16:07:27.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:07:27.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:07:27.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:07:27.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69844.527225s, valid=False
2026-06-03T16:07:27.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:07:27.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:07:27.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:07:27.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:07:27.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:07:27.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:07:27.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:07:27.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:07:27.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:07:27.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:07:27.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:07:27.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:07:27.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:07:27.844 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:07:28.048 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:07:28.447 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:07:28.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:07:28.549 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:07:28.549 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:07:28.753 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:07:28.754 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:07:58.784 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:07:58.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:07:58.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:07:58.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:07:58.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:07:59.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:07:59.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:07:59.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:07:59.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:07:59.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:07:59.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:07:59.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:07:59.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:08:01.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:08:01.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:08:01.875 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:08:01.875 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:08:01.885 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:08:01.897 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:08:01.898 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:08:01.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:08:01.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:08:01.899 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:08:01.899 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:08:01.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:08:02.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:08:02.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:08:02.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:08:02.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:08:02.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:08:02.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:08:02.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:08:02.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:08:02.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:08:02.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:08:02.249 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:08:02.317 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:07:50
2026-06-03T16:08:02.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86459, datetime.datetime(2026, 6, 3, 16, 7, 50), datetime.datetime(2026, 6, 3, 16, 7, 50), 'salt', 7.07, 100.07, None, 37.75, 122.29, -0.02, 820.58, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:08:02.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:08:02.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:08:02.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:07:50, diff=12.325097s, valid=True
2026-06-03T16:08:02.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:08:02.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:08:02.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:08:12, diff=-9.671447s, valid=True
2026-06-03T16:08:02.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:08:02.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:08:02.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:07:49, diff=13.336844s, valid=True
2026-06-03T16:08:02.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:08:02.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:08:02.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:08:02.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:08:02.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:08:02.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:08:02.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:08:12, diff=-9.659458s, valid=True
2026-06-03T16:08:02.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:08:02.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:08:02.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:08:02.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69879.341364s, valid=False
2026-06-03T16:08:02.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:08:02.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:08:02.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:08:02.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:08:02.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:08:02.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:08:02.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:08:02.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:08:02.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:08:02.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:08:02.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:08:02.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:08:02.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:08:02.659 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:08:02.864 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:08:03.203 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:08:03.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:08:03.305 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:08:03.306 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:08:03.480 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:08:03.480 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:08:33.511 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:08:33.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:08:33.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:08:34.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:08:34.081 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:08:34.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:08:34.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:08:34.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:08:34.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:08:34.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:08:34.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:08:34.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:08:34.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:08:37.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:08:37.962 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:08:37.963 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:08:37.963 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:08:37.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:08:37.988 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:08:37.988 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:08:37.989 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:08:37.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:08:37.989 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:08:37.990 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:08:37.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:08:38.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:08:38.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:08:38.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:08:38.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:08:38.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:08:38.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:08:38.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:08:38.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:08:38.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:08:38.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:08:38.337 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:08:38.410 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:08:21
2026-06-03T16:08:38.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86460, datetime.datetime(2026, 6, 3, 16, 8, 21), datetime.datetime(2026, 6, 3, 16, 8, 20), 'salt', 6.94, 100.04, None, 38.71, 118.06, -0.01, 820.58, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:08:38.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:08:38.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:08:38.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:08:20, diff=18.417728s, valid=True
2026-06-03T16:08:38.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:08:38.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:08:38.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:08:12, diff=26.421193s, valid=True
2026-06-03T16:08:38.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:08:38.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:08:38.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:08:20, diff=18.429268s, valid=True
2026-06-03T16:08:38.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:08:38.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:08:38.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:08:38.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:08:38.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:08:38.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:08:38.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:08:12, diff=26.433003s, valid=True
2026-06-03T16:08:38.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:08:38.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:08:38.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:08:38.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69915.433852s, valid=False
2026-06-03T16:08:38.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:08:38.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:08:38.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:08:38.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:08:38.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:08:38.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:08:38.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:08:38.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:08:38.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:08:38.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:08:38.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:08:38.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:08:38.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:08:38.825 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:08:39.030 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:08:39.372 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:08:39.476 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:08:39.476 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:08:39.476 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:08:39.650 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:08:39.650 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:09:09.680 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:09:09.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:09:09.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:09:10.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:09:10.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:09:10.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:09:10.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:09:10.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:09:10.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:09:10.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:09:10.545 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:09:10.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:09:10.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:09:13.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:09:13.236 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:09:13.238 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:09:13.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:09:13.249 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:09:13.261 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:09:13.262 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:09:13.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:09:13.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:09:13.263 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:09:13.263 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:09:13.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:09:13.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:09:13.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:09:13.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:09:13.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:09:13.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:09:13.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:09:13.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:09:13.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:09:13.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:09:13.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:09:13.605 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:09:13.687 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:08:51
2026-06-03T16:09:13.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86461, datetime.datetime(2026, 6, 3, 16, 8, 51), datetime.datetime(2026, 6, 3, 16, 8, 50), 'salt', 7.04, 100.07, None, 43.54, 119.49, -0.02, 820.58, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:09:13.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:09:13.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:09:13.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:08:50, diff=23.694635s, valid=True
2026-06-03T16:09:13.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:09:13.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:09:13.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:09:12, diff=1.698143s, valid=True
2026-06-03T16:09:13.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:09:13.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:09:13.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:08:50, diff=23.706234s, valid=True
2026-06-03T16:09:13.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:09:13.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:09:13.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:09:13.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:09:13.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:09:13.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:09:13.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:09:12, diff=1.710011s, valid=True
2026-06-03T16:09:13.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:09:13.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:09:13.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:09:13.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69950.71083s, valid=False
2026-06-03T16:09:13.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:09:13.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:09:13.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:09:13.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:09:13.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:09:13.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:09:13.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:09:13.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:09:13.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:09:13.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:09:13.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:09:13.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:09:13.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:09:14.033 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:09:14.238 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:09:14.577 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:09:14.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:09:14.679 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:09:14.679 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:09:16.187 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:09:16.187 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:09:46.217 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:09:46.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:09:46.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:09:46.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:09:46.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:09:46.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:09:46.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:09:46.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:09:46.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:09:46.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:09:46.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:09:46.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:09:46.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:09:49.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:09:49.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:09:49.707 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:09:49.707 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:09:49.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:09:49.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:09:49.728 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:09:49.729 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:09:49.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:09:49.730 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:09:49.730 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:09:49.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:09:49.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:09:49.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:09:49.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:09:49.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:09:49.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:09:49.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:09:50.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:09:50.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:09:50.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:09:50.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:09:50.025 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:09:50.101 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:09:21
2026-06-03T16:09:50.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86462, datetime.datetime(2026, 6, 3, 16, 9, 21), datetime.datetime(2026, 6, 3, 16, 9, 21), 'salt', 6.94, 100.04, None, 42.59, 119.73, -0.01, 820.58, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:09:50.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:09:50.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:09:50.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:09:21, diff=29.108026s, valid=True
2026-06-03T16:09:50.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:09:50.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:09:50.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:09:12, diff=38.110928s, valid=True
2026-06-03T16:09:50.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:09:50.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:09:50.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:09:20, diff=30.118298s, valid=True
2026-06-03T16:09:50.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:09:50.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:09:50.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:09:50.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:09:50.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:09:50.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:09:50.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:09:12, diff=38.121648s, valid=True
2026-06-03T16:09:50.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:09:50.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:09:50.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:09:50.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=69987.122326s, valid=False
2026-06-03T16:09:50.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:09:50.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:09:50.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:09:50.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:09:50.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:09:50.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:09:50.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:09:50.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:09:50.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:09:50.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:09:50.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:09:50.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:09:50.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:09:50.507 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:09:50.713 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:09:51.053 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:09:51.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:09:51.156 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:09:51.156 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:09:51.228 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:09:51.228 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:10:21.231 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:10:21.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:10:21.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:10:21.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:10:21.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:10:21.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:10:21.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:10:21.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:10:21.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:10:21.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:10:21.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:10:21.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:10:21.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:10:24.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:10:24.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:10:24.495 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:10:24.495 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:10:24.506 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:10:24.519 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:10:24.519 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:10:24.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:10:24.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:10:24.521 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:10:24.521 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:10:24.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:10:24.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:10:24.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:10:24.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:10:24.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:10:24.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:10:24.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:10:24.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T16:10:24.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:10:24.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:10:24.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:10:24.860 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:10:24.930 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:10:22
2026-06-03T16:10:24.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86464, datetime.datetime(2026, 6, 3, 16, 10, 22), datetime.datetime(2026, 6, 3, 16, 10, 21), 'salt', 6.87, 100.01, None, 43.79, 121.58, -0.01, 820.58, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:10:24.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:10:24.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:10:24.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:10:21, diff=3.937508s, valid=True
2026-06-03T16:10:24.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:10:24.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:10:24.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:10:12, diff=12.940899s, valid=True
2026-06-03T16:10:24.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:10:24.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:10:24.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:10:20, diff=4.948951s, valid=True
2026-06-03T16:10:24.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:10:24.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:10:24.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:10:24.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:10:24.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:10:24.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T16:10:24.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:10:12, diff=12.952519s, valid=True
2026-06-03T16:10:24.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:10:24.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:10:24.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:10:24.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70021.953358s, valid=False
2026-06-03T16:10:24.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:10:24.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:10:24.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:10:24.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:10:24.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:10:25.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:10:25.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:10:25.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:10:25.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:10:25.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:10:25.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:10:25.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:10:25.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:10:25.305 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:10:25.510 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:10:25.854 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:10:25.960 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:10:25.960 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:10:25.961 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:10:26.129 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:10:26.129 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:10:56.159 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:10:56.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:10:56.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:10:56.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:10:56.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:10:56.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:10:56.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:10:56.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:10:56.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:10:56.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:10:56.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:10:56.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:10:56.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:10:59.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:10:59.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:10:59.229 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:10:59.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:10:59.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:10:59.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:10:59.253 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:10:59.254 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:10:59.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:10:59.254 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:10:59.255 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:10:59.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:10:59.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:10:59.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:10:59.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:10:59.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:10:59.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:10:59.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:10:59.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:10:59.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:10:59.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:10:59.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:10:59.617 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:10:59.694 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:10:52
2026-06-03T16:10:59.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86465, datetime.datetime(2026, 6, 3, 16, 10, 52), datetime.datetime(2026, 6, 3, 16, 10, 51), 'salt', 6.81, 100.01, None, 43.01, 125.01, 0.0, 820.4, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:10:59.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:10:59.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:10:59.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:10:51, diff=8.701968s, valid=True
2026-06-03T16:10:59.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:10:59.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:10:59.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:11:12, diff=-12.294449s, valid=True
2026-06-03T16:10:59.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:10:59.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:10:59.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:10:51, diff=8.713921s, valid=True
2026-06-03T16:10:59.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:10:59.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:10:59.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:10:59.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:10:59.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:10:59.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:10:59.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:11:12, diff=-12.282262s, valid=True
2026-06-03T16:10:59.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:10:59.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:10:59.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:10:59.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70056.718549s, valid=False
2026-06-03T16:10:59.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:10:59.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:10:59.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:10:59.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:10:59.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:10:59.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:10:59.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:10:59.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:10:59.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:10:59.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:10:59.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:10:59.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:11:00.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:11:00.054 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:11:00.264 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:11:00.604 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:11:00.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:11:00.706 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:11:00.706 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:11:00.886 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:11:00.887 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:11:30.891 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:11:30.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:11:30.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:11:31.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:11:31.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:11:31.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:11:31.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:11:31.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:11:31.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:11:31.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:11:31.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:11:31.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:11:31.573 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:11:34.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:11:34.261 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:11:34.262 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:11:34.262 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:11:34.272 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:11:34.285 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:11:34.286 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:11:34.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:11:34.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:11:34.287 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:11:34.287 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:11:34.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:11:34.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:11:34.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:11:34.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:11:34.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:11:34.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:11:34.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:11:34.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:11:34.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:11:34.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:11:34.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:11:34.641 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:11:34.714 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:11:22
2026-06-03T16:11:34.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86466, datetime.datetime(2026, 6, 3, 16, 11, 22), datetime.datetime(2026, 6, 3, 16, 11, 22), 'salt', 6.84, 99.97, None, 41.6, 123.63, 0.0, 820.52, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:11:34.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:11:34.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:11:34.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:11:22, diff=12.721315s, valid=True
2026-06-03T16:11:34.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:11:34.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:11:34.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:11:12, diff=22.724803s, valid=True
2026-06-03T16:11:34.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:11:34.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:11:34.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:11:21, diff=13.732975s, valid=True
2026-06-03T16:11:34.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:11:34.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:11:34.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:11:34.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:11:34.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:11:34.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:11:34.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:11:12, diff=22.736689s, valid=True
2026-06-03T16:11:34.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:11:34.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:11:34.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:11:34.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70091.73748s, valid=False
2026-06-03T16:11:34.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:11:34.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:11:34.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:11:34.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:11:34.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:11:34.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:11:34.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:11:34.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:11:34.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:11:34.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:11:34.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:11:34.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:11:35.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:11:35.059 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:11:35.264 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:11:35.661 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:11:35.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:11:35.763 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:11:35.763 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:11:35.990 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:11:35.990 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:12:06.020 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:12:06.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:12:06.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:12:06.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:12:06.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:12:06.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:12:06.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:12:06.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:12:06.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:12:06.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:12:06.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:12:06.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:12:06.437 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:12:09.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:12:09.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:12:09.151 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:12:09.151 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:12:09.163 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:12:09.175 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:12:09.176 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:12:09.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:12:09.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:12:09.177 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:12:09.177 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:12:09.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:12:09.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:12:09.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:12:09.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:12:09.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:12:09.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:12:09.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:12:09.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:12:09.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:12:09.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:12:09.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:12:09.476 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:12:09.548 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:11:53
2026-06-03T16:12:09.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86467, datetime.datetime(2026, 6, 3, 16, 11, 53), datetime.datetime(2026, 6, 3, 16, 11, 52), 'salt', 6.74, 99.91, None, 40.26, 126.35, 0.01, 820.58, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:12:09.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:12:09.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:12:09.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:11:52, diff=17.555606s, valid=True
2026-06-03T16:12:09.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:12:09.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:12:09.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:12:12, diff=-2.441146s, valid=True
2026-06-03T16:12:09.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:12:09.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:12:09.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:11:51, diff=18.566382s, valid=True
2026-06-03T16:12:09.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:12:09.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:12:09.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:12:09.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:12:09.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:12:09.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:12:09.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:12:12, diff=-2.430158s, valid=True
2026-06-03T16:12:09.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:12:09.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:12:09.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:12:09.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70126.570574s, valid=False
2026-06-03T16:12:09.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:12:09.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:12:09.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:12:09.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:12:09.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:12:09.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:12:09.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:12:09.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:12:09.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:12:09.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:12:09.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:12:09.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:12:09.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:12:09.899 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:12:10.127 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:12:10.468 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:12:10.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:12:10.570 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:12:10.571 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:12:10.819 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:12:10.820 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:12:40.824 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:12:40.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:12:40.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:12:40.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:12:40.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:12:41.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:12:41.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:12:41.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:12:41.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:12:41.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:12:41.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:12:41.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:12:41.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:12:43.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:12:43.905 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:12:43.905 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:12:43.905 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:12:43.914 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:12:43.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:12:43.927 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:12:43.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:12:43.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:12:43.928 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:12:43.928 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:12:43.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:12:44.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:12:44.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:12:44.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:12:44.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:12:44.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:12:44.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:12:44.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:12:44.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:12:44.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:12:44.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:12:44.295 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:12:44.407 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:12:23
2026-06-03T16:12:44.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86468, datetime.datetime(2026, 6, 3, 16, 12, 23), datetime.datetime(2026, 6, 3, 16, 12, 22), 'salt', 6.77, 100.11, None, 44.88, 123.25, -0.02, 820.46, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:12:44.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:12:44.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:12:44.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:12:22, diff=22.414713s, valid=True
2026-06-03T16:12:44.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:12:44.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:12:44.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:12:12, diff=32.418256s, valid=True
2026-06-03T16:12:44.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:12:44.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:12:44.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:12:21, diff=23.426463s, valid=True
2026-06-03T16:12:44.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:12:44.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:12:44.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:12:44.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:12:44.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:12:44.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:12:44.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:12:12, diff=32.430196s, valid=True
2026-06-03T16:12:44.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:12:44.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:12:44.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:12:44.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70161.431013s, valid=False
2026-06-03T16:12:44.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:12:44.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:12:44.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:12:44.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:12:44.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:12:44.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:12:44.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:12:44.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:12:44.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:12:44.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:12:44.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:12:44.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:12:44.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:12:44.830 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:12:45.035 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:12:45.374 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:12:45.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:12:45.477 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:12:45.478 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:12:45.549 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:12:45.549 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:13:15.579 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:13:15.579 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:13:15.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:13:15.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:13:15.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:13:16.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:13:16.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:13:16.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:13:16.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:13:16.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:13:16.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:13:16.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:13:16.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:13:18.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:13:18.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:13:18.662 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:13:18.662 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:13:18.673 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:13:18.685 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:13:18.686 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:13:18.687 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:13:18.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:13:18.687 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:13:18.687 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:13:18.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:13:18.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:13:18.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:13:18.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:13:18.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:13:18.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T16:13:18.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:13:19.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T16:13:19.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:13:19.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:13:19.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:13:19.036 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:13:19.108 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:12:53
2026-06-03T16:13:19.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86469, datetime.datetime(2026, 6, 3, 16, 12, 53), datetime.datetime(2026, 6, 3, 16, 12, 52), 'salt', 6.74, 100.01, None, 41.35, 120.97, -0.01, 820.52, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:13:19.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:13:19.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:13:19.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:12:52, diff=27.116299s, valid=True
2026-06-03T16:13:19.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:13:19.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T16:13:19.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:13:12, diff=7.11997s, valid=True
2026-06-03T16:13:19.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:13:19.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:13:19.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:12:53, diff=26.128545s, valid=True
2026-06-03T16:13:19.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:13:19.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:13:19.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:13:19.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:13:19.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:13:19.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T16:13:19.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:13:12, diff=7.132447s, valid=True
2026-06-03T16:13:19.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:13:19.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:13:19.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:13:19.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70196.133305s, valid=False
2026-06-03T16:13:19.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:13:19.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:13:19.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:13:19.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:13:19.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:13:19.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:13:19.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:13:19.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:13:19.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:13:19.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:13:19.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:13:19.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:13:19.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:13:19.456 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:13:19.661 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:13:20.014 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:13:20.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:13:20.120 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:13:20.120 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:13:20.319 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:13:20.320 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:13:50.347 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:13:50.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:13:50.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:13:50.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:13:50.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:13:51.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:13:51.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:13:51.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:13:51.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:13:51.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:13:51.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:13:51.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:13:51.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:13:53.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:13:53.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:13:53.924 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:13:53.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:13:53.933 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:13:53.946 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:13:53.947 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:13:53.947 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:13:53.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:13:53.948 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:13:53.948 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:13:53.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:13:54.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:13:54.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:13:54.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:13:54.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:13:54.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T16:13:54.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:13:54.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T16:13:54.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:13:54.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:13:54.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:13:54.304 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:13:54.378 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:13:23
2026-06-03T16:13:54.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86470, datetime.datetime(2026, 6, 3, 16, 13, 23), datetime.datetime(2026, 6, 3, 16, 13, 23), 'salt', 6.87, 100.07, None, 43.5, 118.18, -0.02, 820.58, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:13:54.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:13:54.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:13:54.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:13:53, diff=1.386061s, valid=True
2026-06-03T16:13:54.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:13:54.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T16:13:54.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:13:12, diff=42.389439s, valid=True
2026-06-03T16:13:54.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:13:54.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:13:54.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:13:52, diff=2.397385s, valid=True
2026-06-03T16:13:54.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:13:54.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:13:54.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:13:54.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:13:54.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:13:54.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T16:13:54.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:13:12, diff=42.401016s, valid=True
2026-06-03T16:13:54.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:13:54.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:13:54.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:13:54.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70231.401822s, valid=False
2026-06-03T16:13:54.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:13:54.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:13:54.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:13:54.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:13:54.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:13:54.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:13:54.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:13:54.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:13:54.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:13:54.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:13:54.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:13:54.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:13:54.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:13:54.794 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:13:55.003 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:13:55.349 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:13:55.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:13:55.456 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:13:55.456 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:13:55.628 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:13:55.628 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:14:25.644 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:14:25.644 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:14:25.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:14:25.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:14:25.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:14:26.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:14:26.221 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:14:26.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:14:26.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:14:26.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:14:26.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:14:26.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:14:26.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:14:28.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:14:28.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:14:28.966 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:14:28.966 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:14:28.977 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:14:28.990 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:14:28.990 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:14:28.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:14:28.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:14:28.991 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:14:28.992 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:14:28.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:14:29.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:14:29.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:14:29.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:14:29.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:14:29.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:14:29.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:14:29.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:14:29.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:14:29.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:14:29.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:14:29.318 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:14:29.395 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:14:25
2026-06-03T16:14:29.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86472, datetime.datetime(2026, 6, 3, 16, 14, 25), datetime.datetime(2026, 6, 3, 16, 14, 24), 'salt', 6.74, 99.94, None, 35.67, 113.2, 0.0, 820.77, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:14:29.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:14:29.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:14:29.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:14:24, diff=5.403196s, valid=True
2026-06-03T16:14:29.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:14:29.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:14:29.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:14:12, diff=17.406705s, valid=True
2026-06-03T16:14:29.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:14:29.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:14:29.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:14:22, diff=7.414814s, valid=True
2026-06-03T16:14:29.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:14:29.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:14:29.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:14:29.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:14:29.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:14:29.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:14:29.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:14:12, diff=17.418528s, valid=True
2026-06-03T16:14:29.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:14:29.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:14:29.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:14:29.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70266.419345s, valid=False
2026-06-03T16:14:29.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:14:29.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:14:29.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:14:29.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:14:29.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:14:29.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:14:29.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:14:29.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:14:29.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:14:29.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:14:29.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:14:29.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:14:29.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:14:29.739 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:14:29.953 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:14:30.299 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:14:30.403 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:14:30.403 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:14:30.404 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:14:30.573 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:14:30.574 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:15:00.586 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:15:00.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:15:00.587 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:15:01.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:15:01.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:15:01.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:15:01.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:15:01.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:15:01.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:15:01.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:15:01.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:15:01.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:15:01.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:15:04.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:15:04.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:15:04.105 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:15:04.105 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:15:04.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:15:04.126 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:15:04.127 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:15:04.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:15:04.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:15:04.127 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:15:04.127 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:15:04.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:15:04.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:15:04.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:15:04.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:15:04.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:15:04.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:15:04.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:15:04.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:15:04.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:15:04.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:15:04.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:15:04.458 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:15:04.528 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:14:55
2026-06-03T16:15:04.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86473, datetime.datetime(2026, 6, 3, 16, 14, 55), datetime.datetime(2026, 6, 3, 16, 14, 54), 'salt', 6.84, 100.04, None, 40.93, 113.16, -0.01, 820.71, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:15:04.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:15:04.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:15:04.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:14:54, diff=10.536104s, valid=True
2026-06-03T16:15:04.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:15:04.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:15:04.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:15:12, diff=-7.460452s, valid=True
2026-06-03T16:15:04.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:15:04.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:15:04.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:14:52, diff=12.547641s, valid=True
2026-06-03T16:15:04.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:15:04.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:15:04.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:15:04.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:15:04.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:15:04.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:15:04.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:15:12, diff=-7.448671s, valid=True
2026-06-03T16:15:04.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:15:04.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:15:04.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:15:04.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70301.552135s, valid=False
2026-06-03T16:15:04.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:15:04.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:15:04.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:15:04.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:15:04.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:15:04.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:15:04.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:15:04.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:15:04.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:15:04.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:15:04.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:15:04.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:15:04.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:15:04.879 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:15:05.085 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:15:05.426 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:15:05.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:15:05.528 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:15:05.528 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:15:05.764 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:15:05.764 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:15:35.795 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:15:35.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:15:35.795 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:15:35.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:15:35.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:15:36.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:15:36.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:15:36.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:15:36.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:15:36.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:15:36.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:15:36.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:15:36.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:15:39.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:15:39.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:15:39.227 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:15:39.227 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:15:39.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:15:39.246 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:15:39.247 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:15:39.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:15:39.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:15:39.247 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:15:39.247 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:15:39.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:15:39.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:15:39.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:15:39.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:15:39.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:15:39.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:15:39.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:15:39.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:15:39.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:15:39.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:15:39.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:15:39.581 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:15:39.653 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:15:25
2026-06-03T16:15:39.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86474, datetime.datetime(2026, 6, 3, 16, 15, 25), datetime.datetime(2026, 6, 3, 16, 15, 24), 'salt', 6.84, 100.04, None, 42.9, 112.41, -0.01, 820.71, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:15:39.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:15:39.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:15:39.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:15:24, diff=15.660737s, valid=True
2026-06-03T16:15:39.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:15:39.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:15:39.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:15:12, diff=27.664097s, valid=True
2026-06-03T16:15:39.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:15:39.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:15:39.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:15:23, diff=16.67202s, valid=True
2026-06-03T16:15:39.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:15:39.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:15:39.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:15:39.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:15:39.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:15:39.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:15:39.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:15:12, diff=27.675642s, valid=True
2026-06-03T16:15:39.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:15:39.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:15:39.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:15:39.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70336.676413s, valid=False
2026-06-03T16:15:39.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:15:39.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:15:39.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:15:39.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:15:39.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:15:39.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:15:39.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:15:39.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:15:39.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:15:39.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:15:39.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:15:39.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:15:39.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:15:40.012 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:15:40.234 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:15:40.636 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:15:40.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:15:40.738 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:15:40.738 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:15:40.810 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:15:40.810 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:16:10.840 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:16:10.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:16:10.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:16:10.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:16:10.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:16:11.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:16:11.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:16:11.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:16:11.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:16:11.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:16:11.230 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:16:11.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:16:11.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:16:13.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:16:13.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:16:13.904 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:16:13.904 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:16:13.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:16:13.928 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:16:13.928 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:16:13.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:16:13.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:16:13.929 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:16:13.930 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:16:13.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:16:14.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:16:14.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:16:14.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:16:14.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:16:14.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:16:14.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:16:14.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:16:14.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:16:14.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:16:14.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:16:14.284 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:16:14.358 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:15:55
2026-06-03T16:16:14.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86475, datetime.datetime(2026, 6, 3, 16, 15, 55), datetime.datetime(2026, 6, 3, 16, 15, 55), 'salt', 6.81, 99.97, None, 34.97, 106.54, 0.0, 820.52, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:16:14.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:16:14.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:16:14.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:15:55, diff=19.365268s, valid=True
2026-06-03T16:16:14.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:16:14.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:16:14.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:16:12, diff=2.368774s, valid=True
2026-06-03T16:16:14.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:16:14.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:16:14.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:15:53, diff=21.376825s, valid=True
2026-06-03T16:16:14.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:16:14.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:16:14.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:16:14.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:16:14.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:16:14.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:16:14.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:16:12, diff=2.38055s, valid=True
2026-06-03T16:16:14.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:16:14.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:16:14.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:16:14.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70371.381346s, valid=False
2026-06-03T16:16:14.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:16:14.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:16:14.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:16:14.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:16:14.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:16:14.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:16:14.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:16:14.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:16:14.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:16:14.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:16:14.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:16:14.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:16:14.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:16:14.701 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:16:14.907 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:16:15.246 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:16:15.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:16:15.348 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:16:15.348 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:16:15.537 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:16:15.537 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:16:45.568 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:16:45.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:16:45.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:16:46.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:16:46.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:16:46.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:16:46.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:16:46.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:16:46.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:16:46.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:16:46.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:16:46.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:16:46.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:16:49.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:16:49.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:16:49.137 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:16:49.138 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:16:49.148 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:16:49.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:16:49.162 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:16:49.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:16:49.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:16:49.163 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:16:49.164 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:16:49.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:16:49.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:16:49.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:16:49.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:16:49.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:16:49.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T16:16:49.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:16:49.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T16:16:49.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:16:49.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:16:49.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:16:49.500 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:16:49.569 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:16:26
2026-06-03T16:16:49.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86476, datetime.datetime(2026, 6, 3, 16, 16, 26), datetime.datetime(2026, 6, 3, 16, 16, 25), 'salt', 6.87, 100.01, None, 35.57, 130.65, -0.01, 820.59, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:16:49.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:16:49.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:16:49.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:16:25, diff=24.58028s, valid=True
2026-06-03T16:16:49.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:16:49.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T16:16:49.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:16:12, diff=37.583784s, valid=True
2026-06-03T16:16:49.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:16:49.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:16:49.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:16:23, diff=26.591947s, valid=True
2026-06-03T16:16:49.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:16:49.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:16:49.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:16:49.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:16:49.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:16:49.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T16:16:49.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:16:12, diff=37.595705s, valid=True
2026-06-03T16:16:49.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:16:49.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:16:49.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:16:49.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70406.596498s, valid=False
2026-06-03T16:16:49.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:16:49.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:16:49.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:16:49.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:16:49.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:16:49.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:16:49.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:16:49.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:16:49.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:16:49.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:16:49.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:16:49.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:16:49.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:16:50.016 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:16:50.228 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:16:50.568 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:16:50.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:16:50.678 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:16:50.678 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:16:50.865 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:16:50.865 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:17:20.896 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:17:20.896 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:17:20.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:17:21.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:17:21.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:17:21.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:17:21.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:17:21.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:17:21.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:17:21.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:17:21.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:17:21.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:17:21.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:17:24.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:17:24.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:17:24.291 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:17:24.291 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:17:24.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:17:24.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:17:24.316 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:17:24.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:17:24.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:17:24.317 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:17:24.317 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:17:24.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:17:24.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:17:24.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:17:24.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:17:24.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:17:24.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:17:24.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:17:24.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:17:24.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:17:24.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:17:24.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:17:24.649 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:17:24.720 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:16:56
2026-06-03T16:17:24.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86477, datetime.datetime(2026, 6, 3, 16, 16, 56), datetime.datetime(2026, 6, 3, 16, 16, 55), 'salt', 6.87, 99.97, None, 35.95, 108.84, 0.0, 820.52, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:17:24.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:17:24.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:17:24.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:16:55, diff=29.72734s, valid=True
2026-06-03T16:17:24.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:17:24.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:17:24.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:17:12, diff=12.730825s, valid=True
2026-06-03T16:17:24.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:17:24.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:17:24.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:16:53, diff=31.73899s, valid=True
2026-06-03T16:17:24.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:17:24.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:17:24.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:17:24.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:17:24.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:17:24.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:17:24.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:17:12, diff=12.742709s, valid=True
2026-06-03T16:17:24.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:17:24.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:17:24.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:17:24.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70441.743515s, valid=False
2026-06-03T16:17:24.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:17:24.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:17:24.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:17:24.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:17:24.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:17:24.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:17:24.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:17:24.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:17:24.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:17:24.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:17:24.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:17:24.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:17:25.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:17:25.064 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:17:25.269 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:17:25.609 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:17:25.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:17:25.711 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:17:25.711 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:17:25.900 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:17:25.900 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:17:55.919 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:17:55.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:17:55.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:17:56.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:17:56.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:17:56.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:17:56.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:17:56.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:17:56.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:17:56.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:17:56.619 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:17:56.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:17:56.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:17:59.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:17:59.807 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:17:59.808 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:17:59.808 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:17:59.818 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:17:59.830 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:17:59.831 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:17:59.831 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:17:59.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:17:59.831 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:17:59.831 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:17:59.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:17:59.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:17:59.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:18:00.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:18:00.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:18:00.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:18:00.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:18:00.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:18:00.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:18:00.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:18:00.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:18:00.107 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:18:00.176 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:17:56
2026-06-03T16:18:00.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86479, datetime.datetime(2026, 6, 3, 16, 17, 56), datetime.datetime(2026, 6, 3, 16, 17, 55), 'salt', 6.84, 99.94, None, 44.1, 113.09, 0.0, 820.59, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:18:00.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:18:00.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:18:00.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:17:55, diff=5.183402s, valid=True
2026-06-03T16:18:00.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:18:00.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:18:00.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:18:12, diff=-11.81343s, valid=True
2026-06-03T16:18:00.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:18:00.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:18:00.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:17:56, diff=4.193972s, valid=True
2026-06-03T16:18:00.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:18:00.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:18:00.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:18:00.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:18:00.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:18:00.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:18:00.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:18:12, diff=-11.802653s, valid=True
2026-06-03T16:18:00.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:18:00.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:18:00.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:18:00.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70477.198072s, valid=False
2026-06-03T16:18:00.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:18:00.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:18:00.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:18:00.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:18:00.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:18:00.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:18:00.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:18:00.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:18:00.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:18:00.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:18:00.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:18:00.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:18:00.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:18:00.589 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:18:00.793 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:18:01.139 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:18:01.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:18:01.263 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:18:01.263 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:18:01.334 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:18:01.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:18:31.364 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:18:31.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:18:31.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:18:31.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:18:31.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:18:31.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:18:31.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:18:31.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:18:31.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:18:31.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:18:31.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:18:31.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:18:31.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:18:34.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:18:34.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:18:34.678 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:18:34.678 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:18:34.688 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:18:34.702 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:18:34.703 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:18:34.703 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:18:34.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:18:34.704 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:18:34.704 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:18:34.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:18:34.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:18:34.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:18:34.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:18:34.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:18:34.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:18:34.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:18:35.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:18:35.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:18:35.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:18:35.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:18:35.041 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:18:35.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:18:27
2026-06-03T16:18:35.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86480, datetime.datetime(2026, 6, 3, 16, 18, 27), datetime.datetime(2026, 6, 3, 16, 18, 26), 'salt', 6.87, 100.01, None, 41.28, 117.76, -0.01, 820.4, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:18:35.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:18:35.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:18:35.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:18:26, diff=9.123477s, valid=True
2026-06-03T16:18:35.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:18:35.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:18:35.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:18:12, diff=23.126961s, valid=True
2026-06-03T16:18:35.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:18:35.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:18:35.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:18:24, diff=11.135074s, valid=True
2026-06-03T16:18:35.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:18:35.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:18:35.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:18:35.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:18:35.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:18:35.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:18:35.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:18:12, diff=23.138757s, valid=True
2026-06-03T16:18:35.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:18:35.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:18:35.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:18:35.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70512.139557s, valid=False
2026-06-03T16:18:35.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:18:35.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:18:35.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:18:35.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:18:35.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:18:35.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:18:35.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:18:35.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:18:35.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:18:35.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:18:35.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:18:35.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:18:35.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:18:35.462 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:18:35.671 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:18:36.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:18:36.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:18:36.117 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:18:36.117 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:18:36.339 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:18:36.340 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:19:06.346 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:19:06.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:19:06.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:19:06.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:19:06.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:19:07.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:19:07.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:19:07.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:19:07.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:19:07.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:19:07.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:19:07.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:19:07.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:19:10.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:19:10.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:19:10.466 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:19:10.466 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:19:10.477 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:19:10.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:19:10.490 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:19:10.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:19:10.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:19:10.491 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:19:10.492 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:19:10.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:19:10.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:19:10.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:19:10.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:19:10.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:19:10.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:19:10.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:19:10.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:19:10.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:19:10.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:19:10.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:19:10.824 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:19:10.895 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:18:57
2026-06-03T16:19:10.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86481, datetime.datetime(2026, 6, 3, 16, 18, 57), datetime.datetime(2026, 6, 3, 16, 18, 56), 'salt', 6.87, 100.04, None, 43.08, 112.55, -0.01, 820.52, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:19:10.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:19:10.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:19:10.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:18:56, diff=14.902083s, valid=True
2026-06-03T16:19:10.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:19:10.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:19:10.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:19:12, diff=-1.095036s, valid=True
2026-06-03T16:19:10.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:19:10.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:19:10.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:18:54, diff=16.911714s, valid=True
2026-06-03T16:19:10.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:19:10.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:19:10.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:19:10.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:19:10.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:19:10.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:19:10.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:19:12, diff=-1.085183s, valid=True
2026-06-03T16:19:10.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:19:10.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:19:10.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:19:10.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70547.915493s, valid=False
2026-06-03T16:19:10.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:19:10.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:19:10.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:19:10.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:19:10.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:19:10.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:19:10.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:19:10.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:19:11.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:19:11.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:19:11.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:19:11.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:19:11.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:19:11.350 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:19:11.561 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:19:11.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:19:12.013 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:19:12.013 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:19:12.013 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:19:12.276 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:19:12.276 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:19:42.297 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:19:42.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:19:42.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:19:42.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:19:42.444 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:19:42.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:19:42.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:19:42.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:19:42.698 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:19:42.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:19:42.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:19:42.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:19:42.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:19:45.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:19:45.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:19:45.411 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:19:45.412 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:19:45.422 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:19:45.435 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:19:45.435 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:19:45.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:19:45.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:19:45.437 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:19:45.437 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:19:45.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:19:45.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:19:45.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:19:45.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:19:45.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:19:45.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:19:45.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:19:45.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:19:45.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:19:45.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:19:45.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:19:45.793 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:19:45.863 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:19:27
2026-06-03T16:19:45.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86482, datetime.datetime(2026, 6, 3, 16, 19, 27), datetime.datetime(2026, 6, 3, 16, 19, 27), 'salt', 6.87, 100.04, None, 42.27, 113.82, -0.01, 820.4, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:19:45.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:19:45.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:19:45.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:19:27, diff=18.87092s, valid=True
2026-06-03T16:19:45.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:19:45.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:19:45.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:19:12, diff=33.874428s, valid=True
2026-06-03T16:19:45.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:19:45.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:19:45.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:19:24, diff=21.882613s, valid=True
2026-06-03T16:19:45.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:19:45.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:19:45.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:19:45.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:19:45.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:19:45.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:19:45.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:19:12, diff=33.886352s, valid=True
2026-06-03T16:19:45.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:19:45.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:19:45.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:19:45.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70582.887219s, valid=False
2026-06-03T16:19:45.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:19:45.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:19:45.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:19:45.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:19:45.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:19:45.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:19:45.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:19:45.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:19:45.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:19:46.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:19:46.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:19:46.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:19:46.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:19:46.207 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:19:46.412 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:19:46.786 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:19:46.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:19:46.888 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:19:46.888 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:19:46.961 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:19:46.962 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:20:16.963 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:20:16.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:20:16.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:20:17.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:20:17.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:20:17.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:20:17.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:20:17.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:20:17.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:20:17.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:20:17.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:20:17.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:20:17.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:20:20.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:20:20.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:20:20.346 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:20:20.346 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:20:20.357 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:20:20.370 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:20:20.371 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:20:20.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:20:20.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:20:20.372 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:20:20.372 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:20:20.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:20:20.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:20:20.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:20:20.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:20:20.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:20:20.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:20:20.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:20:20.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:20:20.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:20:20.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:20:20.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:20:20.715 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:20:20.787 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:19:58
2026-06-03T16:20:20.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86483, datetime.datetime(2026, 6, 3, 16, 19, 58), datetime.datetime(2026, 6, 3, 16, 19, 57), 'salt', 6.87, 100.07, None, 40.61, 112.78, -0.02, 820.46, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:20:20.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:20:20.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:20:20.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:19:57, diff=23.795362s, valid=True
2026-06-03T16:20:20.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:20:20.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:20:20.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:20:12, diff=8.798903s, valid=True
2026-06-03T16:20:20.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:20:20.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:20:20.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:19:55, diff=25.807093s, valid=True
2026-06-03T16:20:20.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:20:20.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:20:20.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:20:20.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:20:20.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:20:20.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:20:20.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:20:12, diff=8.810843s, valid=True
2026-06-03T16:20:20.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:20:20.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:20:20.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:20:20.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70617.81165s, valid=False
2026-06-03T16:20:20.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:20:20.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:20:20.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:20:20.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:20:20.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:20:20.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:20:20.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:20:20.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:20:20.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:20:20.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:20:21.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:20:21.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:20:21.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:20:21.130 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:20:21.336 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:20:21.677 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:20:21.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:20:21.779 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:20:21.779 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:20:22.005 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:20:22.005 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:20:52.011 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:20:52.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:20:52.012 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:20:52.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:20:52.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:20:52.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:20:52.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:20:52.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:20:52.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:20:52.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:20:52.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:20:52.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:20:52.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:20:55.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:20:55.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:20:55.305 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:20:55.305 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:20:55.316 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:20:55.328 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:20:55.329 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:20:55.329 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:20:55.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:20:55.330 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:20:55.330 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:20:55.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:20:55.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:20:55.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:20:55.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:20:55.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:20:55.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T16:20:55.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:20:55.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T16:20:55.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:20:55.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:20:55.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:20:55.691 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:20:55.777 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:20:28
2026-06-03T16:20:55.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86484, datetime.datetime(2026, 6, 3, 16, 20, 28), datetime.datetime(2026, 6, 3, 16, 20, 27), 'salt', 6.94, 100.04, None, 40.54, 117.36, -0.01, 820.77, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:20:55.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:20:55.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:20:55.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:20:27, diff=28.78456s, valid=True
2026-06-03T16:20:55.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:20:55.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T16:20:55.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:20:12, diff=43.78809s, valid=True
2026-06-03T16:20:55.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:20:55.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:20:55.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:20:25, diff=30.796348s, valid=True
2026-06-03T16:20:55.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:20:55.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:20:55.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:20:55.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:20:55.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:20:55.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T16:20:55.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:20:12, diff=43.800081s, valid=True
2026-06-03T16:20:55.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:20:55.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:20:55.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:20:55.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70652.800924s, valid=False
2026-06-03T16:20:55.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:20:55.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:20:55.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:20:55.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:20:55.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:20:55.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:20:55.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:20:55.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:20:55.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:20:55.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:20:55.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:20:56.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:20:56.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:20:56.121 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:20:56.386 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:20:56.727 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:20:56.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:20:56.830 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:20:56.830 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:20:57.002 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:20:57.002 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:21:27.006 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:21:27.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:21:27.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:21:27.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:21:27.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:21:27.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:21:27.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:21:27.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:21:27.444 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:21:27.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:21:27.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:21:27.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:21:27.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:21:30.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:21:30.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:21:30.242 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:21:30.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:21:30.251 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:21:30.265 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:21:30.266 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:21:30.266 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:21:30.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:21:30.267 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:21:30.267 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:21:30.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:21:30.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:21:30.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:21:30.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:21:30.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:21:30.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:21:30.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:21:30.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:21:30.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:21:30.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:21:30.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:21:30.605 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:21:30.674 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:21:29
2026-06-03T16:21:30.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86486, datetime.datetime(2026, 6, 3, 16, 21, 29), datetime.datetime(2026, 6, 3, 16, 21, 28), 'salt', 6.77, 99.91, None, 39.87, 119.31, 0.0, 820.77, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:21:30.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:21:30.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:21:30.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:21:28, diff=2.681755s, valid=True
2026-06-03T16:21:30.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:21:30.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:21:30.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:21:12, diff=18.685246s, valid=True
2026-06-03T16:21:30.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:21:30.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:21:30.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:21:26, diff=4.693394s, valid=True
2026-06-03T16:21:30.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:21:30.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:21:30.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:21:30.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:21:30.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:21:30.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:21:30.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:21:12, diff=18.697117s, valid=True
2026-06-03T16:21:30.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:21:30.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:21:30.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:21:30.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70687.697928s, valid=False
2026-06-03T16:21:30.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:21:30.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:21:30.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:21:30.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:21:30.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:21:30.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:21:30.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:21:30.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:21:30.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:21:30.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:21:30.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:21:30.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:21:30.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:21:31.022 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:21:31.229 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:21:31.571 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:21:31.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:21:31.692 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:21:31.692 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:21:31.899 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:21:31.899 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:22:01.926 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:22:01.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:22:01.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:22:02.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:22:02.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:22:02.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:22:02.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:22:02.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:22:02.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:22:02.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:22:02.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:22:02.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:22:02.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:22:04.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:22:04.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:22:04.859 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:22:04.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:22:04.869 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:22:04.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:22:04.883 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:22:04.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:22:04.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:22:04.884 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:22:04.884 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:22:04.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:22:05.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:22:05.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:22:05.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:22:05.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:22:05.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:22:05.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:22:05.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:22:05.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:22:05.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:22:05.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:22:05.218 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:22:05.289 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:22:00
2026-06-03T16:22:05.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86487, datetime.datetime(2026, 6, 3, 16, 22), datetime.datetime(2026, 6, 3, 16, 21, 58), 'salt', 6.81, 100.07, None, 40.26, 115.95, -0.01, 820.65, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:22:05.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:22:05.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:22:05.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:21:58, diff=7.296849s, valid=True
2026-06-03T16:22:05.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:22:05.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:22:05.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:22:12, diff=-6.699508s, valid=True
2026-06-03T16:22:05.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:22:05.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:22:05.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:21:57, diff=8.308553s, valid=True
2026-06-03T16:22:05.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:22:05.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:22:05.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:22:05.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:22:05.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:22:05.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:22:05.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:22:12, diff=-6.687639s, valid=True
2026-06-03T16:22:05.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:22:05.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:22:05.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:22:05.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70722.313177s, valid=False
2026-06-03T16:22:05.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:22:05.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:22:05.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:22:05.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:22:05.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:22:05.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:22:05.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:22:05.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:22:05.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:22:05.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:22:05.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:22:05.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:22:05.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:22:05.713 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:22:05.918 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:22:06.258 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:22:06.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:22:06.359 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:22:06.359 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:22:06.539 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:22:06.539 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:22:36.559 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:22:36.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:22:36.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:22:36.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:22:36.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:22:37.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:22:37.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:22:37.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:22:37.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:22:37.117 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:22:37.117 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:22:37.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:22:37.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:22:39.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:22:39.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:22:39.930 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:22:39.930 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:22:39.938 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:22:39.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:22:39.950 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:22:39.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:22:39.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:22:39.951 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:22:39.951 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:22:39.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:22:40.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:22:40.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:22:40.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:22:40.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:22:40.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:22:40.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:22:40.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:22:40.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:22:40.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:22:40.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:22:40.235 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:22:40.305 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:22:30
2026-06-03T16:22:40.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86488, datetime.datetime(2026, 6, 3, 16, 22, 30), datetime.datetime(2026, 6, 3, 16, 22, 29), 'salt', 6.84, 99.94, None, 30.66, 116.31, 0.0, 820.65, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:22:40.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:22:40.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:22:40.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:22:29, diff=11.312039s, valid=True
2026-06-03T16:22:40.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:22:40.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:22:40.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:22:12, diff=28.315053s, valid=True
2026-06-03T16:22:40.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:22:40.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:22:40.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:22:28, diff=12.322097s, valid=True
2026-06-03T16:22:40.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:22:40.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:22:40.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:22:40.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:22:40.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:22:40.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:22:40.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:22:12, diff=28.3253s, valid=True
2026-06-03T16:22:40.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:22:40.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:22:40.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:22:40.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70757.32599s, valid=False
2026-06-03T16:22:40.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:22:40.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:22:40.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:22:40.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:22:40.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:22:40.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:22:40.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:22:40.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:22:40.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:22:40.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:22:40.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:22:40.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:22:40.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:22:40.642 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:22:40.885 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:22:41.223 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:22:41.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:22:41.327 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:22:41.327 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:22:41.506 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:22:41.506 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:23:11.530 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:23:11.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:23:11.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:23:11.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:23:11.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:23:11.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:23:11.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:23:11.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:23:11.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:23:11.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:23:11.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:23:11.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:23:11.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:23:14.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:23:14.644 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:23:14.645 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:23:14.645 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:23:14.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:23:14.669 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:23:14.669 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:23:14.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:23:14.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:23:14.670 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:23:14.671 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:23:14.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:23:14.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:23:14.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:23:14.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:23:14.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:23:14.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:23:14.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:23:15.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:23:15.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:23:15.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:23:15.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:23:15.006 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:23:15.077 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:23:00
2026-06-03T16:23:15.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86489, datetime.datetime(2026, 6, 3, 16, 23), datetime.datetime(2026, 6, 3, 16, 22, 59), 'salt', 6.91, 100.11, None, 37.08, 116.38, -0.02, 820.83, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:23:15.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:23:15.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:23:15.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:22:59, diff=16.085282s, valid=True
2026-06-03T16:23:15.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:23:15.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:23:15.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:23:12, diff=3.088799s, valid=True
2026-06-03T16:23:15.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:23:15.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:23:15.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:23:00, diff=15.096867s, valid=True
2026-06-03T16:23:15.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:23:15.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:23:15.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:23:15.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:23:15.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:23:15.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:23:15.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:23:12, diff=3.100474s, valid=True
2026-06-03T16:23:15.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:23:15.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:23:15.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:23:15.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70792.101262s, valid=False
2026-06-03T16:23:15.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:23:15.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:23:15.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:23:15.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:23:15.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:23:15.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:23:15.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:23:15.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:23:15.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:23:15.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:23:15.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:23:15.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:23:15.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:23:15.488 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:23:15.698 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:23:16.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:23:16.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:23:16.149 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:23:16.149 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:23:16.332 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:23:16.333 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:23:46.357 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:23:46.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:23:46.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:23:46.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:23:46.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:23:47.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:23:47.230 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:23:47.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:23:47.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:23:47.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:23:47.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:23:47.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:23:47.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:23:49.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:23:49.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:23:49.903 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:23:49.903 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:23:49.909 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:23:49.918 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:23:49.918 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:23:49.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:23:49.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:23:49.919 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:23:49.919 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:23:49.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:23:50.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:23:50.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:23:50.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:23:50.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:23:50.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:23:50.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:23:50.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:23:50.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:23:50.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:23:50.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:23:50.200 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:23:50.299 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:23:30
2026-06-03T16:23:50.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86490, datetime.datetime(2026, 6, 3, 16, 23, 30), datetime.datetime(2026, 6, 3, 16, 23, 29), 'salt', 6.87, 100.01, None, 37.65, 117.5, -0.01, 820.71, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:23:50.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:23:50.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:23:50.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:23:29, diff=21.305913s, valid=True
2026-06-03T16:23:50.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:23:50.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:23:50.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:23:12, diff=38.309128s, valid=True
2026-06-03T16:23:50.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:23:50.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:23:50.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:23:26, diff=24.316567s, valid=True
2026-06-03T16:23:50.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:23:50.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:23:50.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:23:50.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:23:50.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:23:50.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:23:50.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:23:12, diff=38.319968s, valid=True
2026-06-03T16:23:50.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:23:50.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:23:50.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:23:50.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70827.320711s, valid=False
2026-06-03T16:23:50.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:23:50.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:23:50.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:23:50.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:23:50.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:23:50.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:23:50.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:23:50.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:23:50.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:23:50.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:23:50.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:23:50.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:23:50.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:23:50.637 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:23:50.843 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:23:51.185 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:23:51.287 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:23:51.287 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:23:51.287 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:23:51.443 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:23:51.443 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:24:21.470 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:24:21.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:24:21.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:24:21.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:24:21.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:24:22.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:24:22.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:24:22.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:24:22.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:24:22.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:24:22.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:24:22.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:24:22.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:24:24.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:24:24.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:24:24.990 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:24:24.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:24:25.002 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:24:25.014 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:24:25.015 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:24:25.015 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:24:25.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:24:25.016 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:24:25.016 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:24:25.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:24:25.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:24:25.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:24:25.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:24:25.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:24:25.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:24:25.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:24:25.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:24:25.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:24:25.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:24:25.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:24:25.379 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:24:25.450 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:24:00
2026-06-03T16:24:25.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86491, datetime.datetime(2026, 6, 3, 16, 24), datetime.datetime(2026, 6, 3, 16, 24), 'salt', 6.81, 99.94, None, 34.68, 124.19, 0.01, 820.71, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:24:25.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:24:25.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:24:25.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:24:00, diff=25.458526s, valid=True
2026-06-03T16:24:25.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:24:25.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:24:25.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:24:12, diff=13.462154s, valid=True
2026-06-03T16:24:25.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:24:25.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:24:25.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:23:56, diff=29.470676s, valid=True
2026-06-03T16:24:25.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:24:25.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:24:25.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:24:25.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:24:25.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:24:25.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:24:25.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:24:12, diff=13.4746s, valid=True
2026-06-03T16:24:25.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:24:25.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:24:25.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:24:25.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70862.475439s, valid=False
2026-06-03T16:24:25.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:24:25.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:24:25.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:24:25.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:24:25.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:24:25.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:24:25.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:24:25.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:24:25.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:24:25.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:24:25.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:24:25.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:24:25.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:24:25.863 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:24:26.068 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:24:26.408 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:24:26.510 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:24:26.511 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:24:26.511 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:24:26.676 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:24:26.676 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:24:56.690 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:24:56.690 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:24:56.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:24:57.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:24:57.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:24:57.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:24:57.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:24:57.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:24:57.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:24:57.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:24:57.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:24:57.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:24:57.525 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:25:00.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:25:00.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:25:00.196 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:25:00.196 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:25:00.204 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:25:00.218 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:25:00.218 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:25:00.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:25:00.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:25:00.219 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:25:00.219 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:25:00.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:25:00.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:25:00.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:25:00.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:25:00.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:25:00.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T16:25:00.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:25:00.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T16:25:00.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:25:00.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:25:00.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:25:00.513 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:25:00.584 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:24:31
2026-06-03T16:25:00.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86492, datetime.datetime(2026, 6, 3, 16, 24, 31), datetime.datetime(2026, 6, 3, 16, 24, 30), 'salt', 6.97, 100.07, None, 27.31, 117.1, -0.02, 820.77, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:25:00.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:25:00.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:25:00.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:24:30, diff=30.591726s, valid=True
2026-06-03T16:25:00.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:25:00.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T16:25:00.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:24:12, diff=48.59509s, valid=True
2026-06-03T16:25:00.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:25:00.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:25:00.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:24:27, diff=33.602951s, valid=True
2026-06-03T16:25:00.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:25:00.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:25:00.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:25:00.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:25:00.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:25:00.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T16:25:00.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:24:12, diff=48.606564s, valid=True
2026-06-03T16:25:00.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:25:00.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:25:00.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:25:00.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70897.607348s, valid=False
2026-06-03T16:25:00.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:25:00.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:25:00.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:25:00.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:25:00.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:25:00.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:25:00.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:25:00.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:25:00.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:25:00.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:25:00.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:25:00.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:25:00.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:25:00.928 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:25:01.134 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:25:01.505 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:25:01.608 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:25:01.608 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:25:01.608 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:25:01.788 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:25:01.788 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:25:31.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:25:31.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:25:31.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:25:32.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:25:32.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:25:32.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:25:32.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:25:32.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:25:32.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:25:32.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:25:32.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:25:32.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:25:32.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:25:35.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:25:35.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:25:35.329 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:25:35.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:25:35.339 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:25:35.352 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:25:35.352 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:25:35.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:25:35.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:25:35.354 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:25:35.354 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:25:35.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:25:35.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:25:35.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:25:35.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:25:35.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:25:35.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:25:35.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:25:35.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T16:25:35.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:25:35.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:25:35.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:25:35.662 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:25:35.731 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:25:31
2026-06-03T16:25:35.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86494, datetime.datetime(2026, 6, 3, 16, 25, 31), datetime.datetime(2026, 6, 3, 16, 25, 30), 'salt', 6.94, 100.04, None, 37.58, 127.01, -0.01, 820.89, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:25:35.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:25:35.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:25:35.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:25:30, diff=5.738566s, valid=True
2026-06-03T16:25:35.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:25:35.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:25:35.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:25:12, diff=23.741932s, valid=True
2026-06-03T16:25:35.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:25:35.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:25:35.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:25:27, diff=8.749837s, valid=True
2026-06-03T16:25:35.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:25:35.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:25:35.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:25:35.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:25:35.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:25:35.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T16:25:35.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:25:12, diff=23.75341s, valid=True
2026-06-03T16:25:35.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:25:35.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:25:35.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:25:35.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70932.75419s, valid=False
2026-06-03T16:25:35.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:25:35.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:25:35.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:25:35.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:25:35.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:25:35.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:25:35.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:25:35.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:25:35.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:25:35.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:25:35.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:25:35.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:25:36.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:25:36.073 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:25:36.279 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:25:36.620 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:25:36.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:25:36.723 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:25:36.723 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:25:36.903 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:25:36.903 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:26:06.933 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:26:06.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:26:06.933 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:26:07.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:26:07.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:26:07.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:26:07.458 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:26:07.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:26:07.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:26:07.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:26:07.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:26:07.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:26:07.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:26:10.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:26:10.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:26:10.139 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:26:10.139 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:26:10.149 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:26:10.161 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:26:10.162 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:26:10.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:26:10.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:26:10.162 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:26:10.162 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:26:10.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:26:10.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:26:10.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:26:10.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:26:10.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:26:10.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T16:26:10.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:26:10.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T16:26:10.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:26:10.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:26:10.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:26:10.514 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:26:10.634 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:26:02
2026-06-03T16:26:10.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86495, datetime.datetime(2026, 6, 3, 16, 26, 2), datetime.datetime(2026, 6, 3, 16, 26, 1), 'salt', 6.87, 100.04, None, 35.25, 117.88, -0.01, 820.71, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:26:10.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:26:10.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:26:10.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:26:01, diff=9.641482s, valid=True
2026-06-03T16:26:10.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:26:10.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T16:26:10.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:25:12, diff=58.644782s, valid=True
2026-06-03T16:26:10.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:26:10.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:26:10.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:25:59, diff=11.652428s, valid=True
2026-06-03T16:26:10.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:26:10.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:26:10.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:26:10.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:26:10.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:26:10.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T16:26:10.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:25:12, diff=58.65595s, valid=True
2026-06-03T16:26:10.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:26:10.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:26:10.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:26:10.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=70967.656707s, valid=False
2026-06-03T16:26:10.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:26:10.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:26:10.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:26:10.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:26:10.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:26:10.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:26:10.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:26:10.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:26:10.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:26:10.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:26:10.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:26:10.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:26:10.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:26:10.980 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:26:11.213 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:26:11.630 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:26:11.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:26:11.733 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:26:11.733 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:26:11.967 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:26:11.967 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:26:41.985 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:26:41.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:26:41.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:26:42.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:26:42.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:26:42.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:26:42.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:26:42.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:26:42.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:26:42.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:26:42.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:26:42.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:26:42.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:26:45.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:26:45.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:26:45.287 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:26:45.288 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:26:45.298 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:26:45.310 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:26:45.311 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:26:45.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:26:45.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:26:45.312 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:26:45.312 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:26:45.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:26:45.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:26:45.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:26:45.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:26:45.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:26:45.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T16:26:45.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:26:45.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T16:26:45.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:26:45.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:26:45.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:26:45.662 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:26:45.735 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:26:32
2026-06-03T16:26:45.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86496, datetime.datetime(2026, 6, 3, 16, 26, 32), datetime.datetime(2026, 6, 3, 16, 26, 31), 'salt', 6.87, 100.07, None, 29.92, 114.05, -0.02, 820.95, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:26:45.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:26:45.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:26:45.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:26:31, diff=14.742802s, valid=True
2026-06-03T16:26:45.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:26:45.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T16:26:45.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:25:12, diff=93.746423s, valid=True
2026-06-03T16:26:45.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:26:45.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:26:45.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:26:30, diff=15.754865s, valid=True
2026-06-03T16:26:45.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:26:45.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:26:45.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:26:45.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:26:45.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:26:45.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T16:26:45.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:25:12, diff=93.758712s, valid=True
2026-06-03T16:26:45.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:26:45.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:26:45.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:26:45.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71002.759536s, valid=False
2026-06-03T16:26:45.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:26:45.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:26:45.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:26:45.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:26:45.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:26:45.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:26:45.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:26:45.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:26:45.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:26:45.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:26:45.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:26:45.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:26:46.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:26:46.080 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:26:46.286 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:26:46.627 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:26:46.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:26:46.730 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:26:46.730 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:26:46.931 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:26:46.931 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:27:16.959 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:27:16.959 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:27:16.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:27:17.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:27:17.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:27:17.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:27:17.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:27:17.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:27:17.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:27:17.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:27:17.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:27:17.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:27:17.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:27:20.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:27:20.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:27:20.242 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:27:20.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:27:20.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:27:20.266 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:27:20.267 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:27:20.267 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:27:20.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:27:20.268 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:27:20.268 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:27:20.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:27:20.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:27:20.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:27:20.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:27:20.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:27:20.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:27:20.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:27:20.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:27:20.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:27:20.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:27:20.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:27:20.601 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:27:20.673 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:27:03
2026-06-03T16:27:20.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86497, datetime.datetime(2026, 6, 3, 16, 27, 3), datetime.datetime(2026, 6, 3, 16, 27, 2), 'salt', 6.81, 100.04, None, 40.43, 124.03, -0.01, 820.83, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:27:20.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:27:20.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:27:20.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:27:02, diff=18.680333s, valid=True
2026-06-03T16:27:20.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:27:20.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:27:20.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:25:12, diff=128.683802s, valid=True
2026-06-03T16:27:20.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:27:20.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:27:20.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:27:02, diff=18.691929s, valid=True
2026-06-03T16:27:20.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:27:20.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:27:20.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:27:20.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:27:20.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:27:20.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:27:20.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:25:12, diff=128.695646s, valid=True
2026-06-03T16:27:20.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:27:20.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:27:20.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:27:20.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71037.696474s, valid=False
2026-06-03T16:27:20.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:27:20.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:27:20.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:27:20.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:27:20.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:27:20.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:27:20.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:27:20.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:27:20.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:27:20.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:27:20.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:27:20.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:27:20.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:27:21.014 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:27:21.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:27:21.629 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:27:21.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:27:21.732 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:27:21.732 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:27:21.804 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:27:21.804 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:27:51.815 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:27:51.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:27:51.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:27:52.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:27:52.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:27:52.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:27:52.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:27:52.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:27:52.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:27:52.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:27:52.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:27:52.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:27:52.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:27:55.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:27:55.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:27:55.314 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:27:55.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:27:55.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:27:55.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:27:55.337 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:27:55.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:27:55.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:27:55.339 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:27:55.339 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:27:55.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:27:55.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:27:55.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:27:55.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:27:55.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:27:55.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:27:55.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:27:55.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:27:55.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:27:55.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:27:55.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:27:55.652 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:27:55.726 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:27:33
2026-06-03T16:27:55.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86498, datetime.datetime(2026, 6, 3, 16, 27, 33), datetime.datetime(2026, 6, 3, 16, 27, 33), 'salt', 6.67, 99.94, None, 34.12, 118.91, 0.0, 820.83, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:27:55.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:27:55.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:27:55.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:27:33, diff=22.732536s, valid=True
2026-06-03T16:27:55.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:27:55.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:27:55.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:25:12, diff=163.735492s, valid=True
2026-06-03T16:27:55.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:27:55.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:27:55.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:27:33, diff=22.742481s, valid=True
2026-06-03T16:27:55.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:27:55.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:27:55.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:27:55.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:27:55.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:27:55.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:27:55.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:25:12, diff=163.745728s, valid=True
2026-06-03T16:27:55.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:27:55.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:27:55.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:27:55.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71072.746428s, valid=False
2026-06-03T16:27:55.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:27:55.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:27:55.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:27:55.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:27:55.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:27:55.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:27:55.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:27:55.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:27:55.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:27:55.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:27:55.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:27:55.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:27:56.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:27:56.064 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:27:56.269 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:27:56.609 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:27:56.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:27:56.716 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:27:56.716 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:27:56.797 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:27:56.797 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:28:26.800 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:28:26.801 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:28:26.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:28:26.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:28:26.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:28:27.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:28:27.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:28:27.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:28:27.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:28:27.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:28:27.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:28:27.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:28:27.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:28:29.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:28:29.916 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:28:29.916 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:28:29.916 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:28:29.925 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:28:29.937 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:28:29.937 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:28:29.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:28:29.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:28:29.937 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:28:29.938 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:28:29.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:28:30.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:28:30.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:28:30.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:28:30.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:28:30.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:28:30.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:28:30.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:28:30.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:28:30.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:28:30.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:28:30.224 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:28:30.295 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:28:04
2026-06-03T16:28:30.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86499, datetime.datetime(2026, 6, 3, 16, 28, 4), datetime.datetime(2026, 6, 3, 16, 28, 3), 'salt', 6.77, 100.04, None, 40.22, 118.49, -0.01, 820.95, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:28:30.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:28:30.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:28:30.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:28:03, diff=27.302323s, valid=True
2026-06-03T16:28:30.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:28:30.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:28:30.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:25:12, diff=198.305522s, valid=True
2026-06-03T16:28:30.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:28:30.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:28:30.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:27:58, diff=32.312964s, valid=True
2026-06-03T16:28:30.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:28:30.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:28:30.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:28:30.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:28:30.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:28:30.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:28:30.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:25:12, diff=198.316371s, valid=True
2026-06-03T16:28:30.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:28:30.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:28:30.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:28:30.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71107.317121s, valid=False
2026-06-03T16:28:30.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:28:30.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:28:30.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:28:30.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:28:30.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:28:30.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:28:30.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:28:30.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:28:30.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:28:30.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:28:30.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:28:30.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:28:30.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:28:30.706 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:28:30.910 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:28:31.252 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:28:31.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:28:31.354 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:28:31.354 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:28:31.571 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:28:31.572 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:29:01.598 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:29:01.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:29:01.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:29:02.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:29:02.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:29:02.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:29:02.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:29:02.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:29:02.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:29:02.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:29:02.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:29:02.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:29:02.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:29:05.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:29:05.015 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:29:05.016 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:29:05.019 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:29:05.030 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:29:05.043 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:29:05.043 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:29:05.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:29:05.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:29:05.044 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:29:05.045 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:29:05.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:29:05.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:29:05.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:29:05.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:29:05.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:29:05.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:29:05.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:29:05.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:29:05.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:29:05.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:29:05.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:29:05.378 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:29:05.452 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:29:04
2026-06-03T16:29:05.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86501, datetime.datetime(2026, 6, 3, 16, 29, 4), datetime.datetime(2026, 6, 3, 16, 29, 4), 'salt', 6.77, 100.07, None, 42.23, 123.44, -0.02, 820.89, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:29:05.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:29:05.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:29:05.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:29:04, diff=1.459542s, valid=True
2026-06-03T16:29:05.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:29:05.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:29:05.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:29:12, diff=-6.537346s, valid=True
2026-06-03T16:29:05.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:29:05.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:29:05.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:28:59, diff=6.469523s, valid=True
2026-06-03T16:29:05.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:29:05.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:29:05.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:29:05.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:29:05.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:29:05.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:29:05.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:29:12, diff=-6.527437s, valid=True
2026-06-03T16:29:05.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:29:05.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:29:05.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:29:05.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71142.473222s, valid=False
2026-06-03T16:29:05.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:29:05.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:29:05.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:29:05.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:29:05.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:29:05.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:29:05.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:29:05.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:29:05.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:29:05.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:29:05.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:29:05.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:29:05.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:29:05.789 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:29:05.993 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:29:06.329 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:29:06.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:29:06.433 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:29:06.433 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:29:06.821 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:29:06.822 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:29:36.845 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:29:36.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:29:36.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:29:36.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:29:36.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:29:37.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:29:37.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:29:37.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:29:37.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:29:37.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:29:37.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:29:37.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:29:37.244 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:29:39.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:29:39.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:29:39.918 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:29:39.918 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:29:39.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:29:39.938 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:29:39.938 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:29:39.939 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:29:39.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:29:39.939 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:29:39.939 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:29:39.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:29:40.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:29:40.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:29:40.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:29:40.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:29:40.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:29:40.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:29:40.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:29:40.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:29:40.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:29:40.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:29:40.232 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:29:40.301 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:29:35
2026-06-03T16:29:40.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86502, datetime.datetime(2026, 6, 3, 16, 29, 35), datetime.datetime(2026, 6, 3, 16, 29, 34), 'salt', 6.71, 100.01, None, 38.07, 122.69, 0.0, 820.83, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:29:40.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:29:40.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:29:40.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:29:34, diff=6.307861s, valid=True
2026-06-03T16:29:40.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:29:40.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:29:40.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:30:12, diff=-31.689086s, valid=True
2026-06-03T16:29:40.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:29:40.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:29:40.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:29:29, diff=11.317907s, valid=True
2026-06-03T16:29:40.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:29:40.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:29:40.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:29:40.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:29:40.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:29:40.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:29:40.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:30:12, diff=-31.678897s, valid=True
2026-06-03T16:29:40.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:29:40.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:29:40.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:29:40.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71177.321804s, valid=False
2026-06-03T16:29:40.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:29:40.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:29:40.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:29:40.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:29:40.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:29:40.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:29:40.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:29:40.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:29:40.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:29:40.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:29:40.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:29:40.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:29:40.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:29:40.711 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:29:40.920 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:29:41.266 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:29:41.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:29:41.370 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:29:41.370 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:29:41.454 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:29:41.454 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:30:11.478 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:30:11.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:30:11.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:30:11.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:30:11.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:30:11.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:30:11.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:30:11.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:30:11.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:30:11.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:30:11.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:30:11.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:30:11.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:30:14.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:30:14.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:30:14.548 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:30:14.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:30:14.558 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:30:14.570 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:30:14.570 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:30:14.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:30:14.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:30:14.571 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:30:14.571 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:30:14.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:30:14.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:30:14.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:30:14.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:30:14.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:30:14.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:30:14.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:30:14.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:30:14.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:30:14.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:30:14.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:30:14.922 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:30:14.995 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:30:05
2026-06-03T16:30:14.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86503, datetime.datetime(2026, 6, 3, 16, 30, 5), datetime.datetime(2026, 6, 3, 16, 30, 4), 'salt', 6.67, 100.01, None, 41.07, 120.34, -0.01, 820.95, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:30:14.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:30:14.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:30:15.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:30:04, diff=11.003636s, valid=True
2026-06-03T16:30:15.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:30:15.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:30:15.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:30:12, diff=3.007266s, valid=True
2026-06-03T16:30:15.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:30:15.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:30:15.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:30:00, diff=15.015798s, valid=True
2026-06-03T16:30:15.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:30:15.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:30:15.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:30:15.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:30:15.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:30:15.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:30:15.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:30:12, diff=3.019645s, valid=True
2026-06-03T16:30:15.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:30:15.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:30:15.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:30:15.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71212.020494s, valid=False
2026-06-03T16:30:15.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:30:15.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:30:15.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:30:15.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:30:15.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:30:15.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:30:15.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:30:15.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:30:15.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:30:15.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:30:15.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:30:15.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:30:15.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:30:15.343 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:30:15.552 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:30:15.894 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:30:15.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:30:15.997 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:30:15.997 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:30:16.178 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:30:16.178 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:30:46.189 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:30:46.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:30:46.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:30:46.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:30:46.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:30:46.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:30:46.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:30:46.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:30:46.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:30:46.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:30:46.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:30:46.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:30:46.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:30:49.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:30:49.584 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:30:49.585 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:30:49.585 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:30:49.597 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:30:49.609 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:30:49.610 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:30:49.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:30:49.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:30:49.611 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:30:49.612 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:30:49.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:30:49.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:30:49.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:30:49.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:30:49.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:30:49.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:30:49.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:30:49.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:30:49.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:30:49.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:30:49.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:30:49.956 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:30:50.027 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:30:35
2026-06-03T16:30:50.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86504, datetime.datetime(2026, 6, 3, 16, 30, 35), datetime.datetime(2026, 6, 3, 16, 30, 34), 'salt', 6.74, 99.98, None, 38.18, 124.17, 0.0, 820.89, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:30:50.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:30:50.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:30:50.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:30:34, diff=16.034372s, valid=True
2026-06-03T16:30:50.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:30:50.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:30:50.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:31:12, diff=-21.959771s, valid=True
2026-06-03T16:30:50.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:30:50.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:30:50.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:30:32, diff=18.054548s, valid=True
2026-06-03T16:30:50.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:30:50.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:30:50.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:30:50.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:30:50.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:30:50.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:30:50.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:31:12, diff=-21.942325s, valid=True
2026-06-03T16:30:50.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:30:50.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:30:50.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:30:50.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71247.058352s, valid=False
2026-06-03T16:30:50.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:30:50.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:30:50.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:30:50.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:30:50.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:30:50.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:30:50.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:30:50.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:30:50.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:30:50.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:30:50.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:30:50.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:30:50.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:30:50.456 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:30:50.662 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:30:51.001 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:30:51.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:30:51.103 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:30:51.103 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:30:51.259 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:30:51.260 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:31:21.285 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:31:21.285 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:31:21.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:31:21.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:31:21.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:31:22.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:31:22.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:31:22.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:31:22.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:31:22.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:31:22.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:31:22.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:31:22.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:31:24.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:31:24.806 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:31:24.807 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:31:24.807 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:31:24.818 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:31:24.830 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:31:24.831 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:31:24.831 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:31:24.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:31:24.832 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:31:24.832 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:31:24.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:31:24.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:31:24.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:31:25.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:31:25.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:31:25.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:31:25.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:31:25.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:31:25.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:31:25.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:31:25.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:31:25.168 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:31:25.240 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:31:05
2026-06-03T16:31:25.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86505, datetime.datetime(2026, 6, 3, 16, 31, 5), datetime.datetime(2026, 6, 3, 16, 31, 5), 'salt', 6.77, 100.07, None, 35.14, 124.22, -0.02, 820.95, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:31:25.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:31:25.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:31:25.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:31:05, diff=20.247506s, valid=True
2026-06-03T16:31:25.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:31:25.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:31:25.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:31:12, diff=13.251018s, valid=True
2026-06-03T16:31:25.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:31:25.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:31:25.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:31:03, diff=22.260984s, valid=True
2026-06-03T16:31:25.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:31:25.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:31:25.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:31:25.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:31:25.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:31:25.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:31:25.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:31:12, diff=13.264724s, valid=True
2026-06-03T16:31:25.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:31:25.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:31:25.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:31:25.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71282.265533s, valid=False
2026-06-03T16:31:25.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:31:25.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:31:25.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:31:25.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:31:25.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:31:25.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:31:25.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:31:25.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:31:25.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:31:25.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:31:25.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:31:25.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:31:25.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:31:25.587 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:31:25.795 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:31:26.136 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:31:26.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:31:26.239 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:31:26.239 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:31:26.402 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:31:26.403 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:31:56.432 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:31:56.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:31:56.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:31:56.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:31:56.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:31:57.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:31:57.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:31:57.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:31:57.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:31:57.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:31:57.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:31:57.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:31:57.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:31:59.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:31:59.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:31:59.930 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:31:59.930 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:31:59.940 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:31:59.952 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:31:59.953 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:31:59.953 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:31:59.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:31:59.953 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:31:59.953 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:31:59.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:32:00.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:32:00.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:32:00.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:32:00.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:32:00.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:32:00.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:32:00.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:32:00.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:32:00.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:32:00.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:32:00.228 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:32:00.299 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:31:36
2026-06-03T16:32:00.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86506, datetime.datetime(2026, 6, 3, 16, 31, 36), datetime.datetime(2026, 6, 3, 16, 31, 35), 'salt', 6.74, 100.07, None, 31.54, 110.53, -0.02, 821.26, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:32:00.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:32:00.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:32:00.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:31:35, diff=25.305965s, valid=True
2026-06-03T16:32:00.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:32:00.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:32:00.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:32:12, diff=-11.690913s, valid=True
2026-06-03T16:32:00.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:32:00.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:32:00.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:31:34, diff=26.316551s, valid=True
2026-06-03T16:32:00.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:32:00.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:32:00.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:32:00.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:32:00.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:32:00.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:32:00.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:32:12, diff=-11.680095s, valid=True
2026-06-03T16:32:00.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:32:00.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:32:00.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:32:00.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71317.320643s, valid=False
2026-06-03T16:32:00.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:32:00.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:32:00.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:32:00.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:32:00.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:32:00.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:32:00.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:32:00.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:32:00.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:32:00.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:32:00.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:32:00.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:32:00.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:32:00.637 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:32:00.841 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:32:01.186 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:32:01.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:32:01.288 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:32:01.288 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:32:01.461 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:32:01.462 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:32:31.484 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:32:31.484 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:32:31.485 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:32:31.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:32:31.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:32:31.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:32:31.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:32:31.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:32:31.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:32:31.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:32:31.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:32:31.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:32:31.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:32:34.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:32:34.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:32:34.585 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:32:34.586 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:32:34.596 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:32:34.608 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:32:34.609 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:32:34.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:32:34.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:32:34.610 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:32:34.611 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:32:34.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:32:34.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:32:34.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:32:34.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:32:34.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:32:34.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:32:34.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:32:34.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:32:34.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:32:34.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:32:34.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:32:34.955 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:32:35.026 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:32:06
2026-06-03T16:32:35.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86507, datetime.datetime(2026, 6, 3, 16, 32, 6), datetime.datetime(2026, 6, 3, 16, 32, 5), 'salt', 6.81, 100.11, None, 38.6, 124.1, -0.02, 821.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:32:35.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:32:35.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:32:35.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:32:05, diff=30.034256s, valid=True
2026-06-03T16:32:35.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:32:35.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:32:35.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:32:12, diff=23.037761s, valid=True
2026-06-03T16:32:35.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:32:35.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:32:35.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:32:00, diff=35.045981s, valid=True
2026-06-03T16:32:35.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:32:35.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:32:35.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:32:35.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:32:35.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:32:35.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:32:35.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:32:12, diff=23.049704s, valid=True
2026-06-03T16:32:35.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:32:35.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:32:35.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:32:35.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71352.050506s, valid=False
2026-06-03T16:32:35.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:32:35.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:32:35.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:32:35.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:32:35.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:32:35.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:32:35.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:32:35.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:32:35.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:32:35.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:32:35.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:32:35.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:32:35.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:32:35.377 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:32:35.650 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:32:35.991 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:32:36.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:32:36.094 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:32:36.094 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:32:36.262 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:32:36.262 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:33:06.263 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:33:06.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:33:06.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:33:06.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:33:06.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:33:06.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:33:06.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:33:06.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:33:06.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:33:06.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:33:06.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:33:06.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:33:06.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:33:09.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:33:09.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:33:09.406 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:33:09.406 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:33:09.416 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:33:09.429 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:33:09.430 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:33:09.430 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:33:09.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:33:09.431 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:33:09.431 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:33:09.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:33:09.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:33:09.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:33:09.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:33:09.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:33:09.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:33:09.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:33:09.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:33:09.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:33:09.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:33:09.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:33:09.760 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:33:09.832 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:33:06
2026-06-03T16:33:09.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86509, datetime.datetime(2026, 6, 3, 16, 33, 6), datetime.datetime(2026, 6, 3, 16, 33, 6), 'salt', 6.81, 100.01, None, 33.2, 118.44, 0.0, 821.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:33:09.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:33:09.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:33:09.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:33:06, diff=3.841177s, valid=True
2026-06-03T16:33:09.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:33:09.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:33:09.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:33:12, diff=-2.153324s, valid=True
2026-06-03T16:33:09.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:33:09.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:33:09.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:33:01, diff=8.857771s, valid=True
2026-06-03T16:33:09.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:33:09.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:33:09.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:33:09.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:33:09.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:33:09.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:33:09.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:33:12, diff=-2.137513s, valid=True
2026-06-03T16:33:09.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:33:09.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:33:09.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:33:09.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71386.86326s, valid=False
2026-06-03T16:33:09.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:33:09.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:33:09.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:33:09.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:33:09.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:33:09.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:33:09.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:33:09.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:33:09.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:33:10.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:33:10.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:33:10.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:33:10.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:33:10.223 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:33:10.431 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:33:10.773 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:33:10.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:33:10.878 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:33:10.878 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:33:10.945 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:33:10.945 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:33:40.963 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:33:40.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:33:40.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:33:41.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:33:41.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:33:41.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:33:41.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:33:41.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:33:41.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:33:41.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:33:41.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:33:41.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:33:41.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:33:44.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:33:44.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:33:44.013 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:33:44.013 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:33:44.023 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:33:44.036 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:33:44.037 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:33:44.037 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:33:44.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:33:44.038 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:33:44.038 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:33:44.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:33:44.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:33:44.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:33:44.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:33:44.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:33:44.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:33:44.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:33:44.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:33:44.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:33:44.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:33:44.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:33:44.383 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:33:44.458 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:33:36
2026-06-03T16:33:44.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86510, datetime.datetime(2026, 6, 3, 16, 33, 36), datetime.datetime(2026, 6, 3, 16, 33, 36), 'salt', 6.81, 100.01, None, 33.2, 118.44, 0.0, 821.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:33:44.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:33:44.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:33:44.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:33:36, diff=8.465481s, valid=True
2026-06-03T16:33:44.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:33:44.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:33:44.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:34:12, diff=-27.531454s, valid=True
2026-06-03T16:33:44.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:33:44.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:33:44.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:33:31, diff=13.475451s, valid=True
2026-06-03T16:33:44.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:33:44.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:33:44.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:33:44.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:33:44.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:33:44.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:33:44.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:34:12, diff=-27.521461s, valid=True
2026-06-03T16:33:44.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:33:44.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:33:44.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:33:44.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71421.479223s, valid=False
2026-06-03T16:33:44.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:33:44.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:33:44.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:33:44.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:33:44.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:33:44.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:33:44.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:33:44.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:33:44.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:33:44.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:33:44.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:33:44.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:33:44.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:33:44.866 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:33:45.071 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:33:45.424 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:33:45.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:33:45.526 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:33:45.526 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:33:45.598 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:33:45.598 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:34:15.628 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:34:15.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:34:15.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:34:15.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:34:15.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:34:16.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:34:16.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:34:16.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:34:16.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:34:16.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:34:16.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:34:16.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:34:16.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:34:18.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:34:18.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:34:18.928 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:34:18.928 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:34:18.937 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:34:18.948 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:34:18.949 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:34:18.949 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:34:18.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:34:18.949 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:34:18.949 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:34:18.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:34:19.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:34:19.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:34:19.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:34:19.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:34:19.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:34:19.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:34:19.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:34:19.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:34:19.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:34:19.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:34:19.249 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:34:19.325 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:34:07
2026-06-03T16:34:19.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86511, datetime.datetime(2026, 6, 3, 16, 34, 7), datetime.datetime(2026, 6, 3, 16, 34, 6), 'salt', 6.81, 100.01, None, 33.2, 118.44, 0.0, 821.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:34:19.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:34:19.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:34:19.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:34:06, diff=13.332239s, valid=True
2026-06-03T16:34:19.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:34:19.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:34:19.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:34:12, diff=7.335585s, valid=True
2026-06-03T16:34:19.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:34:19.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:34:19.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:34:01, diff=18.343389s, valid=True
2026-06-03T16:34:19.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:34:19.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:34:19.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:34:19.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:34:19.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:34:19.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:34:19.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:34:12, diff=7.34699s, valid=True
2026-06-03T16:34:19.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:34:19.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:34:19.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:34:19.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71456.347784s, valid=False
2026-06-03T16:34:19.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:34:19.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:34:19.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:34:19.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:34:19.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:34:19.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:34:19.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:34:19.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:34:19.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:34:19.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:34:19.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:34:19.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:34:19.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:34:19.666 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:34:19.877 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:34:20.242 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:34:20.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:34:20.344 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:34:20.344 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:34:20.512 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:34:20.512 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:34:50.526 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:34:50.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:34:50.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:34:50.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:34:50.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:34:51.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:34:51.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:34:51.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:34:51.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:34:51.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:34:51.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:34:51.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:34:51.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:34:53.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:34:53.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:34:53.892 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:34:53.892 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:34:53.901 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:34:53.914 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:34:53.914 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:34:53.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:34:53.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:34:53.915 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:34:53.916 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:34:53.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:34:54.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:34:54.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:34:54.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:34:54.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:34:54.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:34:54.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:34:54.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:34:54.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:34:54.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:34:54.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:34:54.247 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:34:54.319 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:34:37
2026-06-03T16:34:54.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86512, datetime.datetime(2026, 6, 3, 16, 34, 37), datetime.datetime(2026, 6, 3, 16, 34, 36), 'salt', 6.81, 100.14, None, 33.52, 130.81, -0.02, 820.95, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:34:54.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:34:54.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:34:54.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:34:36, diff=18.32667s, valid=True
2026-06-03T16:34:54.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:34:54.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:34:54.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:35:12, diff=-17.669964s, valid=True
2026-06-03T16:34:54.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:34:54.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:34:54.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:34:33, diff=21.337855s, valid=True
2026-06-03T16:34:54.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:34:54.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:34:54.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:34:54.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:34:54.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:34:54.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:34:54.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:35:12, diff=-17.658556s, valid=True
2026-06-03T16:34:54.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:34:54.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:34:54.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:34:54.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71491.342225s, valid=False
2026-06-03T16:34:54.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:34:54.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:34:54.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:34:54.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:34:54.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:34:54.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:34:54.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:34:54.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:34:54.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:34:54.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:34:54.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:34:54.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:34:54.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:34:54.737 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:34:54.949 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:34:55.293 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:34:55.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:34:55.396 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:34:55.397 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:34:55.613 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:34:55.613 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:35:25.643 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:35:25.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:35:25.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:35:26.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:35:26.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:35:26.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:35:26.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:35:26.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:35:26.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:35:26.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:35:26.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:35:26.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:35:26.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:35:29.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:35:29.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:35:29.265 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:35:29.265 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:35:29.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:35:29.289 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:35:29.290 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:35:29.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:35:29.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:35:29.291 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:35:29.291 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:35:29.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:35:29.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:35:29.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:35:29.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:35:29.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:35:29.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:35:29.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:35:29.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:35:29.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:35:29.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:35:29.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:35:29.622 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:35:29.695 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:35:07
2026-06-03T16:35:29.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86513, datetime.datetime(2026, 6, 3, 16, 35, 7), datetime.datetime(2026, 6, 3, 16, 35, 7), 'salt', 6.84, 100.07, None, 24.42, 109.99, -0.02, 821.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:35:29.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:35:29.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:35:29.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:35:07, diff=22.703091s, valid=True
2026-06-03T16:35:29.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:35:29.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:35:29.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:35:12, diff=17.706663s, valid=True
2026-06-03T16:35:29.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:35:29.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:35:29.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:35:04, diff=25.714931s, valid=True
2026-06-03T16:35:29.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:35:29.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:35:29.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:35:29.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:35:29.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:35:29.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:35:29.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:35:12, diff=17.718682s, valid=True
2026-06-03T16:35:29.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:35:29.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:35:29.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:35:29.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71526.71948s, valid=False
2026-06-03T16:35:29.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:35:29.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:35:29.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:35:29.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:35:29.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:35:29.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:35:29.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:35:29.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:35:29.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:35:29.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:35:29.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:35:29.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:35:30.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:35:30.073 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:35:30.286 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:35:30.625 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:35:30.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:35:30.727 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:35:30.727 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:35:30.871 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:35:30.871 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:36:00.888 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:36:00.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:36:00.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:36:01.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:36:01.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:36:01.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:36:01.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:36:01.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:36:01.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:36:01.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:36:01.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:36:01.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:36:01.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:36:04.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:36:04.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:36:04.142 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:36:04.142 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:36:04.153 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:36:04.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:36:04.166 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:36:04.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:36:04.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:36:04.168 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:36:04.168 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:36:04.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:36:04.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:36:04.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:36:04.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:36:04.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:36:04.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:36:04.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:36:04.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:36:04.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:36:04.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:36:04.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:36:04.494 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:36:04.567 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:35:37
2026-06-03T16:36:04.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86514, datetime.datetime(2026, 6, 3, 16, 35, 37), datetime.datetime(2026, 6, 3, 16, 35, 37), 'salt', 6.91, 100.14, None, 30.38, 124.24, -0.02, 821.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:36:04.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:36:04.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:36:04.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:35:37, diff=27.574576s, valid=True
2026-06-03T16:36:04.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:36:04.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:36:04.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:36:12, diff=-7.421909s, valid=True
2026-06-03T16:36:04.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:36:04.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:36:04.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:35:36, diff=28.586096s, valid=True
2026-06-03T16:36:04.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:36:04.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:36:04.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:36:04.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:36:04.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:36:04.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:36:04.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:36:12, diff=-7.410176s, valid=True
2026-06-03T16:36:04.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:36:04.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:36:04.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:36:04.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71561.590617s, valid=False
2026-06-03T16:36:04.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:36:04.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:36:04.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:36:04.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:36:04.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:36:04.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:36:04.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:36:04.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:36:04.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:36:04.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:36:04.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:36:04.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:36:04.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:36:04.979 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:36:05.186 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:36:05.531 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:36:05.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:36:05.635 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:36:05.635 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:36:05.806 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:36:05.806 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:36:35.836 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:36:35.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:36:35.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:36:35.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:36:36.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:36:36.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:36:36.244 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:36:36.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:36:36.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:36:36.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:36:36.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:36:36.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:36:36.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:36:38.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:36:38.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:36:38.915 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:36:38.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:36:38.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:36:38.937 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:36:38.937 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:36:38.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:36:38.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:36:38.938 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:36:38.939 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:36:38.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:36:39.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:36:39.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:36:39.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:36:39.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:36:39.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:36:39.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:36:39.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:36:39.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:36:39.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:36:39.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:36:39.284 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:36:39.355 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:36:38
2026-06-03T16:36:39.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86516, datetime.datetime(2026, 6, 3, 16, 36, 38), datetime.datetime(2026, 6, 3, 16, 36, 37), 'salt', 6.84, 100.07, None, 35.42, 132.06, -0.02, 820.95, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:36:39.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:36:39.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:36:39.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:36:37, diff=2.362784s, valid=True
2026-06-03T16:36:39.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:36:39.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:36:39.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:37:12, diff=-32.633596s, valid=True
2026-06-03T16:36:39.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:36:39.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:36:39.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:36:32, diff=7.374931s, valid=True
2026-06-03T16:36:39.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:36:39.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:36:39.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:36:39.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:36:39.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:36:39.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:36:39.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:37:12, diff=-32.621234s, valid=True
2026-06-03T16:36:39.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:36:39.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:36:39.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:36:39.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71596.3796s, valid=False
2026-06-03T16:36:39.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:36:39.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:36:39.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:36:39.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:36:39.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:36:39.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:36:39.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:36:39.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:36:39.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:36:39.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:36:39.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:36:39.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:36:39.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:36:39.701 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:36:39.918 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:36:40.276 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:36:40.379 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:36:40.379 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:36:40.379 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:36:40.547 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:36:40.547 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:37:10.577 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:37:10.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:37:10.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:37:11.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:37:11.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:37:11.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:37:11.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:37:11.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:37:11.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:37:11.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:37:11.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:37:11.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:37:11.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:37:14.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:37:14.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:37:14.085 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:37:14.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:37:14.095 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:37:14.108 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:37:14.108 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:37:14.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:37:14.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:37:14.109 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:37:14.110 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:37:14.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:37:14.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:37:14.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:37:14.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:37:14.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:37:14.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:37:14.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:37:14.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:37:14.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:37:14.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:37:14.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:37:14.463 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:37:14.535 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:37:08
2026-06-03T16:37:14.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86517, datetime.datetime(2026, 6, 3, 16, 37, 8), datetime.datetime(2026, 6, 3, 16, 37, 7), 'salt', 6.67, 100.04, None, 31.83, 128.49, -0.02, 821.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:37:14.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:37:14.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:37:14.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:37:07, diff=7.542693s, valid=True
2026-06-03T16:37:14.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:37:14.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:37:14.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:37:12, diff=2.546216s, valid=True
2026-06-03T16:37:14.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:37:14.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:37:14.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:37:03, diff=11.554518s, valid=True
2026-06-03T16:37:14.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:37:14.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:37:14.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:37:14.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:37:14.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:37:14.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:37:14.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:37:12, diff=2.558296s, valid=True
2026-06-03T16:37:14.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:37:14.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:37:14.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:37:14.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71631.559108s, valid=False
2026-06-03T16:37:14.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:37:14.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:37:14.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:37:14.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:37:14.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:37:14.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:37:14.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:37:14.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:37:14.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:37:14.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:37:14.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:37:14.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:37:14.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:37:14.879 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:37:15.078 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:37:15.414 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:37:15.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:37:15.516 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:37:15.516 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:37:15.720 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:37:15.720 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:37:45.751 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:37:45.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:37:45.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:37:46.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:37:46.268 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:37:46.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:37:46.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:37:46.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:37:46.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:37:46.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:37:46.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:37:46.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:37:46.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:37:49.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:37:49.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:37:49.207 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:37:49.207 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:37:49.215 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:37:49.228 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:37:49.228 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:37:49.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:37:49.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:37:49.230 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:37:49.230 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:37:49.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:37:49.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:37:49.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:37:49.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:37:49.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:37:49.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:37:49.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:37:49.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:37:49.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:37:49.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:37:49.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:37:49.567 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:37:49.636 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:37:38
2026-06-03T16:37:49.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86518, datetime.datetime(2026, 6, 3, 16, 37, 38), datetime.datetime(2026, 6, 3, 16, 37, 38), 'salt', 6.77, 100.11, None, 35.99, 128.54, -0.02, 821.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:37:49.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:37:49.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:37:49.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:37:38, diff=11.643581s, valid=True
2026-06-03T16:37:49.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:37:49.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:37:49.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:38:12, diff=-22.352913s, valid=True
2026-06-03T16:37:49.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:37:49.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:37:49.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:37:33, diff=16.655239s, valid=True
2026-06-03T16:37:49.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:37:49.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:37:49.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:37:49.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:37:49.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:37:49.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:37:49.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:38:12, diff=-22.340771s, valid=True
2026-06-03T16:37:49.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:37:49.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:37:49.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:37:49.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71666.660095s, valid=False
2026-06-03T16:37:49.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:37:49.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:37:49.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:37:49.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:37:49.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:37:49.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:37:49.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:37:49.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:37:49.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:37:49.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:37:49.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:37:49.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:37:49.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:37:49.993 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:37:50.197 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:37:50.587 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:37:50.689 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:37:50.689 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:37:50.689 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:37:50.919 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:37:50.919 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:38:20.949 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:38:20.949 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:38:20.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:38:21.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:38:21.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:38:21.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:38:21.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:38:21.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:38:21.547 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:38:21.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:38:21.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:38:21.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:38:21.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:38:24.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:38:24.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:38:24.246 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:38:24.246 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:38:24.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:38:24.268 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:38:24.269 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:38:24.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:38:24.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:38:24.270 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:38:24.270 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:38:24.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:38:24.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:38:24.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:38:24.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:38:24.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:38:24.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:38:24.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:38:24.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:38:24.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:38:24.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:38:24.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:38:24.603 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:38:24.676 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:38:09
2026-06-03T16:38:24.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86519, datetime.datetime(2026, 6, 3, 16, 38, 9), datetime.datetime(2026, 6, 3, 16, 38, 8), 'salt', 6.81, 100.04, None, 33.41, 128.89, -0.01, 821.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:38:24.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:38:24.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:38:24.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:38:08, diff=16.684167s, valid=True
2026-06-03T16:38:24.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:38:24.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:38:24.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:38:12, diff=12.687657s, valid=True
2026-06-03T16:38:24.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:38:24.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:38:24.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:38:03, diff=21.695887s, valid=True
2026-06-03T16:38:24.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:38:24.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:38:24.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:38:24.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:38:24.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:38:24.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:38:24.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:38:12, diff=12.699639s, valid=True
2026-06-03T16:38:24.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:38:24.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:38:24.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:38:24.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71701.700441s, valid=False
2026-06-03T16:38:24.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:38:24.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:38:24.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:38:24.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:38:24.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:38:24.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:38:24.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:38:24.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:38:24.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:38:24.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:38:24.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:38:24.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:38:24.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:38:25.020 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:38:25.218 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:38:25.549 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:38:25.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:38:25.649 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:38:25.650 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:38:25.822 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:38:25.823 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:38:55.824 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:38:55.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:38:55.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:38:55.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:38:55.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:38:56.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:38:56.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:38:56.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:38:56.230 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:38:56.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:38:56.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:38:56.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:38:56.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:38:58.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:38:58.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:38:58.763 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:38:58.764 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:38:58.774 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:38:58.787 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:38:58.787 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:38:58.788 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:38:58.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:38:58.788 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:38:58.789 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:38:58.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:38:58.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:38:58.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:38:59.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:38:59.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:38:59.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:38:59.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:38:59.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:38:59.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:38:59.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:38:59.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:38:59.121 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:38:59.192 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:38:39
2026-06-03T16:38:59.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86520, datetime.datetime(2026, 6, 3, 16, 38, 39), datetime.datetime(2026, 6, 3, 16, 38, 38), 'salt', 6.84, 100.07, None, 37.37, 130.13, -0.02, 821.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:38:59.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:38:59.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:38:59.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:38:38, diff=21.199462s, valid=True
2026-06-03T16:38:59.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:38:59.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:38:59.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:39:12, diff=-12.797043s, valid=True
2026-06-03T16:38:59.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:38:59.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:38:59.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:38:34, diff=25.211082s, valid=True
2026-06-03T16:38:59.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:38:59.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:38:59.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:38:59.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:38:59.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:38:59.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:38:59.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:39:12, diff=-12.785192s, valid=True
2026-06-03T16:38:59.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:38:59.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:38:59.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:38:59.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71736.215614s, valid=False
2026-06-03T16:38:59.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:38:59.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:38:59.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:38:59.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:38:59.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:38:59.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:38:59.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:38:59.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:38:59.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:38:59.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:38:59.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:38:59.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:38:59.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:38:59.609 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:38:59.806 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:39:00.165 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:39:00.266 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:39:00.266 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:39:00.266 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:39:00.467 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:39:00.467 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:39:30.497 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:39:30.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:39:30.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:39:30.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:39:30.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:39:31.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:39:31.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:39:31.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:39:31.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:39:31.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:39:31.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:39:31.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:39:31.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:39:33.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:39:33.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:39:33.885 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:39:33.885 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:39:33.895 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:39:33.907 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:39:33.908 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:39:33.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:39:33.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:39:33.909 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:39:33.909 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:39:33.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:39:34.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:39:34.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:39:34.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:39:34.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:39:34.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:39:34.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:39:34.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:39:34.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:39:34.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:39:34.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:39:34.243 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:39:34.313 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:39:09
2026-06-03T16:39:34.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86521, datetime.datetime(2026, 6, 3, 16, 39, 9), datetime.datetime(2026, 6, 3, 16, 39, 9), 'salt', 6.77, 100.04, None, 38.18, 125.13, -0.02, 821.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:39:34.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:39:34.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:39:34.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:39:09, diff=25.321184s, valid=True
2026-06-03T16:39:34.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:39:34.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:39:34.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:39:12, diff=22.324682s, valid=True
2026-06-03T16:39:34.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:39:34.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:39:34.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:39:06, diff=28.332966s, valid=True
2026-06-03T16:39:34.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:39:34.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:39:34.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:39:34.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:39:34.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:39:34.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:39:34.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:39:12, diff=22.336643s, valid=True
2026-06-03T16:39:34.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:39:34.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:39:34.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:39:34.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71771.337503s, valid=False
2026-06-03T16:39:34.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:39:34.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:39:34.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:39:34.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:39:34.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:39:34.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:39:34.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:39:34.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:39:34.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:39:34.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:39:34.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:39:34.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:39:34.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:39:34.657 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:39:34.853 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:39:35.187 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:39:35.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:39:35.288 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:39:35.289 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:39:35.443 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:39:35.443 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:40:05.470 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:40:05.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:40:05.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:40:06.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:40:06.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:40:06.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:40:06.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:40:06.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:40:06.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:40:06.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:40:06.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:40:06.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:40:06.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:40:08.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:40:08.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:40:08.971 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:40:08.971 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:40:08.981 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:40:08.994 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:40:08.995 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:40:08.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:40:08.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:40:08.996 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:40:08.996 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:40:09.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:40:09.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:40:09.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:40:09.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:40:09.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:40:09.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:40:09.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:40:09.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:40:09.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:40:09.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:40:09.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:40:09.341 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:40:09.417 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:39:40
2026-06-03T16:40:09.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86522, datetime.datetime(2026, 6, 3, 16, 39, 40), datetime.datetime(2026, 6, 3, 16, 39, 39), 'salt', 6.71, 99.68, None, 41.6, 126.19, 0.04, 821.14, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:40:09.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:40:09.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:40:09.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:39:39, diff=30.424768s, valid=True
2026-06-03T16:40:09.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:40:09.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:40:09.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:40:12, diff=-2.571789s, valid=True
2026-06-03T16:40:09.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:40:09.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:40:09.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:39:37, diff=32.436405s, valid=True
2026-06-03T16:40:09.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:40:09.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:40:09.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:40:09.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:40:09.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:40:09.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:40:09.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:40:12, diff=-2.559878s, valid=True
2026-06-03T16:40:09.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:40:09.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:40:09.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:40:09.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71806.440927s, valid=False
2026-06-03T16:40:09.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:40:09.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:40:09.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:40:09.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:40:09.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:40:09.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:40:09.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:40:09.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:40:09.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:40:09.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:40:09.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:40:09.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:40:09.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:40:09.838 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:40:10.073 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:40:10.427 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:40:10.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:40:10.528 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:40:10.528 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:40:10.709 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:40:10.710 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:40:40.740 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:40:40.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:40:40.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:40:41.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:40:41.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:40:41.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:40:41.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:40:41.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:40:41.666 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:40:41.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:40:41.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:40:41.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:40:41.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:40:44.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:40:44.409 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:40:44.409 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:40:44.409 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:40:44.418 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:40:44.430 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:40:44.430 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:40:44.430 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:40:44.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:40:44.430 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:40:44.431 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:40:44.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:40:44.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:40:44.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:40:44.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:40:44.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:40:44.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:40:44.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:40:44.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:40:44.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:40:44.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:40:44.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:40:44.746 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:40:44.838 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:40:40
2026-06-03T16:40:44.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86524, datetime.datetime(2026, 6, 3, 16, 40, 40), datetime.datetime(2026, 6, 3, 16, 40, 39), 'salt', 6.77, 100.07, None, 37.96, 128.63, -0.02, 820.89, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:40:44.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:40:44.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:40:44.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:40:39, diff=5.84584s, valid=True
2026-06-03T16:40:44.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:40:44.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:40:44.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:41:12, diff=-27.150776s, valid=True
2026-06-03T16:40:44.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:40:44.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:40:44.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:40:34, diff=10.857142s, valid=True
2026-06-03T16:40:44.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:40:44.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:40:44.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:40:44.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:40:44.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:40:44.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:40:44.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:41:12, diff=-27.139246s, valid=True
2026-06-03T16:40:44.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:40:44.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:40:44.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:40:44.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71841.86152s, valid=False
2026-06-03T16:40:44.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:40:44.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:40:44.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:40:44.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:40:44.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:40:44.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:40:44.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:40:44.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:40:44.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:40:45.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:40:45.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:40:45.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:40:45.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:40:45.183 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:40:45.379 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:40:45.710 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:40:45.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:40:45.812 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:40:45.812 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:40:45.884 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:40:45.885 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:41:15.902 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:41:15.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:41:15.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:41:16.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:41:16.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:41:16.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:41:16.274 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:41:16.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:41:16.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:41:16.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:41:16.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:41:16.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:41:16.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:41:18.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:41:18.949 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:41:18.949 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:41:18.949 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:41:18.958 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:41:18.970 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:41:18.970 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:41:18.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:41:18.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:41:18.970 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:41:18.970 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:41:18.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:41:19.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:41:19.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:41:19.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:41:19.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:41:19.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:41:19.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:41:19.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:41:19.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:41:19.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:41:19.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:41:19.323 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:41:19.400 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:41:10
2026-06-03T16:41:19.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86525, datetime.datetime(2026, 6, 3, 16, 41, 10), datetime.datetime(2026, 6, 3, 16, 41, 9), 'salt', 6.77, 100.11, None, 37.44, 125.06, -0.02, 821.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:41:19.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:41:19.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:41:19.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:41:09, diff=10.407918s, valid=True
2026-06-03T16:41:19.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:41:19.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:41:19.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:41:12, diff=7.4114s, valid=True
2026-06-03T16:41:19.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:41:19.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:41:19.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:41:05, diff=14.419465s, valid=True
2026-06-03T16:41:19.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:41:19.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:41:19.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:41:19.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:41:19.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:41:19.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:41:19.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:41:12, diff=7.423166s, valid=True
2026-06-03T16:41:19.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:41:19.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:41:19.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:41:19.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71876.423986s, valid=False
2026-06-03T16:41:19.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:41:19.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:41:19.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:41:19.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:41:19.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:41:19.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:41:19.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:41:19.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:41:19.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:41:19.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:41:19.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:41:19.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:41:19.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:41:19.809 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:41:20.021 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:41:20.358 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:41:20.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:41:20.458 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:41:20.459 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:41:20.640 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:41:20.641 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:41:50.655 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:41:50.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:41:50.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:41:50.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:41:50.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:41:51.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:41:51.090 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:41:51.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:41:51.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:41:51.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:41:51.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:41:51.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:41:51.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:41:53.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:41:53.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:41:53.830 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:41:53.830 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:41:53.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:41:53.851 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:41:53.852 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:41:53.852 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:41:53.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:41:53.853 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:41:53.853 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:41:53.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:41:53.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:41:53.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:41:54.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:41:54.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:41:54.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:41:54.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:41:54.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:41:54.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:41:54.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:41:54.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:41:54.198 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:41:54.269 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:41:40
2026-06-03T16:41:54.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86526, datetime.datetime(2026, 6, 3, 16, 41, 40), datetime.datetime(2026, 6, 3, 16, 41, 40), 'salt', 6.71, 100.01, None, 38.11, 133.02, 0.0, 821.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:41:54.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:41:54.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:41:54.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:41:40, diff=14.277143s, valid=True
2026-06-03T16:41:54.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:41:54.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:41:54.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:42:12, diff=-17.719372s, valid=True
2026-06-03T16:41:54.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:41:54.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:41:54.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:41:35, diff=19.28879s, valid=True
2026-06-03T16:41:54.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:41:54.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:41:54.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:41:54.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:41:54.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:41:54.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:41:54.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:42:12, diff=-17.707592s, valid=True
2026-06-03T16:41:54.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:41:54.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:41:54.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:41:54.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71911.293233s, valid=False
2026-06-03T16:41:54.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:41:54.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:41:54.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:41:54.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:41:54.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:41:54.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:41:54.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:41:54.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:41:54.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:41:54.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:41:54.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:41:54.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:41:54.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:41:54.612 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:41:54.808 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:41:55.139 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:41:55.240 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:41:55.240 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:41:55.240 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:41:55.442 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:41:55.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:42:25.472 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:42:25.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:42:25.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:42:25.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:42:25.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:42:25.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:42:25.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:42:25.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:42:25.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:42:25.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:42:25.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:42:25.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:42:25.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:42:28.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:42:28.880 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:42:28.881 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:42:28.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:42:28.892 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:42:28.905 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:42:28.906 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:42:28.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:42:28.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:42:28.907 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:42:28.907 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:42:28.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:42:29.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:42:29.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:42:29.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:42:29.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:42:29.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:42:29.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:42:29.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:42:29.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:42:29.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:42:29.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:42:29.285 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:42:29.369 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:42:11
2026-06-03T16:42:29.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86527, datetime.datetime(2026, 6, 3, 16, 42, 11), datetime.datetime(2026, 6, 3, 16, 42, 10), 'salt', 6.77, 100.14, None, 35.35, 126.42, -0.03, 821.32, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:42:29.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:42:29.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:42:29.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:42:10, diff=19.377705s, valid=True
2026-06-03T16:42:29.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:42:29.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:42:29.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:42:12, diff=17.381219s, valid=True
2026-06-03T16:42:29.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:42:29.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:42:29.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:42:05, diff=24.38941s, valid=True
2026-06-03T16:42:29.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:42:29.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:42:29.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:42:29.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:42:29.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:42:29.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:42:29.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:42:12, diff=17.393129s, valid=True
2026-06-03T16:42:29.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:42:29.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:42:29.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:42:29.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71946.39394s, valid=False
2026-06-03T16:42:29.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:42:29.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:42:29.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:42:29.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:42:29.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:42:29.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:42:29.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:42:29.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:42:29.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:42:29.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:42:29.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:42:29.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:42:29.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:42:29.714 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:42:29.919 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:42:30.264 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:42:30.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:42:30.366 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:42:30.366 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:42:30.522 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:42:30.522 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:43:00.553 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:43:00.553 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:43:00.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:43:00.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:43:00.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:43:00.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:43:00.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:43:00.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:43:00.952 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:43:00.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:43:00.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:43:00.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:43:00.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:43:04.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:43:04.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:43:04.061 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:43:04.061 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:43:04.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:43:04.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:43:04.085 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:43:04.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:43:04.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:43:04.086 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:43:04.087 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:43:04.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:43:04.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:43:04.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:43:04.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:43:04.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:43:04.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:43:04.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:43:04.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:43:04.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:43:04.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:43:04.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:43:04.436 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:43:04.511 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:42:41
2026-06-03T16:43:04.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86528, datetime.datetime(2026, 6, 3, 16, 42, 41), datetime.datetime(2026, 6, 3, 16, 42, 40), 'salt', 6.74, 100.07, None, 36.41, 135.06, -0.02, 821.32, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:43:04.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:43:04.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:43:04.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:42:40, diff=24.519172s, valid=True
2026-06-03T16:43:04.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:43:04.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:43:04.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:43:12, diff=-7.477171s, valid=True
2026-06-03T16:43:04.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:43:04.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:43:04.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:42:36, diff=28.531215s, valid=True
2026-06-03T16:43:04.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:43:04.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:43:04.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:43:04.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:43:04.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:43:04.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:43:04.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:43:12, diff=-7.4649s, valid=True
2026-06-03T16:43:04.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:43:04.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:43:04.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:43:04.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=71981.535969s, valid=False
2026-06-03T16:43:04.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:43:04.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:43:04.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:43:04.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:43:04.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:43:04.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:43:04.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:43:04.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:43:04.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:43:04.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:43:04.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:43:04.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:43:04.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:43:04.864 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:43:05.066 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:43:05.460 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:43:05.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:43:05.561 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:43:05.561 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:43:05.633 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:43:05.633 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:43:35.645 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:43:35.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:43:35.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:43:35.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:43:35.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:43:36.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:43:36.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:43:36.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:43:36.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:43:36.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:43:36.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:43:36.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:43:36.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:43:39.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:43:39.248 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:43:39.249 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:43:39.249 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:43:39.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:43:39.272 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:43:39.273 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:43:39.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:43:39.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:43:39.274 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:43:39.274 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:43:39.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:43:39.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:43:39.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:43:39.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:43:39.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:43:39.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:43:39.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:43:39.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:43:39.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:43:39.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:43:39.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:43:39.619 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:43:39.690 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:43:11
2026-06-03T16:43:39.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86529, datetime.datetime(2026, 6, 3, 16, 43, 11), datetime.datetime(2026, 6, 3, 16, 43, 10), 'salt', 6.64, 99.98, None, 28.19, 129.24, 0.0, 821.38, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:43:39.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:43:39.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:43:39.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:43:10, diff=29.698286s, valid=True
2026-06-03T16:43:39.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:43:39.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:43:39.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:43:12, diff=27.701795s, valid=True
2026-06-03T16:43:39.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:43:39.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:43:39.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:43:07, diff=32.709943s, valid=True
2026-06-03T16:43:39.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:43:39.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:43:39.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:43:39.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:43:39.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:43:39.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:43:39.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:43:12, diff=27.713684s, valid=True
2026-06-03T16:43:39.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:43:39.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:43:39.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:43:39.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72016.714496s, valid=False
2026-06-03T16:43:39.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:43:39.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:43:39.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:43:39.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:43:39.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:43:39.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:43:39.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:43:39.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:43:39.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:43:39.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:43:39.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:43:39.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:43:40.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:43:40.077 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:43:40.296 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:43:40.629 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:43:40.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:43:40.731 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:43:40.731 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:43:40.964 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:43:40.964 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:44:10.995 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:44:10.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:44:10.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:44:11.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:44:11.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:44:11.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:44:11.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:44:11.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:44:11.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:44:11.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:44:11.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:44:11.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:44:11.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:44:14.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:44:14.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:44:14.058 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:44:14.058 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:44:14.068 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:44:14.074 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:44:14.075 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:44:14.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:44:14.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:44:14.076 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:44:14.076 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:44:14.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:44:14.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:44:14.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:44:14.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:44:14.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:44:14.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:44:14.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:44:14.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:44:14.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:44:14.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:44:14.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:44:14.414 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:44:14.483 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:44:12
2026-06-03T16:44:14.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86531, datetime.datetime(2026, 6, 3, 16, 44, 12), datetime.datetime(2026, 6, 3, 16, 44, 11), 'salt', 6.74, 100.07, None, 35.0, 141.82, -0.02, 821.14, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:44:14.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:44:14.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:44:14.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:44:11, diff=3.490321s, valid=True
2026-06-03T16:44:14.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:44:14.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:44:14.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:44:12, diff=2.493634s, valid=True
2026-06-03T16:44:14.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:44:14.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:44:14.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:44:10, diff=4.501405s, valid=True
2026-06-03T16:44:14.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:44:14.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:44:14.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:44:14.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:44:14.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:44:14.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:44:14.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:44:12, diff=2.504958s, valid=True
2026-06-03T16:44:14.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:44:14.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:44:14.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:44:14.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72051.505723s, valid=False
2026-06-03T16:44:14.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:44:14.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:44:14.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:44:14.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:44:14.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:44:14.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:44:14.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:44:14.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:44:14.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:44:14.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:44:14.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:44:14.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:44:14.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:44:14.823 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:44:15.095 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:44:15.430 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:44:15.532 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:44:15.532 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:44:15.532 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:44:15.611 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:44:15.612 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:44:45.642 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:44:45.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:44:45.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:44:46.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:44:46.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:44:46.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:44:46.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:44:46.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:44:46.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:44:46.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:44:46.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:44:46.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:44:46.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:44:48.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:44:48.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:44:48.927 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:44:48.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:44:48.938 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:44:48.951 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:44:48.951 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:44:48.952 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:44:48.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:44:48.952 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:44:48.953 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:44:48.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:44:49.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:44:49.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:44:49.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:44:49.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:44:49.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:44:49.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:44:49.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:44:49.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:44:49.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:44:49.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:44:49.316 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:44:49.387 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:44:42
2026-06-03T16:44:49.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86532, datetime.datetime(2026, 6, 3, 16, 44, 42), datetime.datetime(2026, 6, 3, 16, 44, 41), 'salt', 6.74, 100.07, None, 31.4, 125.27, -0.02, 821.2, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:44:49.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:44:49.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:44:49.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:44:41, diff=8.394543s, valid=True
2026-06-03T16:44:49.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:44:49.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:44:49.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:45:12, diff=-22.601987s, valid=True
2026-06-03T16:44:49.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:44:49.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:44:49.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:44:42, diff=7.406087s, valid=True
2026-06-03T16:44:49.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:44:49.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:44:49.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:44:49.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:44:49.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:44:49.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:44:49.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:45:12, diff=-22.590213s, valid=True
2026-06-03T16:44:49.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:44:49.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:44:49.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:44:49.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72086.410602s, valid=False
2026-06-03T16:44:49.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:44:49.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:44:49.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:44:49.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:44:49.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:44:49.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:44:49.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:44:49.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:44:49.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:44:49.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:44:49.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:44:49.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:44:49.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:44:49.730 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:44:49.937 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:44:50.281 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:44:50.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:44:50.382 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:44:50.382 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:44:50.539 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:44:50.539 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:45:20.569 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:45:20.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:45:20.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:45:20.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:45:20.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:45:20.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:45:20.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:45:21.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:45:21.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:45:21.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:45:21.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:45:21.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:45:21.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:45:23.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:45:23.682 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:45:23.683 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:45:23.683 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:45:23.695 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:45:23.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:45:23.709 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:45:23.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:45:23.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:45:23.710 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:45:23.711 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:45:23.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:45:23.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:45:23.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:45:23.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:45:23.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:45:24.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:45:24.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:45:24.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:45:24.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:45:24.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:45:24.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:45:24.054 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:45:24.126 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:45:12
2026-06-03T16:45:24.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86533, datetime.datetime(2026, 6, 3, 16, 45, 12), datetime.datetime(2026, 6, 3, 16, 45, 11), 'salt', 6.67, 100.11, None, 28.69, 135.25, -0.03, 821.26, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:45:24.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:45:24.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:45:24.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:45:11, diff=13.133647s, valid=True
2026-06-03T16:45:24.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:45:24.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:45:24.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:45:12, diff=12.137204s, valid=True
2026-06-03T16:45:24.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:45:24.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:45:24.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:45:07, diff=17.148305s, valid=True
2026-06-03T16:45:24.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:45:24.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:45:24.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:45:24.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:45:24.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:45:24.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:45:24.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:45:12, diff=12.15373s, valid=True
2026-06-03T16:45:24.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:45:24.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:45:24.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:45:24.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72121.154558s, valid=False
2026-06-03T16:45:24.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:45:24.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:45:24.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:45:24.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:45:24.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:45:24.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:45:24.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:45:24.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:45:24.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:45:24.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:45:24.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:45:24.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:45:24.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:45:24.550 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:45:24.750 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:45:25.086 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:45:25.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:45:25.189 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:45:25.189 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:45:25.446 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:45:25.446 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:45:55.474 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:45:55.474 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:45:55.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:45:55.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:45:55.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:45:55.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:45:55.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:45:55.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:45:55.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:45:55.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:45:55.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:45:55.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:45:55.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:45:58.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:45:58.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:45:58.590 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:45:58.590 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:45:58.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:45:58.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:45:58.613 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:45:58.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:45:58.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:45:58.614 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:45:58.614 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:45:58.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:45:58.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:45:58.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:45:58.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:45:58.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:45:58.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:45:58.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:45:58.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:45:58.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:45:58.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:45:58.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:45:58.946 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:45:59.015 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:45:43
2026-06-03T16:45:59.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86534, datetime.datetime(2026, 6, 3, 16, 45, 43), datetime.datetime(2026, 6, 3, 16, 45, 42), 'salt', 6.64, 100.01, None, 28.51, 133.94, -0.01, 821.2, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:45:59.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:45:59.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:45:59.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:45:42, diff=17.023104s, valid=True
2026-06-03T16:45:59.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:45:59.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:45:59.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:46:12, diff=-12.97355s, valid=True
2026-06-03T16:45:59.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:45:59.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:45:59.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:45:37, diff=22.034292s, valid=True
2026-06-03T16:45:59.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:45:59.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:45:59.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:45:59.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:45:59.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:45:59.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:45:59.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:46:12, diff=-12.962119s, valid=True
2026-06-03T16:45:59.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:45:59.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:45:59.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:45:59.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72156.038657s, valid=False
2026-06-03T16:45:59.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:45:59.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:45:59.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:45:59.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:45:59.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:45:59.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:45:59.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:45:59.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:45:59.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:45:59.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:45:59.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:45:59.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:45:59.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:45:59.357 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:45:59.553 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:45:59.891 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:45:59.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:45:59.997 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:45:59.997 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:46:00.157 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:46:00.157 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:46:30.178 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:46:30.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:46:30.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:46:30.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:46:30.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:46:30.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:46:30.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:46:30.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:46:30.618 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:46:30.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:46:30.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:46:30.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:46:30.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:46:33.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:46:33.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:46:33.302 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:46:33.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:46:33.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:46:33.327 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:46:33.327 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:46:33.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:46:33.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:46:33.328 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:46:33.329 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:46:33.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:46:33.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:46:33.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:46:33.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:46:33.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:46:33.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:46:33.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:46:33.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:46:33.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:46:33.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:46:33.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:46:33.662 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:46:33.733 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:46:13
2026-06-03T16:46:33.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86535, datetime.datetime(2026, 6, 3, 16, 46, 13), datetime.datetime(2026, 6, 3, 16, 46, 12), 'salt', 6.71, 100.07, None, 34.26, 132.29, -0.01, 821.26, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:46:33.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:46:33.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:46:33.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:46:12, diff=21.740203s, valid=True
2026-06-03T16:46:33.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:46:33.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:46:33.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:46:12, diff=21.743688s, valid=True
2026-06-03T16:46:33.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:46:33.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:46:33.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:46:07, diff=26.751724s, valid=True
2026-06-03T16:46:33.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:46:33.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:46:33.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:46:33.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:46:33.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:46:33.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:46:33.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:46:12, diff=21.755544s, valid=True
2026-06-03T16:46:33.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:46:33.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:46:33.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:46:33.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72190.756379s, valid=False
2026-06-03T16:46:33.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:46:33.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:46:33.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:46:33.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:46:33.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:46:33.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:46:33.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:46:33.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:46:33.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:46:33.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:46:34.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:46:34.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:46:34.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:46:34.147 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:46:34.346 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:46:34.681 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:46:34.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:46:34.783 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:46:34.783 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:46:35.047 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:46:35.047 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:47:05.058 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:47:05.058 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:47:05.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:47:05.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:47:05.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:47:05.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:47:05.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:47:05.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:47:05.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:47:05.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:47:05.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:47:05.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:47:05.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:47:08.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:47:08.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:47:08.227 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:47:08.227 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:47:08.239 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:47:08.251 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:47:08.252 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:47:08.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:47:08.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:47:08.253 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:47:08.253 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:47:08.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:47:08.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:47:08.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:47:08.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:47:08.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:47:08.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:47:08.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:47:08.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:47:08.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:47:08.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:47:08.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:47:08.580 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:47:08.651 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:46:43
2026-06-03T16:47:08.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86536, datetime.datetime(2026, 6, 3, 16, 46, 43), datetime.datetime(2026, 6, 3, 16, 46, 43), 'salt', 6.64, 100.04, None, 34.61, 137.58, -0.01, 821.44, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:47:08.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:47:08.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:47:08.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:46:43, diff=25.663117s, valid=True
2026-06-03T16:47:08.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:47:08.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:47:08.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:47:12, diff=-3.333402s, valid=True
2026-06-03T16:47:08.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:47:08.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:47:08.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:46:37, diff=31.674699s, valid=True
2026-06-03T16:47:08.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:47:08.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:47:08.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:47:08.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:47:08.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:47:08.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:47:08.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:47:12, diff=-3.321604s, valid=True
2026-06-03T16:47:08.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:47:08.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:47:08.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:47:08.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72225.67921s, valid=False
2026-06-03T16:47:08.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:47:08.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:47:08.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:47:08.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:47:08.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:47:08.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:47:08.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:47:08.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:47:08.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:47:08.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:47:08.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:47:08.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:47:08.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:47:09.003 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:47:09.199 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:47:09.529 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:47:09.631 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:47:09.631 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:47:09.631 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:47:09.801 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:47:09.801 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:47:39.807 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:47:39.807 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:47:39.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:47:39.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:47:39.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:47:40.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:47:40.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:47:40.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:47:40.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:47:40.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:47:40.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:47:40.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:47:40.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:47:42.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:47:42.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:47:42.886 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:47:42.887 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:47:42.897 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:47:42.909 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:47:42.910 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:47:42.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:47:42.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:47:42.911 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:47:42.911 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:47:42.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:47:43.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:47:43.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:47:43.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:47:43.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:47:43.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:47:43.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:47:43.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:47:43.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:47:43.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:47:43.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:47:43.234 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:47:43.304 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:47:14
2026-06-03T16:47:43.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86537, datetime.datetime(2026, 6, 3, 16, 47, 14), datetime.datetime(2026, 6, 3, 16, 47, 13), 'salt', 6.67, 100.08, None, 26.11, 149.34, -0.02, 821.44, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:47:43.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:47:43.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:47:43.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:47:13, diff=30.312384s, valid=True
2026-06-03T16:47:43.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:47:43.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:47:43.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:47:12, diff=31.316091s, valid=True
2026-06-03T16:47:43.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:47:43.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:47:43.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:47:08, diff=35.324299s, valid=True
2026-06-03T16:47:43.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:47:43.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:47:43.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:47:43.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:47:43.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:47:43.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:47:43.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:47:12, diff=31.328191s, valid=True
2026-06-03T16:47:43.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:47:43.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:47:43.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:47:43.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72260.329031s, valid=False
2026-06-03T16:47:43.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:47:43.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:47:43.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:47:43.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:47:43.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:47:43.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:47:43.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:47:43.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:47:43.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:47:43.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:47:43.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:47:43.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:47:43.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:47:43.717 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:47:43.916 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:47:44.247 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:47:44.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:47:44.348 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:47:44.348 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:47:44.513 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:47:44.514 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:48:14.521 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:48:14.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:48:14.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:48:14.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:48:14.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:48:14.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:48:14.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:48:14.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:48:14.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:48:14.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:48:14.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:48:14.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:48:14.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:48:17.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:48:17.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:48:17.622 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:48:17.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:48:17.633 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:48:17.645 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:48:17.646 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:48:17.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:48:17.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:48:17.647 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:48:17.648 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:48:17.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:48:17.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:48:17.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:48:17.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:48:17.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:48:17.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:48:17.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:48:17.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:48:17.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:48:17.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:48:17.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:48:17.976 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:48:18.048 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:48:14
2026-06-03T16:48:18.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86539, datetime.datetime(2026, 6, 3, 16, 48, 14), datetime.datetime(2026, 6, 3, 16, 48, 13), 'salt', 6.67, 100.14, None, 30.84, 131.28, -0.03, 821.32, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:48:18.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:48:18.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:48:18.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:48:13, diff=5.055802s, valid=True
2026-06-03T16:48:18.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:48:18.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:48:18.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:48:12, diff=6.059354s, valid=True
2026-06-03T16:48:18.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:48:18.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:48:18.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:48:11, diff=7.067737s, valid=True
2026-06-03T16:48:18.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:48:18.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:48:18.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:48:18.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:48:18.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:48:18.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:48:18.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:48:12, diff=6.0715s, valid=True
2026-06-03T16:48:18.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:48:18.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:48:18.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:48:18.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72295.072325s, valid=False
2026-06-03T16:48:18.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:48:18.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:48:18.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:48:18.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:48:18.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:48:18.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:48:18.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:48:18.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:48:18.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:48:18.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:48:18.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:48:18.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:48:18.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:48:18.409 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:48:18.609 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:48:18.943 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:48:19.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:48:19.044 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:48:19.044 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:48:19.215 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:48:19.215 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:48:49.245 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:48:49.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:48:49.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:48:49.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:48:49.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:48:49.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:48:49.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:48:49.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:48:49.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:48:49.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:48:49.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:48:49.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:48:49.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:48:52.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:48:52.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:48:52.656 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:48:52.657 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:48:52.666 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:48:52.679 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:48:52.679 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:48:52.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:48:52.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:48:52.680 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:48:52.681 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:48:52.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:48:52.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:48:52.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:48:52.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:48:52.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:48:52.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:48:52.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:48:53.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:48:53.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:48:53.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:48:53.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:48:53.015 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:48:53.085 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:48:44
2026-06-03T16:48:53.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86540, datetime.datetime(2026, 6, 3, 16, 48, 44), datetime.datetime(2026, 6, 3, 16, 48, 44), 'salt', 6.74, 100.08, None, 30.52, 135.67, -0.02, 821.26, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:48:53.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:48:53.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:48:53.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:48:44, diff=9.092856s, valid=True
2026-06-03T16:48:53.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:48:53.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:48:53.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:49:12, diff=-18.903696s, valid=True
2026-06-03T16:48:53.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:48:53.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:48:53.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:48:43, diff=10.10441s, valid=True
2026-06-03T16:48:53.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:48:53.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:48:53.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:48:53.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:48:53.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:48:53.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:48:53.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:49:12, diff=-18.891809s, valid=True
2026-06-03T16:48:53.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:48:53.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:48:53.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:48:53.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72330.109056s, valid=False
2026-06-03T16:48:53.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:48:53.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:48:53.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:48:53.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:48:53.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:48:53.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:48:53.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:48:53.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:48:53.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:48:53.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:48:53.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:48:53.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:48:53.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:48:53.432 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:48:53.631 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:48:53.965 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:48:54.067 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:48:54.067 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:48:54.067 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:48:54.247 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:48:54.247 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:49:24.254 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:49:24.254 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:49:24.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:49:24.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:49:24.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:49:24.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:49:24.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:49:24.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:49:24.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:49:24.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:49:24.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:49:24.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:49:24.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:49:27.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:49:27.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:49:27.412 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:49:27.412 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:49:27.423 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:49:27.436 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:49:27.436 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:49:27.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:49:27.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:49:27.437 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:49:27.438 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:49:27.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:49:27.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:49:27.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:49:27.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:49:27.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:49:27.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:49:27.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:49:27.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:49:27.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:49:27.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:49:27.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:49:27.766 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:49:27.835 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:49:15
2026-06-03T16:49:27.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86541, datetime.datetime(2026, 6, 3, 16, 49, 15), datetime.datetime(2026, 6, 3, 16, 49, 14), 'salt', 6.71, 100.14, None, 27.03, 131.17, -0.02, 821.32, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:49:27.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:49:27.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:49:27.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:49:14, diff=13.841381s, valid=True
2026-06-03T16:49:27.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:49:27.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:49:27.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:49:12, diff=15.844264s, valid=True
2026-06-03T16:49:27.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:49:27.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:49:27.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:49:14, diff=13.850992s, valid=True
2026-06-03T16:49:27.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:49:27.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:49:27.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:49:27.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:49:27.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:49:27.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:49:27.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:49:12, diff=15.854081s, valid=True
2026-06-03T16:49:27.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:49:27.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:49:27.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:49:27.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72364.854742s, valid=False
2026-06-03T16:49:27.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:49:27.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:49:27.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:49:27.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:49:27.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:49:27.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:49:27.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:49:27.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:49:27.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:49:27.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:49:28.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:49:28.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:49:28.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:49:28.174 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:49:28.371 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:49:28.762 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:49:28.862 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:49:28.863 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:49:28.863 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:49:29.079 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:49:29.079 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:49:59.082 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:49:59.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:49:59.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:49:59.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:49:59.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:49:59.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:49:59.429 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:49:59.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:49:59.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:49:59.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:49:59.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:49:59.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:49:59.458 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:50:02.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:50:02.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:50:02.399 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:50:02.399 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:50:02.407 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:50:02.418 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:50:02.419 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:50:02.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:50:02.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:50:02.419 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:50:02.419 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:50:02.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:50:02.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:50:02.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:50:02.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:50:02.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:50:02.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:50:02.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:50:02.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:50:02.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:50:02.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:50:02.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:50:02.701 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:50:02.771 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:49:45
2026-06-03T16:50:02.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86542, datetime.datetime(2026, 6, 3, 16, 49, 45), datetime.datetime(2026, 6, 3, 16, 49, 44), 'salt', 6.71, 100.14, None, 25.33, 133.37, -0.02, 821.38, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:50:02.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:50:02.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:50:02.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:49:44, diff=18.778509s, valid=True
2026-06-03T16:50:02.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:50:02.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:50:02.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:50:12, diff=-9.218245s, valid=True
2026-06-03T16:50:02.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:50:02.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:50:02.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:49:39, diff=23.789441s, valid=True
2026-06-03T16:50:02.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:50:02.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:50:02.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:50:02.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:50:02.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:50:02.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:50:02.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:50:12, diff=-9.206955s, valid=True
2026-06-03T16:50:02.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:50:02.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:50:02.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:50:02.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72399.793819s, valid=False
2026-06-03T16:50:02.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:50:02.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:50:02.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:50:02.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:50:02.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:50:02.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:50:02.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:50:02.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:50:02.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:50:02.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:50:02.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:50:03.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:50:03.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:50:03.114 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:50:03.313 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:50:03.645 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:50:03.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:50:03.746 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:50:03.746 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:50:03.926 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:50:03.926 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:50:33.930 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:50:33.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:50:33.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:50:34.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:50:34.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:50:34.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:50:34.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:50:34.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:50:34.993 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:50:35.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:50:35.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:50:35.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:50:35.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:50:37.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:50:37.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:50:37.782 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:50:37.783 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:50:37.794 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:50:37.807 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:50:37.808 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:50:37.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:50:37.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:50:37.810 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:50:37.810 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:50:37.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:50:37.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:50:37.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:50:38.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:50:38.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:50:38.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:50:38.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:50:38.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:50:38.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:50:38.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:50:38.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:50:38.143 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:50:38.211 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:50:15
2026-06-03T16:50:38.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86543, datetime.datetime(2026, 6, 3, 16, 50, 15), datetime.datetime(2026, 6, 3, 16, 50, 14), 'salt', 6.61, 100.37, None, 28.19, 142.67, -0.06, 821.2, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:50:38.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:50:38.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:50:38.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:50:14, diff=24.217944s, valid=True
2026-06-03T16:50:38.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:50:38.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:50:38.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:50:12, diff=26.221083s, valid=True
2026-06-03T16:50:38.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:50:38.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:50:38.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:50:09, diff=29.228305s, valid=True
2026-06-03T16:50:38.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:50:38.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:50:38.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:50:38.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:50:38.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:50:38.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:50:38.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:50:12, diff=26.231589s, valid=True
2026-06-03T16:50:38.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:50:38.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:50:38.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:50:38.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72435.232303s, valid=False
2026-06-03T16:50:38.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:50:38.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:50:38.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:50:38.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:50:38.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:50:38.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:50:38.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:50:38.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:50:38.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:50:38.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:50:38.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:50:38.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:50:38.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:50:38.550 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:50:38.834 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:50:39.189 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:50:39.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:50:39.291 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:50:39.291 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:50:39.443 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:50:39.443 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:51:09.466 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:51:09.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:51:09.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:51:09.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:51:09.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:51:10.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:51:10.034 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:51:10.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:51:10.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:51:10.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:51:10.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:51:10.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:51:10.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:51:12.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:51:12.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:51:12.873 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:51:12.874 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:51:12.884 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:51:12.897 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:51:12.898 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:51:12.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:51:12.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:51:12.899 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:51:12.899 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:51:12.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:51:13.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:51:13.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:51:13.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:51:13.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:51:13.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:51:13.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:51:13.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:51:13.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:51:13.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:51:13.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:51:13.236 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:51:13.306 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:50:45
2026-06-03T16:51:13.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86544, datetime.datetime(2026, 6, 3, 16, 50, 45), datetime.datetime(2026, 6, 3, 16, 50, 45), 'salt', 6.67, 100.08, None, 29.0, 129.05, -0.02, 821.14, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:51:13.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:51:13.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:51:13.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:50:45, diff=28.312018s, valid=True
2026-06-03T16:51:13.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:51:13.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:51:13.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:51:12, diff=1.314962s, valid=True
2026-06-03T16:51:13.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:51:13.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:51:13.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:50:39, diff=34.321627s, valid=True
2026-06-03T16:51:13.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:51:13.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:51:13.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:51:13.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:51:13.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:51:13.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:51:13.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:51:12, diff=1.324604s, valid=True
2026-06-03T16:51:13.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:51:13.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:51:13.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:51:13.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72470.325254s, valid=False
2026-06-03T16:51:13.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:51:13.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:51:13.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:51:13.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:51:13.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:51:13.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:51:13.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:51:13.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:51:13.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:51:13.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:51:13.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:51:13.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:51:13.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:51:13.639 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:51:13.846 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:51:14.189 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:51:14.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:51:14.292 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:51:14.292 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:51:14.362 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:51:14.363 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:51:44.393 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:51:44.393 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:51:44.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:51:44.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:51:44.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:51:44.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:51:44.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:51:44.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:51:44.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:51:44.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:51:44.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:51:44.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:51:44.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:51:47.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:51:47.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:51:47.460 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:51:47.460 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:51:47.470 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:51:47.483 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:51:47.484 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:51:47.484 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:51:47.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:51:47.485 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:51:47.485 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:51:47.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:51:47.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:51:47.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:51:47.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:51:47.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:51:47.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:51:47.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:51:47.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:51:47.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:51:47.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:51:47.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:51:47.826 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:51:47.898 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:51:46
2026-06-03T16:51:47.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86546, datetime.datetime(2026, 6, 3, 16, 51, 46), datetime.datetime(2026, 6, 3, 16, 51, 45), 'salt', 6.71, 100.04, None, 27.52, 130.49, -0.01, 821.14, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:51:47.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:51:47.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:51:47.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:51:45, diff=2.905796s, valid=True
2026-06-03T16:51:47.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:51:47.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:51:47.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:52:12, diff=-24.090725s, valid=True
2026-06-03T16:51:47.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:51:47.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:51:47.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:51:42, diff=5.917407s, valid=True
2026-06-03T16:51:47.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:51:47.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:51:47.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:51:47.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:51:47.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:51:47.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:51:47.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:52:12, diff=-24.078867s, valid=True
2026-06-03T16:51:47.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:51:47.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:51:47.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:51:47.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72504.921949s, valid=False
2026-06-03T16:51:47.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:51:47.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:51:47.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:51:47.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:51:47.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:51:47.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:51:47.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:51:47.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:51:48.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:51:48.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:51:48.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:51:48.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:51:48.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:51:48.313 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:51:48.517 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:51:48.857 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:51:48.959 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:51:48.960 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:51:48.960 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:51:49.033 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:51:49.033 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:52:19.050 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:52:19.050 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:52:19.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:52:19.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:52:19.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:52:19.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:52:19.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:52:19.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:52:19.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:52:19.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:52:19.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:52:19.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:52:19.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:52:22.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:52:22.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:52:22.391 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:52:22.392 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:52:22.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:52:22.416 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:52:22.416 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:52:22.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:52:22.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:52:22.418 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:52:22.418 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:52:22.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:52:22.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:52:22.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:52:22.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:52:22.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:52:22.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:52:22.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:52:22.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:52:22.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:52:22.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:52:22.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:52:22.756 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:52:22.828 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:52:16
2026-06-03T16:52:22.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86547, datetime.datetime(2026, 6, 3, 16, 52, 16), datetime.datetime(2026, 6, 3, 16, 52, 16), 'salt', 6.77, 100.07, None, 35.14, 130.09, -0.02, 821.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:52:22.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:52:22.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:52:22.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:52:16, diff=6.835825s, valid=True
2026-06-03T16:52:22.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:52:22.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:52:22.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:52:12, diff=10.839289s, valid=True
2026-06-03T16:52:22.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:52:22.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:52:22.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:52:13, diff=9.847442s, valid=True
2026-06-03T16:52:22.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:52:22.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:52:22.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:52:22.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:52:22.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:52:22.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:52:22.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:52:12, diff=10.8512s, valid=True
2026-06-03T16:52:22.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:52:22.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:52:22.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:52:22.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72539.852008s, valid=False
2026-06-03T16:52:22.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:52:22.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:52:22.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:52:22.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:52:22.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:52:22.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:52:22.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:52:22.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:52:22.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:52:22.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:52:23.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:52:23.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:52:23.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:52:23.172 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:52:23.380 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:52:23.719 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:52:23.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:52:23.821 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:52:23.821 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:52:24.003 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:52:24.003 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:52:54.014 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:52:54.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:52:54.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:52:54.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:52:54.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:52:54.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:52:54.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:52:54.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:52:54.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:52:54.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:52:54.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:52:54.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:52:54.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:52:57.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:52:57.372 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:52:57.372 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:52:57.372 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:52:57.383 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:52:57.396 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:52:57.396 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:52:57.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:52:57.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:52:57.397 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:52:57.398 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:52:57.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:52:57.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:52:57.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:52:57.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:52:57.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:52:57.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:52:57.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:52:57.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:52:57.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:52:57.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:52:57.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:52:57.754 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:52:57.827 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:52:47
2026-06-03T16:52:57.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86548, datetime.datetime(2026, 6, 3, 16, 52, 47), datetime.datetime(2026, 6, 3, 16, 52, 46), 'salt', 6.77, 100.17, None, 38.21, 125.84, -0.03, 820.89, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:52:57.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:52:57.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:52:57.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:52:46, diff=11.834869s, valid=True
2026-06-03T16:52:57.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:52:57.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:52:57.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:53:12, diff=-14.161845s, valid=True
2026-06-03T16:52:57.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:52:57.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:52:57.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:52:45, diff=12.845697s, valid=True
2026-06-03T16:52:57.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:52:57.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:52:57.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:52:57.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:52:57.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:52:57.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:52:57.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:53:12, diff=-14.150877s, valid=True
2026-06-03T16:52:57.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:52:57.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:52:57.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:52:57.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72574.849875s, valid=False
2026-06-03T16:52:57.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:52:57.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:52:57.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:52:57.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:52:57.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:52:57.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:52:57.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:52:57.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:52:57.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:52:57.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:52:58.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:52:58.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:52:58.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:52:58.238 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:52:58.443 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:52:58.784 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:52:58.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:52:58.888 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:52:58.888 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:52:59.068 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:52:59.069 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:53:29.089 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:53:29.089 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:53:29.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:53:29.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:53:29.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:53:30.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:53:30.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:53:30.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:53:30.090 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:53:30.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:53:30.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:53:30.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:53:30.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:53:33.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:53:33.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:53:33.356 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:53:33.356 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:53:33.366 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:53:33.379 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:53:33.379 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:53:33.380 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:53:33.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:53:33.380 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:53:33.381 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:53:33.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:53:33.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:53:33.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:53:33.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:53:33.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:53:33.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:53:33.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:53:33.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:53:33.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:53:33.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:53:33.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:53:33.714 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:53:33.793 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:53:17
2026-06-03T16:53:33.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86549, datetime.datetime(2026, 6, 3, 16, 53, 17), datetime.datetime(2026, 6, 3, 16, 53, 16), 'salt', 6.74, 100.14, None, 37.19, 131.92, -0.03, 821.2, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:53:33.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:53:33.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:53:33.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:53:16, diff=17.801139s, valid=True
2026-06-03T16:53:33.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:53:33.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:53:33.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:53:12, diff=21.804609s, valid=True
2026-06-03T16:53:33.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:53:33.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:53:33.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:53:16, diff=17.8128s, valid=True
2026-06-03T16:53:33.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:53:33.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:53:33.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:53:33.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:53:33.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:53:33.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:53:33.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:53:12, diff=21.816518s, valid=True
2026-06-03T16:53:33.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:53:33.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:53:33.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:53:33.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72610.817341s, valid=False
2026-06-03T16:53:33.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:53:33.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:53:33.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:53:33.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:53:33.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:53:33.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:53:33.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:53:33.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:53:33.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:53:33.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:53:34.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:53:34.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:53:34.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:53:34.139 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:53:34.343 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:53:34.681 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:53:34.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:53:34.784 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:53:34.784 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:53:34.997 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:53:34.997 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:54:05.011 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:54:05.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:54:05.012 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:54:05.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:54:05.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:54:05.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:54:05.715 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:54:05.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:54:05.726 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:54:05.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:54:05.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:54:05.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:54:05.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:54:08.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:54:08.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:54:08.295 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:54:08.295 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:54:08.306 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:54:08.318 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:54:08.319 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:54:08.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:54:08.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:54:08.320 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:54:08.320 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:54:08.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:54:08.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:54:08.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:54:08.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:54:08.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:54:08.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:54:08.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:54:08.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:54:08.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:54:08.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:54:08.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:54:08.648 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:54:08.723 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:53:47
2026-06-03T16:54:08.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86550, datetime.datetime(2026, 6, 3, 16, 53, 47), datetime.datetime(2026, 6, 3, 16, 53, 46), 'salt', 6.67, 100.04, None, 28.86, 121.05, -0.02, 821.2, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:54:08.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:54:08.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:54:08.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:53:46, diff=22.730967s, valid=True
2026-06-03T16:54:08.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:54:08.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:54:08.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:54:12, diff=-3.265549s, valid=True
2026-06-03T16:54:08.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:54:08.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:54:08.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:53:41, diff=27.7426s, valid=True
2026-06-03T16:54:08.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:54:08.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:54:08.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:54:08.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:54:08.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:54:08.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:54:08.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:54:12, diff=-3.253698s, valid=True
2026-06-03T16:54:08.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:54:08.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:54:08.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:54:08.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72645.747124s, valid=False
2026-06-03T16:54:08.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:54:08.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:54:08.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:54:08.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:54:08.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:54:08.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:54:08.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:54:08.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:54:08.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:54:08.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:54:09.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:54:09.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:54:09.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:54:09.135 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:54:09.341 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:54:09.681 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:54:09.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:54:09.790 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:54:09.790 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:54:10.505 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:54:10.505 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:54:40.532 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:54:40.533 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:54:40.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:54:40.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:54:40.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:54:40.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:54:40.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:54:40.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:54:40.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:54:40.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:54:40.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:54:40.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:54:40.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:54:43.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:54:43.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:54:43.641 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:54:43.642 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:54:43.651 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:54:43.664 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:54:43.664 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:54:43.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:54:43.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:54:43.665 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:54:43.666 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:54:43.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:54:43.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:54:43.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:54:43.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:54:43.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:54:43.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:54:43.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:54:43.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:54:43.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:54:43.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:54:43.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:54:43.994 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:54:44.067 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:54:17
2026-06-03T16:54:44.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86551, datetime.datetime(2026, 6, 3, 16, 54, 17), datetime.datetime(2026, 6, 3, 16, 54, 17), 'salt', 6.81, 100.11, None, 31.37, 118.09, -0.02, 821.26, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:54:44.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:54:44.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:54:44.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:54:17, diff=27.074703s, valid=True
2026-06-03T16:54:44.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:54:44.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:54:44.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:54:12, diff=32.078066s, valid=True
2026-06-03T16:54:44.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:54:44.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:54:44.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:54:11, diff=33.085939s, valid=True
2026-06-03T16:54:44.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:54:44.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:54:44.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:54:44.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:54:44.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:54:44.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:54:44.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:54:12, diff=32.089503s, valid=True
2026-06-03T16:54:44.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:54:44.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:54:44.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:54:44.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72681.090289s, valid=False
2026-06-03T16:54:44.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:54:44.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:54:44.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:54:44.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:54:44.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:54:44.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:54:44.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:54:44.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:54:44.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:54:44.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:54:44.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:54:44.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:54:44.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:54:44.408 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:54:44.614 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:54:44.953 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:54:45.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:54:45.055 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:54:45.055 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:54:45.334 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:54:45.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:55:15.365 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:55:15.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:55:15.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:55:15.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:55:15.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:55:16.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:55:16.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:55:16.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:55:16.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:55:16.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:55:16.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:55:16.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:55:16.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:55:19.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:55:19.079 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:55:19.080 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:55:19.080 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:55:19.089 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:55:19.101 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:55:19.102 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:55:19.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:55:19.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:55:19.102 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:55:19.103 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:55:19.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:55:19.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:55:19.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:55:19.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:55:19.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:55:19.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:55:19.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:55:19.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:55:19.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:55:19.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:55:19.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:55:19.422 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:55:19.492 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:55:18
2026-06-03T16:55:19.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86553, datetime.datetime(2026, 6, 3, 16, 55, 18), datetime.datetime(2026, 6, 3, 16, 55, 17), 'salt', 6.77, 100.14, None, 32.88, 138.12, -0.03, 821.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:55:19.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:55:19.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:55:19.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:55:17, diff=2.500002s, valid=True
2026-06-03T16:55:19.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:55:19.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:55:19.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:55:12, diff=7.503465s, valid=True
2026-06-03T16:55:19.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:55:19.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:55:19.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:55:12, diff=7.511542s, valid=True
2026-06-03T16:55:19.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:55:19.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:55:19.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:55:19.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:55:19.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:55:19.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:55:19.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:55:12, diff=7.51526s, valid=True
2026-06-03T16:55:19.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:55:19.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:55:19.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:55:19.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72716.516065s, valid=False
2026-06-03T16:55:19.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:55:19.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:55:19.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:55:19.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:55:19.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:55:19.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:55:19.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:55:19.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:55:19.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:55:19.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:55:19.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:55:19.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:55:19.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:55:19.835 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:55:20.054 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:55:20.398 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:55:20.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:55:20.500 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:55:20.500 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:55:20.750 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:55:20.751 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:55:50.781 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:55:50.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:55:50.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:55:51.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:55:51.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:55:51.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:55:51.461 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:55:51.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:55:51.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:55:51.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:55:51.483 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:55:51.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:55:51.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:55:54.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:55:54.430 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:55:54.431 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:55:54.431 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:55:54.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:55:54.453 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:55:54.454 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:55:54.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:55:54.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:55:54.455 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:55:54.455 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:55:54.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:55:54.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:55:54.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:55:54.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:55:54.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:55:54.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:55:54.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:55:54.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:55:54.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:55:54.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:55:54.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:55:54.787 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:55:54.857 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:55:48
2026-06-03T16:55:54.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86554, datetime.datetime(2026, 6, 3, 16, 55, 48), datetime.datetime(2026, 6, 3, 16, 55, 47), 'salt', 6.81, 100.14, None, 46.33, 125.98, -0.02, 820.83, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T16:55:54.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:55:54.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:55:54.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:55:47, diff=7.865302s, valid=True
2026-06-03T16:55:54.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:55:54.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:55:54.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:56:12, diff=-17.131213s, valid=True
2026-06-03T16:55:54.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:55:54.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:55:54.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:55:43, diff=11.876866s, valid=True
2026-06-03T16:55:54.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:55:54.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:55:54.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:55:54.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:55:54.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:55:54.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:55:54.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:56:12, diff=-17.119456s, valid=True
2026-06-03T16:55:54.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:55:54.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:55:54.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:55:54.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72751.881367s, valid=False
2026-06-03T16:55:54.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:55:54.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:55:54.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:55:54.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:55:54.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:55:54.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:55:54.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:55:54.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:55:54.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:55:55.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:55:55.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:55:55.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:55:55.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:55:55.201 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:55:55.465 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:55:55.801 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:55:55.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:55:55.905 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:55:55.905 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:55:56.068 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:55:56.068 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:56:26.078 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:56:26.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:56:26.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:56:26.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:56:26.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:56:26.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:56:26.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:56:26.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:56:26.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:56:26.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:56:26.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:56:26.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:56:26.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:56:29.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:56:29.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:56:29.231 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:56:29.231 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:56:29.241 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:56:29.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:56:29.255 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:56:29.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:56:29.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:56:29.256 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:56:29.256 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:56:29.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:56:29.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:56:29.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:56:29.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:56:29.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:56:29.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:56:29.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:56:29.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:56:29.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:56:29.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:56:29.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:56:29.587 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:56:29.658 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:56:18
2026-06-03T16:56:29.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86555, datetime.datetime(2026, 6, 3, 16, 56, 18), datetime.datetime(2026, 6, 3, 16, 56, 18), 'salt', 6.74, 100.07, None, 43.08, 121.75, -0.02, 820.77, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T16:56:29.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:56:29.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:56:29.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:56:18, diff=11.665548s, valid=True
2026-06-03T16:56:29.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:56:29.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:56:29.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:56:12, diff=17.669025s, valid=True
2026-06-03T16:56:29.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:56:29.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:56:29.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:56:15, diff=14.677198s, valid=True
2026-06-03T16:56:29.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:56:29.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:56:29.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:56:29.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:56:29.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:56:29.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:56:29.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:56:12, diff=17.68141s, valid=True
2026-06-03T16:56:29.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:56:29.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:56:29.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:56:29.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72786.682324s, valid=False
2026-06-03T16:56:29.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:56:29.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:56:29.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:56:29.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:56:29.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:56:29.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:56:29.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:56:29.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:56:29.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:56:29.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:56:29.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:56:29.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:56:29.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:56:30.024 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:56:30.235 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:56:30.573 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:56:30.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:56:30.675 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:56:30.675 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:56:30.858 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:56:30.858 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:57:00.879 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:57:00.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:57:00.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:57:01.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:57:01.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:57:01.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:57:01.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:57:01.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:57:01.274 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:57:01.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:57:01.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:57:01.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:57:01.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:57:04.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:57:04.036 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:57:04.037 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:57:04.037 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:57:04.047 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:57:04.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:57:04.060 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:57:04.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:57:04.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:57:04.061 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:57:04.062 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:57:04.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:57:04.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:57:04.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:57:04.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:57:04.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:57:04.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:57:04.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:57:04.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:57:04.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:57:04.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:57:04.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:57:04.390 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:57:04.459 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:56:49
2026-06-03T16:57:04.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86556, datetime.datetime(2026, 6, 3, 16, 56, 49), datetime.datetime(2026, 6, 3, 16, 56, 48), 'salt', 6.81, 100.21, None, 41.88, 120.65, -0.03, 820.95, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T16:57:04.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:57:04.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:57:04.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:56:48, diff=16.4664s, valid=True
2026-06-03T16:57:04.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:57:04.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:57:04.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:57:12, diff=-7.530151s, valid=True
2026-06-03T16:57:04.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:57:04.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:57:04.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:56:46, diff=18.477998s, valid=True
2026-06-03T16:57:04.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:57:04.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:57:04.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:57:04.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:57:04.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:57:04.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:57:04.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:57:12, diff=-7.518237s, valid=True
2026-06-03T16:57:04.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:57:04.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:57:04.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:57:04.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72821.48256s, valid=False
2026-06-03T16:57:04.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:57:04.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:57:04.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:57:04.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:57:04.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:57:04.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:57:04.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:57:04.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:57:04.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:57:04.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:57:04.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:57:04.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:57:04.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:57:04.874 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:57:05.078 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:57:05.415 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:57:05.518 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:57:05.518 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:57:05.519 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:57:05.768 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:57:05.768 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:57:35.771 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:57:35.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:57:35.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:57:36.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:57:36.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:57:36.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:57:36.525 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:57:36.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:57:36.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:57:36.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:57:36.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:57:36.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:57:36.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:57:39.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:57:39.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:57:39.246 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:57:39.247 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:57:39.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:57:39.269 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:57:39.269 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:57:39.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:57:39.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:57:39.270 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:57:39.271 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:57:39.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:57:39.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:57:39.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:57:39.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:57:39.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:57:39.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:57:39.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:57:39.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:57:39.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:57:39.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:57:39.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:57:39.615 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:57:39.686 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:57:19
2026-06-03T16:57:39.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86557, datetime.datetime(2026, 6, 3, 16, 57, 19), datetime.datetime(2026, 6, 3, 16, 57, 18), 'salt', 6.81, 100.14, None, 42.8, 119.83, -0.02, 820.9, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T16:57:39.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:57:39.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:57:39.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:57:18, diff=21.693785s, valid=True
2026-06-03T16:57:39.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:57:39.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:57:39.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:57:12, diff=27.697287s, valid=True
2026-06-03T16:57:39.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:57:39.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:57:39.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:57:17, diff=22.705483s, valid=True
2026-06-03T16:57:39.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:57:39.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:57:39.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:57:39.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:57:39.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:57:39.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:57:39.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:57:12, diff=27.709213s, valid=True
2026-06-03T16:57:39.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:57:39.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:57:39.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:57:39.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72856.710046s, valid=False
2026-06-03T16:57:39.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:57:39.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:57:39.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:57:39.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:57:39.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:57:39.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:57:39.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:57:39.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:57:39.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:57:39.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:57:39.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:57:39.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:57:40.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:57:40.048 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:57:40.260 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:57:40.615 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:57:40.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:57:40.721 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:57:40.722 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:57:40.798 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:57:40.798 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:58:10.800 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:58:10.801 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:58:10.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:58:11.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:58:11.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:58:11.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:58:11.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:58:11.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:58:11.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:58:11.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:58:11.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:58:11.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:58:11.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:58:14.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:58:14.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:58:14.015 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:58:14.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:58:14.027 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:58:14.040 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:58:14.041 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:58:14.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:58:14.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:58:14.042 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:58:14.042 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:58:14.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:58:14.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:58:14.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:58:14.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:58:14.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:58:14.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:58:14.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:58:14.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:58:14.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:58:14.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:58:14.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:58:14.377 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:58:14.446 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:57:49
2026-06-03T16:58:14.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86558, datetime.datetime(2026, 6, 3, 16, 57, 49), datetime.datetime(2026, 6, 3, 16, 57, 49), 'salt', 6.84, 100.21, None, 36.2, 121.0, -0.04, 820.9, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T16:58:14.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:58:14.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:58:14.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:57:49, diff=25.454313s, valid=True
2026-06-03T16:58:14.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:58:14.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:58:14.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:58:12, diff=2.457808s, valid=True
2026-06-03T16:58:14.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:58:14.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:58:14.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:57:49, diff=25.466052s, valid=True
2026-06-03T16:58:14.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:58:14.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:58:14.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:58:14.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:58:14.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:58:14.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:58:14.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:58:12, diff=2.469787s, valid=True
2026-06-03T16:58:14.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:58:14.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:58:14.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:58:14.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72891.470601s, valid=False
2026-06-03T16:58:14.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:58:14.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:58:14.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:58:14.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:58:14.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:58:14.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:58:14.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:58:14.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:58:14.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:58:14.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:58:14.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:58:14.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:58:14.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:58:14.861 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:58:15.066 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:58:15.408 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:58:15.510 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:58:15.510 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:58:15.510 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:58:15.677 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:58:15.677 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:58:45.677 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:58:45.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:58:45.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:58:46.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:58:46.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:58:46.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:58:46.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:58:46.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:58:46.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:58:46.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:58:46.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:58:46.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:58:46.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:58:49.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:58:49.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:58:49.275 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:58:49.275 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:58:49.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:58:49.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:58:49.296 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:58:49.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:58:49.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:58:49.297 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:58:49.298 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:58:49.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:58:49.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T16:58:49.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:58:49.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T16:58:49.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:58:49.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:58:49.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:58:49.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:58:49.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:58:49.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:58:49.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:58:49.661 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:58:49.729 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:58:20
2026-06-03T16:58:49.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86559, datetime.datetime(2026, 6, 3, 16, 58, 20), datetime.datetime(2026, 6, 3, 16, 58, 19), 'salt', 6.81, 100.18, None, 41.49, 123.3, -0.03, 820.89, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T16:58:49.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:58:49.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T16:58:49.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:58:19, diff=30.736843s, valid=True
2026-06-03T16:58:49.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:58:49.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:58:49.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:58:12, diff=37.740431s, valid=True
2026-06-03T16:58:49.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:58:49.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T16:58:49.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:58:13, diff=36.749027s, valid=True
2026-06-03T16:58:49.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:58:49.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:58:49.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:58:49.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:58:49.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:58:49.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:58:49.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:58:12, diff=37.752887s, valid=True
2026-06-03T16:58:49.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:58:49.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:58:49.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:58:49.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72926.753721s, valid=False
2026-06-03T16:58:49.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:58:49.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:58:49.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:58:49.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:58:49.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:58:49.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:58:49.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:58:49.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:58:49.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:58:49.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:58:49.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:58:49.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:58:50.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:58:50.090 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:58:50.298 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:58:50.637 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:58:50.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:58:50.740 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:58:50.740 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:58:50.929 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:58:50.929 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:59:20.930 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:59:20.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:59:20.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:59:21.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:59:21.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:59:21.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:59:21.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:59:21.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:59:21.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:59:21.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:59:21.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:59:21.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:59:21.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:59:23.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:59:23.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:59:23.919 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:59:23.919 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:59:23.930 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:59:23.943 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:59:23.943 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:59:23.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:59:23.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:59:23.944 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:59:23.945 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:59:23.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:59:24.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:59:24.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:59:24.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:59:24.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:59:24.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:59:24.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:59:24.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T16:59:24.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:59:24.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:59:24.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:59:24.287 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:59:24.366 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:59:20
2026-06-03T16:59:24.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86561, datetime.datetime(2026, 6, 3, 16, 59, 20), datetime.datetime(2026, 6, 3, 16, 59, 19), 'salt', 6.77, 100.14, None, 50.1, 124.8, -0.03, 820.59, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T16:59:24.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:59:24.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:59:24.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:59:19, diff=5.373314s, valid=True
2026-06-03T16:59:24.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:59:24.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:59:24.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:59:12, diff=12.376747s, valid=True
2026-06-03T16:59:24.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:59:24.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:59:24.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:59:13, diff=11.384833s, valid=True
2026-06-03T16:59:24.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:59:24.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:59:24.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:59:24.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:59:24.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:59:24.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T16:59:24.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:59:12, diff=12.388515s, valid=True
2026-06-03T16:59:24.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:59:24.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:59:24.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:59:24.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72961.38933s, valid=False
2026-06-03T16:59:24.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:59:24.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:59:24.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:59:24.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:59:24.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:59:24.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:59:24.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:59:24.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:59:24.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:59:24.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:59:24.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:59:24.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:59:24.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:59:24.777 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:59:24.982 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:59:25.322 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T16:59:25.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T16:59:25.424 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T16:59:25.424 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T16:59:25.605 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T16:59:25.606 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T16:59:55.636 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T16:59:55.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T16:59:55.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T16:59:55.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T16:59:55.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T16:59:56.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T16:59:56.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T16:59:56.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T16:59:56.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T16:59:56.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T16:59:56.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T16:59:56.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T16:59:56.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T16:59:58.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T16:59:58.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T16:59:58.878 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T16:59:58.878 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T16:59:58.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T16:59:58.900 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T16:59:58.901 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T16:59:58.901 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T16:59:58.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T16:59:58.902 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T16:59:58.902 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T16:59:58.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T16:59:59.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T16:59:59.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T16:59:59.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T16:59:59.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:59:59.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:59:59.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T16:59:59.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T16:59:59.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T16:59:59.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T16:59:59.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T16:59:59.236 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T16:59:59.304 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 16:59:50
2026-06-03T16:59:59.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86562, datetime.datetime(2026, 6, 3, 16, 59, 50), datetime.datetime(2026, 6, 3, 16, 59, 50), 'salt', 6.77, 100.14, None, 43.01, 128.07, -0.03, 820.65, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T16:59:59.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T16:59:59.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T16:59:59.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:59:50, diff=9.311798s, valid=True
2026-06-03T16:59:59.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T16:59:59.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:59:59.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:00:12, diff=-12.684741s, valid=True
2026-06-03T16:59:59.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T16:59:59.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T16:59:59.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 16:59:45, diff=14.323434s, valid=True
2026-06-03T16:59:59.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T16:59:59.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:59:59.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T16:59:59.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T16:59:59.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T16:59:59.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T16:59:59.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:00:12, diff=-12.672869s, valid=True
2026-06-03T16:59:59.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T16:59:59.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T16:59:59.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T16:59:59.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=72996.327944s, valid=False
2026-06-03T16:59:59.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T16:59:59.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T16:59:59.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T16:59:59.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T16:59:59.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T16:59:59.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T16:59:59.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T16:59:59.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T16:59:59.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T16:59:59.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T16:59:59.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T16:59:59.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T16:59:59.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T16:59:59.646 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T16:59:59.853 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:00:00.205 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:00:00.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:00:00.312 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:00:00.312 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:00:00.387 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:00:00.387 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:00:30.401 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:00:30.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:00:30.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:00:30.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:00:30.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:00:31.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:00:31.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:00:31.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:00:31.019 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:00:31.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:00:31.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:00:31.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:00:31.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:00:33.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:00:33.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:00:33.870 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:00:33.870 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:00:33.880 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:00:33.892 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:00:33.893 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:00:33.893 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:00:33.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:00:33.894 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:00:33.894 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:00:33.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:00:34.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:00:34.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:00:34.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:00:34.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:00:34.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:00:34.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:00:34.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:00:34.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:00:34.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:00:34.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:00:34.247 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:00:34.321 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:00:20
2026-06-03T17:00:34.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86563, datetime.datetime(2026, 6, 3, 17, 0, 20), datetime.datetime(2026, 6, 3, 17, 0, 20), 'salt', 6.84, 100.14, None, 41.0, 127.11, -0.03, 820.71, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:00:34.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:00:34.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:00:34.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:00:20, diff=14.328421s, valid=True
2026-06-03T17:00:34.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:00:34.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:00:34.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:00:12, diff=22.331958s, valid=True
2026-06-03T17:00:34.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:00:34.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:00:34.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:00:19, diff=15.34011s, valid=True
2026-06-03T17:00:34.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:00:34.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:00:34.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:00:34.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:00:34.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:00:34.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:00:34.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:00:12, diff=22.343831s, valid=True
2026-06-03T17:00:34.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:00:34.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:00:34.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:00:34.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73031.344632s, valid=False
2026-06-03T17:00:34.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:00:34.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:00:34.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:00:34.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:00:34.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:00:34.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:00:34.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:00:34.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:00:34.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:00:34.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:00:34.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:00:34.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:00:34.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:00:34.664 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:00:34.869 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:00:35.228 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:00:35.330 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:00:35.330 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:00:35.330 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:00:35.580 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:00:35.580 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:01:05.588 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:01:05.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:01:05.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:01:05.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:01:05.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:01:06.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:01:06.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:01:06.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:01:06.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:01:06.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:01:06.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:01:06.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:01:06.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:01:08.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:01:08.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:01:08.679 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:01:08.679 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:01:08.690 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:01:08.703 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:01:08.703 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:01:08.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:01:08.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:01:08.704 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:01:08.705 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:01:08.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:01:08.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:01:08.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:01:08.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:01:08.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:01:08.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:01:08.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:01:09.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:01:09.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:01:09.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:01:09.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:01:09.042 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:01:09.137 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:00:51
2026-06-03T17:01:09.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86564, datetime.datetime(2026, 6, 3, 17, 0, 51), datetime.datetime(2026, 6, 3, 17, 0, 50), 'salt', 6.77, 100.14, None, 46.96, 129.22, -0.03, 820.77, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:01:09.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:01:09.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:01:09.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:00:50, diff=19.144874s, valid=True
2026-06-03T17:01:09.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:01:09.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:01:09.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:01:12, diff=-2.851669s, valid=True
2026-06-03T17:01:09.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:01:09.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:01:09.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:00:49, diff=20.156592s, valid=True
2026-06-03T17:01:09.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:01:09.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:01:09.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:01:09.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:01:09.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:01:09.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:01:09.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:01:12, diff=-2.839675s, valid=True
2026-06-03T17:01:09.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:01:09.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:01:09.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:01:09.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73066.161137s, valid=False
2026-06-03T17:01:09.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:01:09.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:01:09.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:01:09.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:01:09.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:01:09.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:01:09.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:01:09.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:01:09.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:01:09.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:01:09.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:01:09.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:01:09.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:01:09.480 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:01:09.745 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:01:10.118 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:01:10.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:01:10.226 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:01:10.226 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:01:10.494 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:01:10.494 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:01:40.502 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:01:40.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:01:40.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:01:40.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:01:40.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:01:40.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:01:40.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:01:40.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:01:40.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:01:40.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:01:40.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:01:40.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:01:40.940 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:01:43.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:01:43.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:01:43.690 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:01:43.690 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:01:43.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:01:43.713 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:01:43.714 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:01:43.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:01:43.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:01:43.715 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:01:43.715 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:01:43.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:01:43.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T17:01:43.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:01:43.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T17:01:43.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:01:44.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:01:44.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:01:44.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:01:44.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:01:44.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:01:44.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:01:44.060 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:01:44.131 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:01:21
2026-06-03T17:01:44.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86565, datetime.datetime(2026, 6, 3, 17, 1, 21), datetime.datetime(2026, 6, 3, 17, 1, 20), 'salt', 6.71, 100.04, None, 49.92, 122.72, -0.01, 820.59, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:01:44.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:01:44.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T17:01:44.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:01:20, diff=24.139189s, valid=True
2026-06-03T17:01:44.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:01:44.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:01:44.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:01:12, diff=32.142699s, valid=True
2026-06-03T17:01:44.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:01:44.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T17:01:44.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:01:19, diff=25.150837s, valid=True
2026-06-03T17:01:44.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:01:44.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:01:44.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:01:44.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:01:44.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:01:44.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:01:44.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:01:12, diff=32.154542s, valid=True
2026-06-03T17:01:44.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:01:44.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:01:44.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:01:44.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73101.155352s, valid=False
2026-06-03T17:01:44.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:01:44.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:01:44.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:01:44.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:01:44.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:01:44.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:01:44.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:01:44.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:01:44.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:01:44.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:01:44.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:01:44.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:01:44.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:01:44.476 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:01:44.685 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:01:45.027 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:01:45.130 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:01:45.130 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:01:45.131 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:01:45.319 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:01:45.319 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:02:15.347 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:02:15.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:02:15.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:02:15.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:02:15.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:02:15.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:02:15.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:02:15.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:02:15.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:02:15.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:02:15.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:02:15.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:02:15.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:02:18.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:02:18.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:02:18.452 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:02:18.452 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:02:18.463 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:02:18.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:02:18.476 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:02:18.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:02:18.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:02:18.477 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:02:18.478 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:02:18.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:02:18.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T17:02:18.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:02:18.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T17:02:18.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:02:18.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:02:18.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:02:18.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:02:18.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:02:18.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:02:18.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:02:18.814 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:02:18.884 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:01:51
2026-06-03T17:02:18.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86566, datetime.datetime(2026, 6, 3, 17, 1, 51), datetime.datetime(2026, 6, 3, 17, 1, 51), 'salt', 6.81, 100.11, None, 36.27, 132.15, -0.02, 820.83, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:02:18.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:02:18.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T17:02:18.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:01:51, diff=27.89199s, valid=True
2026-06-03T17:02:18.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:02:18.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:02:18.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:02:12, diff=6.895455s, valid=True
2026-06-03T17:02:18.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:02:18.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T17:02:18.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:01:50, diff=28.903552s, valid=True
2026-06-03T17:02:18.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:02:18.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:02:18.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:02:18.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:02:18.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:02:18.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:02:18.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:02:12, diff=6.907284s, valid=True
2026-06-03T17:02:18.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:02:18.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:02:18.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:02:18.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73135.908113s, valid=False
2026-06-03T17:02:18.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:02:18.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:02:18.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:02:18.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:02:18.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:02:18.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:02:18.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:02:18.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:02:18.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:02:19.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:02:19.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:02:19.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:02:19.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:02:19.301 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:02:19.505 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:02:19.849 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:02:19.960 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:02:19.960 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:02:19.960 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:02:20.128 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:02:20.128 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:02:50.158 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:02:50.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:02:50.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:02:50.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:02:50.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:02:50.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:02:50.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:02:50.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:02:50.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:02:50.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:02:50.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:02:50.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:02:50.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:02:53.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:02:53.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:02:53.219 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:02:53.219 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:02:53.229 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:02:53.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:02:53.242 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:02:53.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:02:53.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:02:53.244 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:02:53.244 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:02:53.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:02:53.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:02:53.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:02:53.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:02:53.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:02:53.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:02:53.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:02:53.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:02:53.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:02:53.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:02:53.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:02:53.575 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:02:53.647 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:02:52
2026-06-03T17:02:53.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86568, datetime.datetime(2026, 6, 3, 17, 2, 52), datetime.datetime(2026, 6, 3, 17, 2, 51), 'salt', 6.77, 100.11, None, 41.78, 123.77, -0.03, 820.83, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:02:53.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:02:53.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:02:53.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:02:51, diff=2.654862s, valid=True
2026-06-03T17:02:53.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:02:53.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:02:53.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:03:12, diff=-18.341773s, valid=True
2026-06-03T17:02:53.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:02:53.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:02:53.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:02:50, diff=3.666106s, valid=True
2026-06-03T17:02:53.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:02:53.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:02:53.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:02:53.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:02:53.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:02:53.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:02:53.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:03:12, diff=-18.330229s, valid=True
2026-06-03T17:02:53.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:02:53.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:02:53.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:02:53.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73170.67056s, valid=False
2026-06-03T17:02:53.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:02:53.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:02:53.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:02:53.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:02:53.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:02:53.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:02:53.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:02:53.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:02:53.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:02:53.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:02:53.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:02:53.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:02:53.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:02:53.990 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:02:54.194 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:02:54.533 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:02:54.634 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:02:54.635 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:02:54.635 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:02:54.840 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:02:54.840 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:03:24.843 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:03:24.843 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:03:24.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:03:25.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:03:25.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:03:25.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:03:25.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:03:25.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:03:25.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:03:25.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:03:25.461 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:03:25.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:03:25.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:03:28.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:03:28.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:03:28.594 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:03:28.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:03:28.605 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:03:28.617 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:03:28.618 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:03:28.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:03:28.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:03:28.619 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:03:28.619 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:03:28.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:03:28.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:03:28.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:03:28.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:03:28.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:03:28.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:03:28.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:03:28.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:03:28.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:03:28.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:03:28.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:03:28.952 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:03:29.022 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:03:22
2026-06-03T17:03:29.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86569, datetime.datetime(2026, 6, 3, 17, 3, 22), datetime.datetime(2026, 6, 3, 17, 3, 21), 'salt', 6.81, 100.17, None, 45.76, 124.59, -0.03, 820.89, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:03:29.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:03:29.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:03:29.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:03:21, diff=8.029948s, valid=True
2026-06-03T17:03:29.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:03:29.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:03:29.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:03:12, diff=17.033392s, valid=True
2026-06-03T17:03:29.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:03:29.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:03:29.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:03:20, diff=9.041586s, valid=True
2026-06-03T17:03:29.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:03:29.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:03:29.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:03:29.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:03:29.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:03:29.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:03:29.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:03:12, diff=17.045298s, valid=True
2026-06-03T17:03:29.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:03:29.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:03:29.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:03:29.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73206.046131s, valid=False
2026-06-03T17:03:29.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:03:29.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:03:29.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:03:29.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:03:29.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:03:29.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:03:29.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:03:29.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:03:29.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:03:29.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:03:29.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:03:29.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:03:29.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:03:29.436 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:03:29.644 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:03:30.019 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:03:30.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:03:30.128 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:03:30.128 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:03:30.283 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:03:30.283 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:04:00.286 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:04:00.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:04:00.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:04:00.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:04:00.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:04:00.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:04:00.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:04:00.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:04:00.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:04:00.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:04:00.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:04:00.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:04:00.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:04:04.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:04:04.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:04:04.356 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:04:04.357 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:04:04.367 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:04:04.380 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:04:04.381 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:04:04.381 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:04:04.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:04:04.382 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:04:04.382 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:04:04.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:04:04.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:04:04.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:04:04.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:04:04.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:04:04.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:04:04.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:04:04.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:04:04.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:04:04.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:04:04.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:04:04.712 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:04:04.780 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:03:52
2026-06-03T17:04:04.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86570, datetime.datetime(2026, 6, 3, 17, 3, 52), datetime.datetime(2026, 6, 3, 17, 3, 52), 'salt', 6.74, 100.14, None, 47.31, 125.93, -0.03, 820.83, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:04:04.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:04:04.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:04:04.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:03:52, diff=12.786766s, valid=True
2026-06-03T17:04:04.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:04:04.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:04:04.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:04:12, diff=-7.21046s, valid=True
2026-06-03T17:04:04.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:04:04.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:04:04.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:03:50, diff=14.79606s, valid=True
2026-06-03T17:04:04.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:04:04.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:04:04.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:04:04.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:04:04.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:04:04.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:04:04.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:04:12, diff=-7.200966s, valid=True
2026-06-03T17:04:04.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:04:04.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:04:04.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:04:04.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73241.799759s, valid=False
2026-06-03T17:04:04.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:04:04.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:04:04.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:04:04.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:04:04.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:04:04.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:04:04.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:04:04.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:04:04.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:04:04.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:04:04.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:04:05.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:04:05.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:04:05.113 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:04:05.318 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:04:05.660 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:04:05.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:04:05.762 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:04:05.762 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:04:05.931 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:04:05.931 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:04:35.934 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:04:35.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:04:35.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:04:36.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:04:36.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:04:36.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:04:36.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:04:36.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:04:36.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:04:36.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:04:36.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:04:36.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:04:36.363 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:04:38.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:04:38.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:04:38.997 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:04:38.998 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:04:39.009 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:04:39.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:04:39.022 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:04:39.022 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:04:39.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:04:39.023 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:04:39.023 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:04:39.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:04:39.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:04:39.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:04:39.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:04:39.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:04:39.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:04:39.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:04:39.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:04:39.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:04:39.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:04:39.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:04:39.417 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:04:39.486 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:04:23
2026-06-03T17:04:39.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86571, datetime.datetime(2026, 6, 3, 17, 4, 23), datetime.datetime(2026, 6, 3, 17, 4, 22), 'salt', 6.74, 100.21, None, 44.17, 125.37, -0.04, 820.89, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:04:39.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:04:39.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:04:39.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:04:22, diff=17.492072s, valid=True
2026-06-03T17:04:39.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:04:39.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:04:39.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:04:12, diff=27.494911s, valid=True
2026-06-03T17:04:39.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:04:39.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:04:39.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:04:21, diff=18.501517s, valid=True
2026-06-03T17:04:39.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:04:39.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:04:39.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:04:39.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:04:39.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:04:39.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:04:39.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:04:12, diff=27.504493s, valid=True
2026-06-03T17:04:39.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:04:39.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:04:39.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:04:39.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73276.505137s, valid=False
2026-06-03T17:04:39.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:04:39.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:04:39.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:04:39.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:04:39.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:04:39.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:04:39.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:04:39.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:04:39.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:04:39.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:04:39.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:04:39.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:04:39.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:04:39.816 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:04:40.037 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:04:40.384 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:04:40.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:04:40.491 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:04:40.492 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:04:40.575 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:04:40.575 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:05:10.605 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:05:10.605 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:05:10.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:05:10.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:05:10.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:05:11.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:05:11.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:05:11.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:05:11.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:05:11.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:05:11.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:05:11.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:05:11.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:05:13.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:05:13.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:05:13.932 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:05:13.932 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:05:13.943 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:05:13.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:05:13.957 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:05:13.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:05:13.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:05:13.958 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:05:13.958 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:05:13.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:05:14.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T17:05:14.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:05:14.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T17:05:14.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:05:14.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:05:14.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:05:14.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:05:14.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:05:14.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:05:14.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:05:14.284 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:05:14.355 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:04:53
2026-06-03T17:05:14.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86572, datetime.datetime(2026, 6, 3, 17, 4, 53), datetime.datetime(2026, 6, 3, 17, 4, 52), 'salt', 6.71, 100.08, None, 40.82, 122.13, -0.01, 820.89, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:05:14.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:05:14.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T17:05:14.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:04:52, diff=22.362805s, valid=True
2026-06-03T17:05:14.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:05:14.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:05:14.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:05:12, diff=2.366322s, valid=True
2026-06-03T17:05:14.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:05:14.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T17:05:14.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:04:51, diff=23.374647s, valid=True
2026-06-03T17:05:14.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:05:14.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:05:14.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:05:14.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:05:14.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:05:14.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:05:14.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:05:12, diff=2.37834s, valid=True
2026-06-03T17:05:14.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:05:14.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:05:14.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:05:14.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73311.379165s, valid=False
2026-06-03T17:05:14.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:05:14.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:05:14.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:05:14.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:05:14.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:05:14.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:05:14.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:05:14.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:05:14.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:05:14.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:05:14.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:05:14.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:05:14.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:05:14.702 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:05:14.907 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:05:15.245 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:05:15.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:05:15.348 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:05:15.348 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:05:15.593 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:05:15.594 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:05:45.624 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:05:45.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:05:45.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:05:45.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:05:45.939 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:05:46.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:05:46.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:05:46.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:05:46.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:05:46.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:05:46.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:05:46.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:05:46.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:05:48.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:05:48.828 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:05:48.829 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:05:48.829 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:05:48.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:05:48.852 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:05:48.852 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:05:48.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:05:48.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:05:48.853 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:05:48.854 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:05:48.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:05:48.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T17:05:48.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:05:49.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T17:05:49.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:05:49.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:05:49.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:05:49.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:05:49.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:05:49.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:05:49.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:05:49.126 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:05:49.194 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:05:23
2026-06-03T17:05:49.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86573, datetime.datetime(2026, 6, 3, 17, 5, 23), datetime.datetime(2026, 6, 3, 17, 5, 22), 'salt', 6.67, 100.14, None, 39.69, 127.83, -0.03, 820.65, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:05:49.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:05:49.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T17:05:49.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:05:22, diff=27.201396s, valid=True
2026-06-03T17:05:49.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:05:49.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:05:49.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:05:12, diff=37.204542s, valid=True
2026-06-03T17:05:49.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:05:49.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T17:05:49.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:05:21, diff=28.211899s, valid=True
2026-06-03T17:05:49.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:05:49.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:05:49.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:05:49.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:05:49.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:05:49.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:05:49.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:05:12, diff=37.215257s, valid=True
2026-06-03T17:05:49.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:05:49.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:05:49.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:05:49.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73346.215987s, valid=False
2026-06-03T17:05:49.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:05:49.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:05:49.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:05:49.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:05:49.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:05:49.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:05:49.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:05:49.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:05:49.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:05:49.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:05:49.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:05:49.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:05:49.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:05:49.534 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:05:49.741 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:05:50.093 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:05:50.198 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:05:50.199 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:05:50.199 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:05:50.355 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:05:50.355 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:06:20.385 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:06:20.386 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:06:20.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:06:20.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:06:20.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:06:20.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:06:20.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:06:20.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:06:20.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:06:20.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:06:20.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:06:20.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:06:20.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:06:24.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:06:24.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:06:24.137 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:06:24.137 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:06:24.148 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:06:24.161 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:06:24.162 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:06:24.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:06:24.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:06:24.163 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:06:24.163 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:06:24.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:06:24.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:06:24.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:06:24.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:06:24.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:06:24.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T17:06:24.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:06:24.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T17:06:24.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:06:24.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:06:24.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:06:24.493 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:06:24.564 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:06:24
2026-06-03T17:06:24.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86575, datetime.datetime(2026, 6, 3, 17, 6, 24), datetime.datetime(2026, 6, 3, 17, 6, 23), 'salt', 6.64, 100.14, None, 43.29, 134.06, -0.03, 820.71, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:06:24.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:06:24.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:06:24.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:06:23, diff=1.57054s, valid=True
2026-06-03T17:06:24.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:06:24.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T17:06:24.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:06:12, diff=12.573376s, valid=True
2026-06-03T17:06:24.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:06:24.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:06:24.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:06:23, diff=1.579903s, valid=True
2026-06-03T17:06:24.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:06:24.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:06:24.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:06:24.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:06:24.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:06:24.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T17:06:24.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:06:12, diff=12.582905s, valid=True
2026-06-03T17:06:24.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:06:24.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:06:24.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:06:24.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73381.583544s, valid=False
2026-06-03T17:06:24.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:06:24.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:06:24.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:06:24.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:06:24.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:06:24.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:06:24.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:06:24.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:06:24.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:06:24.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:06:24.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:06:24.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:06:24.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:06:24.901 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:06:25.164 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:06:25.503 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:06:25.605 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:06:25.605 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:06:25.605 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:06:25.677 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:06:25.677 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:06:55.708 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:06:55.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:06:55.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:06:55.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:06:55.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:06:56.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:06:56.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:06:56.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:06:56.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:06:56.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:06:56.128 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:06:56.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:06:56.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:06:58.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:06:58.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:06:58.804 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:06:58.804 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:06:58.816 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:06:58.830 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:06:58.830 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:06:58.831 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:06:58.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:06:58.832 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:06:58.832 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:06:58.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:06:58.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:06:58.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:06:59.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:06:59.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:06:59.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T17:06:59.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:06:59.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T17:06:59.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:06:59.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:06:59.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:06:59.164 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:06:59.235 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:06:54
2026-06-03T17:06:59.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86576, datetime.datetime(2026, 6, 3, 17, 6, 54), datetime.datetime(2026, 6, 3, 17, 6, 53), 'salt', 6.71, 100.24, None, 41.78, 137.69, -0.04, 820.77, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:06:59.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:06:59.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:06:59.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:06:53, diff=6.242933s, valid=True
2026-06-03T17:06:59.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:06:59.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T17:06:59.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:07:12, diff=-12.753561s, valid=True
2026-06-03T17:06:59.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:06:59.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:06:59.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:06:52, diff=7.254648s, valid=True
2026-06-03T17:06:59.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:06:59.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:06:59.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:06:59.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:06:59.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:06:59.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T17:06:59.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:07:12, diff=-12.741626s, valid=True
2026-06-03T17:06:59.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:06:59.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:06:59.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:06:59.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73416.259208s, valid=False
2026-06-03T17:06:59.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:06:59.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:06:59.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:06:59.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:06:59.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:06:59.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:06:59.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:06:59.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:06:59.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:06:59.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:06:59.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:06:59.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:06:59.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:06:59.580 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:06:59.785 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:07:00.155 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:07:00.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:07:00.258 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:07:00.258 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:07:00.441 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:07:00.441 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:07:30.458 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:07:30.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:07:30.458 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:07:31.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:07:31.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:07:31.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:07:31.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:07:31.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:07:31.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:07:31.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:07:31.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:07:31.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:07:31.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:07:34.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:07:34.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:07:34.172 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:07:34.172 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:07:34.181 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:07:34.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:07:34.195 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:07:34.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:07:34.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:07:34.196 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:07:34.197 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:07:34.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:07:34.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:07:34.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:07:34.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:07:34.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:07:34.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T17:07:34.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:07:34.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T17:07:34.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:07:34.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:07:34.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:07:34.523 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:07:34.594 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:07:24
2026-06-03T17:07:34.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86577, datetime.datetime(2026, 6, 3, 17, 7, 24), datetime.datetime(2026, 6, 3, 17, 7, 23), 'salt', 6.64, 100.07, None, 50.38, 125.02, -0.02, 820.71, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:07:34.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:07:34.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:07:34.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:07:23, diff=11.601786s, valid=True
2026-06-03T17:07:34.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:07:34.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T17:07:34.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:07:12, diff=22.605297s, valid=True
2026-06-03T17:07:34.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:07:34.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:07:34.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:07:22, diff=12.613408s, valid=True
2026-06-03T17:07:34.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:07:34.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:07:34.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:07:34.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:07:34.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:07:34.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T17:07:34.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:07:12, diff=22.617195s, valid=True
2026-06-03T17:07:34.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:07:34.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:07:34.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:07:34.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73451.618017s, valid=False
2026-06-03T17:07:34.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:07:34.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:07:34.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:07:34.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:07:34.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:07:34.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:07:34.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:07:34.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:07:34.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:07:34.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:07:34.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:07:34.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:07:34.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:07:35.008 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:07:35.212 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:07:35.552 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:07:35.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:07:35.655 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:07:35.655 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:07:35.771 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:07:35.771 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:08:05.801 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:08:05.801 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:08:05.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:08:06.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:08:06.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:08:06.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:08:06.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:08:06.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:08:06.547 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:08:06.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:08:06.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:08:06.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:08:06.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:08:09.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:08:09.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:08:09.218 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:08:09.218 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:08:09.229 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:08:09.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:08:09.243 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:08:09.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:08:09.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:08:09.244 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:08:09.244 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:08:09.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:08:09.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:08:09.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:08:09.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:08:09.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:08:09.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:08:09.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:08:09.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:08:09.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:08:09.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:08:09.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:08:09.604 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:08:09.688 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:07:54
2026-06-03T17:08:09.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86578, datetime.datetime(2026, 6, 3, 17, 7, 54), datetime.datetime(2026, 6, 3, 17, 7, 54), 'salt', 6.67, 100.14, None, 43.36, 132.67, -0.03, 820.71, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:08:09.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:08:09.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:08:09.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:07:54, diff=15.695396s, valid=True
2026-06-03T17:08:09.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:08:09.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:08:09.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:08:12, diff=-2.301027s, valid=True
2026-06-03T17:08:09.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:08:09.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:08:09.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:07:52, diff=17.707238s, valid=True
2026-06-03T17:08:09.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:08:09.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:08:09.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:08:09.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:08:09.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:08:09.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:08:09.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:08:12, diff=-2.289005s, valid=True
2026-06-03T17:08:09.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:08:09.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:08:09.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:08:09.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73486.711819s, valid=False
2026-06-03T17:08:09.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:08:09.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:08:09.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:08:09.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:08:09.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:08:09.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:08:09.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:08:09.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:08:09.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:08:09.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:08:09.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:08:09.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:08:10.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:08:10.061 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:08:10.297 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:08:10.636 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:08:10.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:08:10.739 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:08:10.739 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:08:10.924 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:08:10.925 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:08:40.942 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:08:40.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:08:40.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:08:41.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:08:41.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:08:41.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:08:41.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:08:41.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:08:41.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:08:41.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:08:41.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:08:41.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:08:41.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:08:44.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:08:44.893 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:08:44.894 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:08:44.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:08:44.903 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:08:44.916 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:08:44.917 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:08:44.917 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:08:44.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:08:44.918 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:08:44.918 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:08:44.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:08:45.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:08:45.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:08:45.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:08:45.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:08:45.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:08:45.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:08:45.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:08:45.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:08:45.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:08:45.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:08:45.257 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:08:45.326 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:08:25
2026-06-03T17:08:45.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86579, datetime.datetime(2026, 6, 3, 17, 8, 25), datetime.datetime(2026, 6, 3, 17, 8, 24), 'salt', 6.67, 100.17, None, 47.77, 129.69, -0.03, 820.53, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:08:45.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:08:45.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:08:45.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:08:24, diff=21.333657s, valid=True
2026-06-03T17:08:45.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:08:45.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:08:45.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:08:12, diff=33.337166s, valid=True
2026-06-03T17:08:45.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:08:45.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:08:45.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:08:23, diff=22.345387s, valid=True
2026-06-03T17:08:45.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:08:45.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:08:45.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:08:45.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:08:45.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:08:45.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:08:45.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:08:12, diff=33.349137s, valid=True
2026-06-03T17:08:45.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:08:45.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:08:45.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:08:45.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73522.34997s, valid=False
2026-06-03T17:08:45.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:08:45.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:08:45.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:08:45.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:08:45.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:08:45.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:08:45.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:08:45.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:08:45.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:08:45.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:08:45.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:08:45.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:08:45.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:08:45.740 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:08:45.947 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:08:46.289 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:08:46.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:08:46.391 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:08:46.391 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:08:46.475 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:08:46.475 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:09:16.478 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:09:16.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:09:16.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:09:16.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:09:17.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:09:17.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:09:17.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:09:17.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:09:17.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:09:17.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:09:17.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:09:17.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:09:17.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:09:19.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:09:19.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:09:19.963 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:09:19.964 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:09:19.972 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:09:19.983 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:09:19.984 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:09:19.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:09:19.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:09:19.984 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:09:19.984 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:09:19.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:09:20.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T17:09:20.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:09:20.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T17:09:20.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:09:20.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:09:20.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:09:20.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:09:20.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:09:20.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:09:20.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:09:20.279 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:09:20.348 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:08:55
2026-06-03T17:09:20.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86580, datetime.datetime(2026, 6, 3, 17, 8, 55), datetime.datetime(2026, 6, 3, 17, 8, 54), 'salt', 6.71, 100.21, None, 50.7, 124.31, -0.03, 820.46, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:09:20.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:09:20.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T17:09:20.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:08:54, diff=26.35503s, valid=True
2026-06-03T17:09:20.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:09:20.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:09:20.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:09:12, diff=8.358244s, valid=True
2026-06-03T17:09:20.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:09:20.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T17:09:20.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:08:53, diff=27.365705s, valid=True
2026-06-03T17:09:20.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:09:20.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:09:20.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:09:20.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:09:20.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:09:20.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:09:20.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:09:12, diff=8.369118s, valid=True
2026-06-03T17:09:20.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:09:20.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:09:20.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:09:20.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73557.369853s, valid=False
2026-06-03T17:09:20.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:09:20.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:09:20.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:09:20.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:09:20.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:09:20.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:09:20.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:09:20.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:09:20.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:09:20.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:09:20.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:09:20.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:09:20.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:09:20.687 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:09:20.891 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:09:21.233 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:09:21.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:09:21.335 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:09:21.335 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:09:21.547 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:09:21.547 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:09:51.577 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:09:51.578 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:09:51.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:09:51.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:09:51.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:09:52.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:09:52.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:09:52.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:09:52.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:09:52.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:09:52.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:09:52.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:09:52.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:09:55.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:09:55.008 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:09:55.008 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:09:55.008 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:09:55.019 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:09:55.031 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:09:55.032 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:09:55.032 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:09:55.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:09:55.033 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:09:55.033 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:09:55.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:09:55.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T17:09:55.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:09:55.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T17:09:55.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:09:55.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T17:09:55.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:09:55.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T17:09:55.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:09:55.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:09:55.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:09:55.385 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:09:55.454 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:09:25
2026-06-03T17:09:55.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86581, datetime.datetime(2026, 6, 3, 17, 9, 25), datetime.datetime(2026, 6, 3, 17, 9, 24), 'salt', 6.61, 100.14, None, 50.28, 130.98, -0.02, 820.46, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:09:55.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:09:55.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T17:09:55.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:09:24, diff=31.461893s, valid=True
2026-06-03T17:09:55.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:09:55.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T17:09:55.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:09:12, diff=43.465422s, valid=True
2026-06-03T17:09:55.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:09:55.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T17:09:55.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:09:23, diff=32.473734s, valid=True
2026-06-03T17:09:55.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:09:55.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:09:55.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:09:55.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:09:55.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:09:55.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T17:09:55.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:09:12, diff=43.47744s, valid=True
2026-06-03T17:09:55.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:09:55.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:09:55.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:09:55.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73592.478252s, valid=False
2026-06-03T17:09:55.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:09:55.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:09:55.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:09:55.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:09:55.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:09:55.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:09:55.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:09:55.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:09:55.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:09:55.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:09:55.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:09:55.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:09:55.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:09:55.885 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:09:56.091 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:09:56.432 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:09:56.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:09:56.534 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:09:56.535 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:09:56.758 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:09:56.758 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:10:26.778 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:10:26.778 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:10:26.778 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:10:27.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:10:27.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:10:27.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:10:27.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:10:27.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:10:27.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:10:27.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:10:27.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:10:27.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:10:27.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:10:30.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:10:30.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:10:30.194 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:10:30.194 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:10:30.202 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:10:30.221 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:10:30.221 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:10:30.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:10:30.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:10:30.223 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:10:30.223 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:10:30.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:10:30.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:10:30.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:10:30.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:10:30.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:10:30.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:10:30.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:10:30.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:10:30.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:10:30.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:10:30.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:10:30.562 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:10:30.632 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:10:26
2026-06-03T17:10:30.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86583, datetime.datetime(2026, 6, 3, 17, 10, 26), datetime.datetime(2026, 6, 3, 17, 10, 25), 'salt', 6.67, 100.21, None, 44.88, 131.17, -0.04, 820.59, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:10:30.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:10:30.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:10:30.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:10:25, diff=5.639955s, valid=True
2026-06-03T17:10:30.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:10:30.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:10:30.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:10:12, diff=18.643451s, valid=True
2026-06-03T17:10:30.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:10:30.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:10:30.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:10:24, diff=6.651652s, valid=True
2026-06-03T17:10:30.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:10:30.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:10:30.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:10:30.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:10:30.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:10:30.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:10:30.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:10:12, diff=18.655258s, valid=True
2026-06-03T17:10:30.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:10:30.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:10:30.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:10:30.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73627.656041s, valid=False
2026-06-03T17:10:30.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:10:30.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:10:30.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:10:30.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:10:30.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:10:30.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:10:30.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:10:30.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:10:30.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:10:30.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:10:30.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:10:30.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:10:30.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:10:30.974 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:10:31.180 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:10:31.522 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:10:31.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:10:31.624 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:10:31.624 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:10:31.813 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:10:31.813 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:11:01.843 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:11:01.843 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:11:01.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:11:02.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:11:02.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:11:02.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:11:02.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:11:02.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:11:02.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:11:02.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:11:02.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:11:02.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:11:02.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:11:05.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:11:05.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:11:05.079 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:11:05.079 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:11:05.089 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:11:05.102 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:11:05.102 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:11:05.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:11:05.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:11:05.103 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:11:05.103 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:11:05.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:11:05.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:11:05.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:11:05.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:11:05.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:11:05.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:11:05.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:11:05.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:11:05.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:11:05.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:11:05.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:11:05.459 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:11:05.532 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:10:56
2026-06-03T17:11:05.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86584, datetime.datetime(2026, 6, 3, 17, 10, 56), datetime.datetime(2026, 6, 3, 17, 10, 55), 'salt', 6.71, 100.24, None, 39.06, 153.92, -0.04, 820.53, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:11:05.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:11:05.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:11:05.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:10:55, diff=10.540344s, valid=True
2026-06-03T17:11:05.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:11:05.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:11:05.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:11:12, diff=-6.455989s, valid=True
2026-06-03T17:11:05.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:11:05.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:11:05.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:10:55, diff=10.552296s, valid=True
2026-06-03T17:11:05.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:11:05.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:11:05.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:11:05.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:11:05.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:11:05.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:11:05.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:11:12, diff=-6.443873s, valid=True
2026-06-03T17:11:05.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:11:05.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:11:05.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:11:05.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73662.556956s, valid=False
2026-06-03T17:11:05.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:11:05.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:11:05.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:11:05.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:11:05.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:11:05.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:11:05.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:11:05.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:11:05.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:11:05.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:11:05.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:11:05.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:11:05.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:11:05.878 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:11:06.084 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:11:06.424 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:11:06.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:11:06.526 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:11:06.526 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:11:06.742 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:11:06.743 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:11:36.773 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:11:36.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:11:36.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:11:37.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:11:37.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:11:37.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:11:37.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:11:37.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:11:37.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:11:37.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:11:37.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:11:37.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:11:37.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:11:40.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:11:40.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:11:40.062 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:11:40.062 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:11:40.071 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:11:40.083 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:11:40.084 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:11:40.084 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:11:40.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:11:40.084 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:11:40.084 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:11:40.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:11:40.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:11:40.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:11:40.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:11:40.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:11:40.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:11:40.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:11:40.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:11:40.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:11:40.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:11:40.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:11:40.367 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:11:40.443 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:11:26
2026-06-03T17:11:40.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86585, datetime.datetime(2026, 6, 3, 17, 11, 26), datetime.datetime(2026, 6, 3, 17, 11, 25), 'salt', 6.67, 100.17, None, 46.04, 134.17, -0.03, 820.4, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:11:40.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:11:40.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:11:40.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:11:25, diff=15.450311s, valid=True
2026-06-03T17:11:40.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:11:40.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:11:40.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:11:12, diff=28.453569s, valid=True
2026-06-03T17:11:40.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:11:40.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:11:40.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:11:24, diff=16.461063s, valid=True
2026-06-03T17:11:40.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:11:40.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:11:40.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:11:40.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:11:40.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:11:40.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:11:40.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:11:12, diff=28.464532s, valid=True
2026-06-03T17:11:40.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:11:40.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:11:40.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:11:40.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73697.465285s, valid=False
2026-06-03T17:11:40.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:11:40.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:11:40.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:11:40.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:11:40.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:11:40.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:11:40.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:11:40.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:11:40.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:11:40.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:11:40.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:11:40.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:11:40.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:11:40.808 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:11:41.077 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:11:41.415 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:11:41.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:11:41.523 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:11:41.523 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:11:42.676 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:11:42.676 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:12:12.701 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:12:12.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:12:12.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:12:13.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:12:13.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:12:13.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:12:13.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:12:13.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:12:13.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:12:13.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:12:13.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:12:13.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:12:13.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:12:15.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:12:15.972 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:12:15.973 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:12:15.973 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:12:15.984 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:12:15.996 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:12:15.997 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:12:15.998 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:12:15.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:12:15.998 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:12:15.999 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:12:16.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:12:16.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:12:16.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:12:16.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:12:16.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:12:16.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:12:16.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:12:16.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:12:16.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:12:16.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:12:16.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:12:16.344 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:12:16.417 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:11:56
2026-06-03T17:12:16.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86586, datetime.datetime(2026, 6, 3, 17, 11, 56), datetime.datetime(2026, 6, 3, 17, 11, 56), 'salt', 6.71, 100.14, None, 46.89, 121.89, -0.02, 820.53, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:12:16.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:12:16.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:12:16.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:11:56, diff=20.424903s, valid=True
2026-06-03T17:12:16.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:12:16.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:12:16.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:12:12, diff=4.428384s, valid=True
2026-06-03T17:12:16.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:12:16.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:12:16.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:11:55, diff=21.436221s, valid=True
2026-06-03T17:12:16.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:12:16.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:12:16.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:12:16.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:12:16.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:12:16.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:12:16.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:12:12, diff=4.439869s, valid=True
2026-06-03T17:12:16.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:12:16.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:12:16.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:12:16.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73733.440665s, valid=False
2026-06-03T17:12:16.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:12:16.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:12:16.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:12:16.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:12:16.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:12:16.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:12:16.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:12:16.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:12:16.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:12:16.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:12:16.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:12:16.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:12:16.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:12:16.764 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:12:16.972 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:12:17.313 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:12:17.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:12:17.419 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:12:17.419 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:12:17.587 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:12:17.587 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:12:47.610 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:12:47.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:12:47.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:12:47.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:12:47.778 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:12:48.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:12:48.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:12:48.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:12:48.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:12:48.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:12:48.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:12:48.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:12:48.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:12:50.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:12:50.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:12:50.776 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:12:50.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:12:50.784 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:12:50.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:12:50.797 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:12:50.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:12:50.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:12:50.799 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:12:50.799 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:12:50.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:12:50.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T17:12:50.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:12:51.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T17:12:51.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:12:51.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T17:12:51.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:12:51.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T17:12:51.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:12:51.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:12:51.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:12:51.140 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:12:51.212 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:12:27
2026-06-03T17:12:51.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86587, datetime.datetime(2026, 6, 3, 17, 12, 27), datetime.datetime(2026, 6, 3, 17, 12, 26), 'salt', 6.57, 100.24, None, 41.78, 137.6, -0.04, 820.46, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:12:51.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:12:51.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T17:12:51.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:12:26, diff=25.219668s, valid=True
2026-06-03T17:12:51.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:12:51.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T17:12:51.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:12:12, diff=39.223192s, valid=True
2026-06-03T17:12:51.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:12:51.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T17:12:51.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:12:25, diff=26.231399s, valid=True
2026-06-03T17:12:51.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:12:51.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:12:51.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:12:51.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:12:51.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:12:51.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T17:12:51.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:12:12, diff=39.235135s, valid=True
2026-06-03T17:12:51.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:12:51.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:12:51.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:12:51.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73768.235956s, valid=False
2026-06-03T17:12:51.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:12:51.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:12:51.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:12:51.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:12:51.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:12:51.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:12:51.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:12:51.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:12:51.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:12:51.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:12:51.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:12:51.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:12:51.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:12:51.630 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:12:51.841 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:12:52.183 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:12:52.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:12:52.286 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:12:52.286 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:12:52.478 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:12:52.479 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:13:22.486 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:13:22.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:13:22.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:13:22.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:13:22.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:13:23.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:13:23.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:13:23.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:13:23.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:13:23.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:13:23.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:13:23.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:13:23.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:13:25.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:13:25.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:13:25.981 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:13:25.981 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:13:25.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:13:26.003 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:13:26.004 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:13:26.005 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:13:26.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:13:26.005 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:13:26.006 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:13:26.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:13:26.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T17:13:26.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:13:26.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T17:13:26.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:13:26.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:13:26.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:13:26.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:13:26.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:13:26.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:13:26.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:13:26.343 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:13:26.416 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:12:57
2026-06-03T17:13:26.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86588, datetime.datetime(2026, 6, 3, 17, 12, 57), datetime.datetime(2026, 6, 3, 17, 12, 56), 'salt', 6.61, 100.14, None, 33.77, 130.46, -0.02, 820.59, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:13:26.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:13:26.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T17:13:26.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:12:56, diff=30.423763s, valid=True
2026-06-03T17:13:26.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:13:26.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:13:26.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:13:12, diff=14.427315s, valid=True
2026-06-03T17:13:26.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:13:26.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T17:13:26.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:12:50, diff=36.435471s, valid=True
2026-06-03T17:13:26.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:13:26.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:13:26.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:13:26.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:13:26.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:13:26.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:13:26.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:13:12, diff=14.439221s, valid=True
2026-06-03T17:13:26.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:13:26.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:13:26.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:13:26.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73803.44004s, valid=False
2026-06-03T17:13:26.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:13:26.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:13:26.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:13:26.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:13:26.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:13:26.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:13:26.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:13:26.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:13:26.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:13:26.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:13:26.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:13:26.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:13:26.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:13:26.763 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:13:26.969 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:13:27.315 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:13:27.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:13:27.423 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:13:27.423 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:13:27.617 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:13:27.617 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:13:57.647 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:13:57.648 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:13:57.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:13:57.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:13:57.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:13:58.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:13:58.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:13:58.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:13:58.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:13:58.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:13:58.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:13:58.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:13:58.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:14:00.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:14:00.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:14:00.790 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:14:00.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:14:00.801 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:14:00.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:14:00.814 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:14:00.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:14:00.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:14:00.815 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:14:00.815 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:14:00.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:14:00.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:14:00.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:14:01.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:14:01.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:14:01.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:14:01.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:14:01.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:14:01.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:14:01.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:14:01.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:14:01.154 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:14:01.224 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:13:57
2026-06-03T17:14:01.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86590, datetime.datetime(2026, 6, 3, 17, 13, 57), datetime.datetime(2026, 6, 3, 17, 13, 57), 'salt', 6.64, 100.14, None, 41.95, 132.55, -0.03, 820.53, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:14:01.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:14:01.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:14:01.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:13:57, diff=4.23144s, valid=True
2026-06-03T17:14:01.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:14:01.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:14:01.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:14:12, diff=-10.765128s, valid=True
2026-06-03T17:14:01.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:14:01.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:14:01.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:13:53, diff=8.242998s, valid=True
2026-06-03T17:14:01.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:14:01.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:14:01.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:14:01.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:14:01.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:14:01.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:14:01.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:14:12, diff=-10.753388s, valid=True
2026-06-03T17:14:01.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:14:01.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:14:01.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:14:01.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73838.247395s, valid=False
2026-06-03T17:14:01.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:14:01.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:14:01.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:14:01.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:14:01.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:14:01.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:14:01.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:14:01.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:14:01.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:14:01.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:14:01.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:14:01.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:14:01.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:14:01.668 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:14:01.876 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:14:02.218 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:14:02.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:14:02.321 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:14:02.321 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:14:02.547 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:14:02.548 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:14:32.578 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:14:32.578 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:14:32.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:14:32.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:14:32.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:14:33.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:14:33.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:14:33.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:14:33.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:14:33.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:14:33.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:14:33.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:14:33.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:14:35.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:14:35.917 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:14:35.918 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:14:35.918 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:14:35.928 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:14:35.940 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:14:35.941 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:14:35.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:14:35.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:14:35.942 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:14:35.942 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:14:35.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:14:36.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:14:36.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:14:36.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:14:36.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:14:36.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:14:36.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:14:36.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:14:36.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:14:36.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:14:36.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:14:36.278 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:14:36.353 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:14:28
2026-06-03T17:14:36.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86591, datetime.datetime(2026, 6, 3, 17, 14, 28), datetime.datetime(2026, 6, 3, 17, 14, 27), 'salt', 6.61, 100.24, None, 35.71, 134.17, -0.04, 820.47, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:14:36.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:14:36.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:14:36.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:14:27, diff=9.361233s, valid=True
2026-06-03T17:14:36.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:14:36.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:14:36.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:14:12, diff=24.364729s, valid=True
2026-06-03T17:14:36.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:14:36.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:14:36.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:14:25, diff=11.372887s, valid=True
2026-06-03T17:14:36.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:14:36.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:14:36.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:14:36.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:14:36.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:14:36.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:14:36.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:14:12, diff=24.376592s, valid=True
2026-06-03T17:14:36.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:14:36.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:14:36.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:14:36.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73873.377389s, valid=False
2026-06-03T17:14:36.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:14:36.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:14:36.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:14:36.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:14:36.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:14:36.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:14:36.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:14:36.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:14:36.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:14:36.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:14:36.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:14:36.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:14:36.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:14:36.696 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:14:36.925 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:14:37.275 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:14:37.380 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:14:37.380 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:14:37.380 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:14:37.525 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:14:37.525 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:15:07.551 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:15:07.551 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:15:07.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:15:07.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:15:07.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:15:07.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:15:07.944 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:15:07.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:15:07.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:15:07.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:15:07.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:15:07.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:15:07.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:15:10.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:15:10.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:15:10.957 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:15:10.957 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:15:10.966 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:15:10.978 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:15:10.978 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:15:10.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:15:10.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:15:10.979 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:15:10.979 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:15:10.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:15:11.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:15:11.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:15:11.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:15:11.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:15:11.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:15:11.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:15:11.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:15:11.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:15:11.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:15:11.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:15:11.293 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:15:11.364 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:14:58
2026-06-03T17:15:11.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86592, datetime.datetime(2026, 6, 3, 17, 14, 58), datetime.datetime(2026, 6, 3, 17, 14, 57), 'salt', 6.54, 100.18, None, 39.94, 118.16, -0.03, 820.47, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:15:11.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:15:11.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:15:11.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:14:57, diff=14.371287s, valid=True
2026-06-03T17:15:11.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:15:11.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:15:11.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:15:12, diff=-0.625311s, valid=True
2026-06-03T17:15:11.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:15:11.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:15:11.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:14:56, diff=15.382605s, valid=True
2026-06-03T17:15:11.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:15:11.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:15:11.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:15:11.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:15:11.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:15:11.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:15:11.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:15:12, diff=-0.613705s, valid=True
2026-06-03T17:15:11.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:15:11.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:15:11.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:15:11.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73908.387085s, valid=False
2026-06-03T17:15:11.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:15:11.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:15:11.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:15:11.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:15:11.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:15:11.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:15:11.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:15:11.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:15:11.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:15:11.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:15:11.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:15:11.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:15:11.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:15:11.775 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:15:11.982 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:15:12.322 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:15:12.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:15:12.424 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:15:12.424 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:15:12.617 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:15:12.617 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:15:42.622 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:15:42.622 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:15:42.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:15:42.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:15:42.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:15:43.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:15:43.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:15:43.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:15:43.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:15:43.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:15:43.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:15:43.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:15:43.052 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:15:45.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:15:45.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:15:45.771 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:15:45.771 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:15:45.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:15:45.795 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:15:45.795 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:15:45.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:15:45.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:15:45.796 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:15:45.797 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:15:45.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:15:45.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:15:45.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:15:46.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:15:46.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:15:46.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:15:46.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:15:46.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:15:46.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:15:46.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:15:46.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:15:46.139 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:15:46.215 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:15:28
2026-06-03T17:15:46.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86593, datetime.datetime(2026, 6, 3, 17, 15, 28), datetime.datetime(2026, 6, 3, 17, 15, 28), 'salt', 6.61, 100.24, None, 39.38, 132.95, -0.04, 820.41, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:15:46.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:15:46.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:15:46.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:15:28, diff=18.223141s, valid=True
2026-06-03T17:15:46.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:15:46.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:15:46.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:15:12, diff=34.226702s, valid=True
2026-06-03T17:15:46.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:15:46.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:15:46.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:15:28, diff=18.234842s, valid=True
2026-06-03T17:15:46.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:15:46.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:15:46.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:15:46.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:15:46.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:15:46.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:15:46.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:15:12, diff=34.238593s, valid=True
2026-06-03T17:15:46.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:15:46.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:15:46.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:15:46.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73943.239398s, valid=False
2026-06-03T17:15:46.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:15:46.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:15:46.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:15:46.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:15:46.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:15:46.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:15:46.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:15:46.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:15:46.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:15:46.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:15:46.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:15:46.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:15:46.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:15:46.562 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:15:46.767 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:15:47.106 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:15:47.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:15:47.208 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:15:47.208 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:15:47.429 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:15:47.429 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:16:17.448 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:16:17.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:16:17.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:16:17.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:16:17.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:16:18.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:16:18.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:16:18.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:16:18.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:16:18.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:16:18.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:16:18.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:16:18.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:16:21.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:16:21.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:16:21.244 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:16:21.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:16:21.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:16:21.267 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:16:21.268 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:16:21.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:16:21.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:16:21.269 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:16:21.269 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:16:21.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:16:21.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:16:21.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:16:21.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:16:21.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:16:21.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:16:21.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:16:21.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:16:21.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:16:21.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:16:21.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:16:21.615 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:16:21.684 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:15:59
2026-06-03T17:16:21.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86594, datetime.datetime(2026, 6, 3, 17, 15, 59), datetime.datetime(2026, 6, 3, 17, 15, 58), 'salt', 6.51, 100.14, None, 35.88, 135.56, -0.03, 820.47, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:16:21.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:16:21.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:16:21.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:15:58, diff=23.690176s, valid=True
2026-06-03T17:16:21.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:16:21.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:16:21.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:16:12, diff=9.69298s, valid=True
2026-06-03T17:16:21.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:16:21.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:16:21.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:15:52, diff=29.699412s, valid=True
2026-06-03T17:16:21.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:16:21.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:16:21.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:16:21.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:16:21.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:16:21.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:16:21.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:16:12, diff=9.702371s, valid=True
2026-06-03T17:16:21.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:16:21.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:16:21.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:16:21.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=73978.703021s, valid=False
2026-06-03T17:16:21.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:16:21.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:16:21.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:16:21.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:16:21.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:16:21.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:16:21.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:16:21.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:16:21.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:16:21.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:16:21.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:16:21.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:16:21.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:16:22.016 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:16:22.224 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:16:22.564 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:16:22.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:16:22.666 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:16:22.666 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:16:22.855 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:16:22.855 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:16:52.858 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:16:52.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:16:52.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:16:53.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:16:53.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:16:53.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:16:53.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:16:53.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:16:53.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:16:53.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:16:53.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:16:53.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:16:53.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:16:56.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:16:56.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:16:56.054 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:16:56.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:16:56.064 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:16:56.077 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:16:56.077 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:16:56.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:16:56.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:16:56.079 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:16:56.079 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:16:56.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:16:56.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T17:16:56.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:16:56.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T17:16:56.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:16:56.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T17:16:56.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:16:56.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T17:16:56.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:16:56.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:16:56.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:16:56.432 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:16:56.521 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:16:29
2026-06-03T17:16:56.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86595, datetime.datetime(2026, 6, 3, 17, 16, 29), datetime.datetime(2026, 6, 3, 17, 16, 28), 'salt', 6.44, 100.11, None, 49.85, 138.3, -0.03, 820.35, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:16:56.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:16:56.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T17:16:56.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:16:28, diff=28.528947s, valid=True
2026-06-03T17:16:56.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:16:56.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T17:16:56.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:16:12, diff=44.532453s, valid=True
2026-06-03T17:16:56.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:16:56.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T17:16:56.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:16:22, diff=34.540503s, valid=True
2026-06-03T17:16:56.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:16:56.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:16:56.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:16:56.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:16:56.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:16:56.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T17:16:56.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:16:12, diff=44.544165s, valid=True
2026-06-03T17:16:56.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:16:56.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:16:56.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:16:56.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74013.544942s, valid=False
2026-06-03T17:16:56.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:16:56.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:16:56.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:16:56.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:16:56.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:16:56.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:16:56.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:16:56.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:16:56.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:16:56.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:16:56.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:16:56.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:16:56.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:16:56.864 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:16:57.131 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:16:57.471 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:16:57.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:16:57.576 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:16:57.576 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:16:57.813 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:16:57.813 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:17:27.834 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:17:27.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:17:27.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:17:27.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:17:27.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:17:28.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:17:28.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:17:28.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:17:28.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:17:28.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:17:28.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:17:28.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:17:28.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:17:30.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:17:30.917 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:17:30.917 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:17:30.918 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:17:30.928 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:17:30.941 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:17:30.942 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:17:30.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:17:30.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:17:30.943 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:17:30.943 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:17:30.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:17:31.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:17:31.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:17:31.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:17:31.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:17:31.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:17:31.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:17:31.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:17:31.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:17:31.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:17:31.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:17:31.244 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:17:31.324 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:17:29
2026-06-03T17:17:31.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86597, datetime.datetime(2026, 6, 3, 17, 17, 29), datetime.datetime(2026, 6, 3, 17, 17, 29), 'salt', 6.44, 100.14, None, 45.02, 115.39, -0.03, 820.41, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:17:31.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:17:31.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:17:31.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:17:29, diff=2.33142s, valid=True
2026-06-03T17:17:31.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:17:31.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:17:31.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:17:12, diff=19.334731s, valid=True
2026-06-03T17:17:31.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:17:31.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:17:31.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:17:23, diff=8.342346s, valid=True
2026-06-03T17:17:31.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:17:31.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:17:31.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:17:31.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:17:31.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:17:31.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:17:31.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:17:12, diff=19.345876s, valid=True
2026-06-03T17:17:31.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:17:31.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:17:31.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:17:31.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74048.346641s, valid=False
2026-06-03T17:17:31.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:17:31.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:17:31.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:17:31.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:17:31.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:17:31.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:17:31.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:17:31.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:17:31.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:17:31.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:17:31.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:17:31.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:17:31.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:17:31.666 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:17:31.874 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:17:32.217 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:17:32.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:17:32.320 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:17:32.320 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:17:32.476 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:17:32.476 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:18:02.506 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:18:02.506 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:18:02.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:18:03.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:18:03.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:18:03.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:18:03.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:18:03.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:18:03.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:18:03.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:18:03.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:18:03.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:18:03.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:18:06.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:18:06.352 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:18:06.352 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:18:06.352 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:18:06.362 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:18:06.375 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:18:06.375 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:18:06.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:18:06.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:18:06.376 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:18:06.377 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:18:06.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:18:06.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:18:06.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:18:06.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:18:06.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:18:06.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:18:06.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:18:06.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:18:06.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:18:06.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:18:06.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:18:06.759 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:18:06.842 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:17:59
2026-06-03T17:18:06.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86598, datetime.datetime(2026, 6, 3, 17, 17, 59), datetime.datetime(2026, 6, 3, 17, 17, 59), 'salt', 6.48, 100.24, None, 48.27, 120.82, -0.04, 820.41, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:18:06.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:18:06.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:18:06.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:17:59, diff=7.849425s, valid=True
2026-06-03T17:18:06.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:18:06.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:18:06.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:18:12, diff=-5.147062s, valid=True
2026-06-03T17:18:06.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:18:06.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:18:06.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:17:54, diff=12.861153s, valid=True
2026-06-03T17:18:06.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:18:06.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:18:06.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:18:06.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:18:06.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:18:06.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:18:06.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:18:12, diff=-5.135068s, valid=True
2026-06-03T17:18:06.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:18:06.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:18:06.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:18:06.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74083.865777s, valid=False
2026-06-03T17:18:06.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:18:06.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:18:06.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:18:06.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:18:06.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:18:06.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:18:06.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:18:06.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:18:06.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:18:07.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:18:07.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:18:07.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:18:07.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:18:07.261 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:18:07.469 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:18:07.814 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:18:07.917 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:18:07.917 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:18:07.917 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:18:09.279 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:18:09.279 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:18:39.309 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:18:39.309 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:18:39.310 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:18:39.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:18:39.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:18:39.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:18:39.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:18:39.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:18:39.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:18:39.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:18:39.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:18:39.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:18:39.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:18:42.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:18:42.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:18:42.911 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:18:42.912 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:18:42.922 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:18:42.935 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:18:42.936 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:18:42.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:18:42.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:18:42.937 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:18:42.937 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:18:42.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:18:43.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:18:43.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:18:43.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:18:43.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:18:43.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:18:43.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:18:43.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:18:43.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:18:43.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:18:43.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:18:43.279 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:18:43.352 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:18:30
2026-06-03T17:18:43.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86599, datetime.datetime(2026, 6, 3, 17, 18, 30), datetime.datetime(2026, 6, 3, 17, 18, 29), 'salt', 6.41, 100.18, None, 56.06, 126.83, -0.03, 820.23, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:18:43.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:18:43.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:18:43.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:18:29, diff=14.360083s, valid=True
2026-06-03T17:18:43.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:18:43.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:18:43.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:18:12, diff=31.363552s, valid=True
2026-06-03T17:18:43.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:18:43.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:18:43.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:18:26, diff=17.371842s, valid=True
2026-06-03T17:18:43.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:18:43.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:18:43.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:18:43.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:18:43.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:18:43.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:18:43.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:18:12, diff=31.375554s, valid=True
2026-06-03T17:18:43.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:18:43.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:18:43.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:18:43.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74120.376376s, valid=False
2026-06-03T17:18:43.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:18:43.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:18:43.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:18:43.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:18:43.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:18:43.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:18:43.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:18:43.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:18:43.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:18:43.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:18:43.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:18:43.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:18:43.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:18:43.702 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:18:43.908 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:18:44.250 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:18:44.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:18:44.354 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:18:44.354 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:18:44.428 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:18:44.428 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:19:14.439 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:19:14.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:19:14.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:19:14.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:19:14.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:19:15.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:19:15.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:19:15.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:19:15.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:19:15.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:19:15.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:19:15.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:19:15.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:19:17.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:19:17.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:19:17.745 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:19:17.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:19:17.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:19:17.768 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:19:17.768 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:19:17.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:19:17.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:19:17.769 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:19:17.770 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:19:17.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:19:17.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:19:17.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:19:18.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:19:18.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:19:18.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:19:18.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:19:18.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:19:18.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:19:18.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:19:18.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:19:18.122 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:19:18.192 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:19:00
2026-06-03T17:19:18.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86600, datetime.datetime(2026, 6, 3, 17, 19), datetime.datetime(2026, 6, 3, 17, 18, 59), 'salt', 6.34, 100.08, None, 57.65, 127.18, -0.02, 820.35, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:19:18.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:19:18.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:19:18.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:18:59, diff=19.199836s, valid=True
2026-06-03T17:19:18.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:19:18.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:19:18.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:19:12, diff=6.203411s, valid=True
2026-06-03T17:19:18.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:19:18.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:19:18.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:18:57, diff=21.21167s, valid=True
2026-06-03T17:19:18.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:19:18.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:19:18.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:19:18.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:19:18.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:19:18.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:19:18.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:19:12, diff=6.215453s, valid=True
2026-06-03T17:19:18.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:19:18.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:19:18.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:19:18.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74155.216275s, valid=False
2026-06-03T17:19:18.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:19:18.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:19:18.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:19:18.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:19:18.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:19:18.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:19:18.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:19:18.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:19:18.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:19:18.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:19:18.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:19:18.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:19:18.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:19:18.606 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:19:18.813 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:19:19.156 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:19:19.259 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:19:19.259 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:19:19.259 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:19:19.333 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:19:19.333 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:19:49.335 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:19:49.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:19:49.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:19:49.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:19:49.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:19:49.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:19:49.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:19:49.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:19:49.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:19:49.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:19:49.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:19:49.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:19:49.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:19:52.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:19:52.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:19:52.540 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:19:52.540 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:19:52.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:19:52.560 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:19:52.560 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:19:52.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:19:52.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:19:52.560 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:19:52.560 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:19:52.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:19:52.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:19:52.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:19:52.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T17:19:52.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:19:52.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:19:52.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:19:52.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:19:52.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:19:52.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:19:52.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:19:52.840 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:19:52.910 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:19:30
2026-06-03T17:19:52.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86601, datetime.datetime(2026, 6, 3, 17, 19, 30), datetime.datetime(2026, 6, 3, 17, 19, 30), 'salt', 6.44, 100.18, None, 50.7, 110.16, -0.03, 820.59, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:19:52.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:19:52.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:19:52.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:19:30, diff=22.916996s, valid=True
2026-06-03T17:19:52.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:19:52.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:19:52.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:19:12, diff=40.920193s, valid=True
2026-06-03T17:19:52.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:19:52.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T17:19:52.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:19:29, diff=23.927734s, valid=True
2026-06-03T17:19:52.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:19:52.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:19:52.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:19:52.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:19:52.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:19:52.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:19:52.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:19:12, diff=40.931136s, valid=True
2026-06-03T17:19:52.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:19:52.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:19:52.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:19:52.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74189.931903s, valid=False
2026-06-03T17:19:52.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:19:52.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:19:52.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:19:52.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:19:52.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:19:52.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:19:52.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:19:52.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:19:53.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:19:53.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:19:53.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:19:53.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:19:53.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:19:53.250 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:19:53.456 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:19:53.798 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:19:53.901 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:19:53.901 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:19:53.901 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:19:54.106 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:19:54.107 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:20:24.137 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:20:24.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:20:24.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:20:24.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:20:24.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:20:24.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:20:24.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:20:24.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:20:24.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:20:24.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:20:24.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:20:24.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:20:24.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:20:27.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:20:27.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:20:27.451 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:20:27.452 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:20:27.462 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:20:27.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:20:27.475 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:20:27.476 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:20:27.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:20:27.476 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:20:27.477 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:20:27.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:20:27.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T17:20:27.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:20:27.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T17:20:27.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:20:27.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:20:27.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:20:27.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:20:27.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:20:27.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:20:27.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:20:27.813 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:20:27.886 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:20:01
2026-06-03T17:20:27.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86602, datetime.datetime(2026, 6, 3, 17, 20, 1), datetime.datetime(2026, 6, 3, 17, 20), 'salt', 6.34, 100.08, None, 51.94, 124.22, -0.02, 820.41, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:20:27.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:20:27.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T17:20:27.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:20:00, diff=27.892348s, valid=True
2026-06-03T17:20:27.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:20:27.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:20:27.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:20:12, diff=15.895244s, valid=True
2026-06-03T17:20:27.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:20:27.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T17:20:27.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:20:00, diff=27.901917s, valid=True
2026-06-03T17:20:27.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:20:27.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:20:27.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:20:27.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:20:27.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:20:27.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:20:27.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:20:12, diff=15.905022s, valid=True
2026-06-03T17:20:27.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:20:27.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:20:27.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:20:27.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74224.905687s, valid=False
2026-06-03T17:20:27.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:20:27.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:20:27.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:20:27.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:20:27.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:20:27.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:20:27.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:20:27.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:20:28.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:20:28.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:20:28.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:20:28.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:20:28.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:20:28.291 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:20:28.499 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:20:28.843 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:20:28.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:20:28.946 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:20:28.946 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:20:29.143 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:20:29.143 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:20:59.164 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:20:59.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:20:59.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:20:59.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:20:59.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:20:59.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:20:59.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:20:59.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:20:59.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:20:59.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:20:59.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:20:59.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:20:59.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:21:02.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:21:02.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:21:02.759 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:21:02.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:21:02.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:21:02.783 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:21:02.784 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:21:02.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:21:02.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:21:02.785 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:21:02.785 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:21:02.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:21:02.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:21:02.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:21:03.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:21:03.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:21:03.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:21:03.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:21:03.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:21:03.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:21:03.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:21:03.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:21:03.134 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:21:03.204 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:21:01
2026-06-03T17:21:03.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86604, datetime.datetime(2026, 6, 3, 17, 21, 1), datetime.datetime(2026, 6, 3, 17, 21), 'salt', 6.48, 100.21, None, 48.37, 108.54, -0.03, 820.41, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:21:03.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:21:03.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:21:03.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:21:00, diff=3.212211s, valid=True
2026-06-03T17:21:03.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:21:03.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:21:03.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:21:12, diff=-8.784283s, valid=True
2026-06-03T17:21:03.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:21:03.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:21:03.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:20:54, diff=9.223955s, valid=True
2026-06-03T17:21:03.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:21:03.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:21:03.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:21:03.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:21:03.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:21:03.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:21:03.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:21:12, diff=-8.772301s, valid=True
2026-06-03T17:21:03.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:21:03.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:21:03.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:21:03.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74260.228497s, valid=False
2026-06-03T17:21:03.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:21:03.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:21:03.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:21:03.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:21:03.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:21:03.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:21:03.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:21:03.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:21:03.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:21:03.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:21:03.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:21:03.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:21:03.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:21:03.549 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:21:03.776 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:21:04.120 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:21:04.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:21:04.224 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:21:04.224 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:21:04.399 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:21:04.399 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:21:34.429 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:21:34.430 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:21:34.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:21:34.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:21:34.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:21:34.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:21:34.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:21:34.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:21:34.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:21:34.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:21:34.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:21:34.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:21:34.933 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:21:38.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:21:38.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:21:38.024 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:21:38.024 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:21:38.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:21:38.047 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:21:38.048 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:21:38.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:21:38.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:21:38.049 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:21:38.049 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:21:38.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:21:38.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:21:38.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:21:38.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:21:38.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:21:38.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:21:38.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:21:38.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:21:38.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:21:38.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:21:38.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:21:38.390 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:21:38.460 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:21:31
2026-06-03T17:21:38.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86605, datetime.datetime(2026, 6, 3, 17, 21, 31), datetime.datetime(2026, 6, 3, 17, 21, 31), 'salt', 6.41, 100.14, None, 48.58, 127.65, -0.03, 820.47, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:21:38.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:21:38.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:21:38.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:21:31, diff=7.467651s, valid=True
2026-06-03T17:21:38.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:21:38.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:21:38.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:21:12, diff=26.471184s, valid=True
2026-06-03T17:21:38.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:21:38.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:21:38.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:21:25, diff=13.479295s, valid=True
2026-06-03T17:21:38.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:21:38.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:21:38.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:21:38.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:21:38.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:21:38.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:21:38.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:21:12, diff=26.483043s, valid=True
2026-06-03T17:21:38.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:21:38.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:21:38.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:21:38.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74295.483874s, valid=False
2026-06-03T17:21:38.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:21:38.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:21:38.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:21:38.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:21:38.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:21:38.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:21:38.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:21:38.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:21:38.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:21:38.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:21:38.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:21:38.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:21:38.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:21:38.802 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:21:39.024 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:21:39.366 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:21:39.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:21:39.469 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:21:39.469 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:21:39.636 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:21:39.636 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:22:09.636 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:22:09.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:22:09.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:22:10.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:22:10.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:22:10.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:22:10.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:22:10.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:22:10.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:22:10.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:22:10.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:22:10.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:22:10.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:22:13.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:22:13.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:22:13.438 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:22:13.438 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:22:13.449 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:22:13.461 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:22:13.462 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:22:13.462 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:22:13.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:22:13.463 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:22:13.463 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:22:13.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:22:13.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:22:13.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:22:13.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:22:13.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:22:13.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:22:13.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:22:13.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:22:13.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:22:13.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:22:13.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:22:13.772 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:22:13.842 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:22:02
2026-06-03T17:22:13.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86606, datetime.datetime(2026, 6, 3, 17, 22, 2), datetime.datetime(2026, 6, 3, 17, 22, 1), 'salt', 6.34, 100.14, None, 52.32, 121.59, -0.03, 820.41, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:22:13.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:22:13.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:22:13.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:22:01, diff=12.849526s, valid=True
2026-06-03T17:22:13.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:22:13.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:22:13.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:22:12, diff=1.852858s, valid=True
2026-06-03T17:22:13.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:22:13.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:22:13.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:21:56, diff=17.860581s, valid=True
2026-06-03T17:22:13.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:22:13.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:22:13.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:22:13.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:22:13.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:22:13.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:22:13.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:22:12, diff=1.864094s, valid=True
2026-06-03T17:22:13.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:22:13.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:22:13.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:22:13.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74330.864853s, valid=False
2026-06-03T17:22:13.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:22:13.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:22:13.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:22:13.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:22:13.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:22:13.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:22:13.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:22:13.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:22:13.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:22:14.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:22:14.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:22:14.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:22:14.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:22:14.183 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:22:14.447 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:22:14.792 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:22:14.896 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:22:14.896 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:22:14.896 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:22:15.065 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:22:15.065 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:22:45.095 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:22:45.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:22:45.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:22:45.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:22:45.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:22:45.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:22:45.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:22:45.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:22:45.545 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:22:45.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:22:45.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:22:45.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:22:45.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:22:48.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:22:48.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:22:48.496 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:22:48.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:22:48.506 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:22:48.519 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:22:48.520 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:22:48.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:22:48.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:22:48.521 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:22:48.521 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:22:48.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:22:48.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:22:48.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:22:48.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:22:48.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:22:48.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:22:48.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:22:48.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:22:48.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:22:48.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:22:48.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:22:48.872 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:22:48.946 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:22:32
2026-06-03T17:22:48.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86607, datetime.datetime(2026, 6, 3, 17, 22, 32), datetime.datetime(2026, 6, 3, 17, 22, 31), 'salt', 6.31, 100.04, None, 54.41, 127.51, -0.01, 820.47, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:22:48.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:22:48.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:22:48.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:22:31, diff=17.953903s, valid=True
2026-06-03T17:22:48.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:22:48.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:22:48.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:22:12, diff=36.957442s, valid=True
2026-06-03T17:22:48.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:22:48.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:22:48.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:22:27, diff=21.965553s, valid=True
2026-06-03T17:22:48.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:22:48.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:22:48.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:22:48.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:22:48.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:22:48.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:22:48.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:22:12, diff=36.969287s, valid=True
2026-06-03T17:22:48.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:22:48.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:22:48.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:22:48.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74365.9701s, valid=False
2026-06-03T17:22:48.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:22:48.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:22:48.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:22:48.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:22:48.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:22:49.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:22:49.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:22:49.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:22:49.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:22:49.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:22:49.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:22:49.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:22:49.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:22:49.290 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:22:49.498 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:22:49.837 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:22:49.949 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:22:49.949 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:22:49.950 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:22:50.116 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:22:50.116 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:23:20.146 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:23:20.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:23:20.147 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:23:20.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:23:20.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:23:20.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:23:20.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:23:20.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:23:20.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:23:20.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:23:20.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:23:20.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:23:20.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:23:23.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:23:23.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:23:23.516 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:23:23.516 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:23:23.528 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:23:23.540 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:23:23.541 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:23:23.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:23:23.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:23:23.542 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:23:23.542 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:23:23.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:23:23.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:23:23.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:23:23.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:23:23.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:23:23.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T17:23:23.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:23:23.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T17:23:23.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:23:23.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:23:23.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:23:23.883 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:23:23.954 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:23:02
2026-06-03T17:23:23.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86608, datetime.datetime(2026, 6, 3, 17, 23, 2), datetime.datetime(2026, 6, 3, 17, 23, 1), 'salt', 6.34, 100.21, None, 47.42, 122.67, -0.04, 820.41, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:23:23.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:23:23.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:23:23.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:23:01, diff=22.961277s, valid=True
2026-06-03T17:23:23.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:23:23.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T17:23:23.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:22:12, diff=71.964771s, valid=True
2026-06-03T17:23:23.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:23:23.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:23:23.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:22:59, diff=24.972868s, valid=True
2026-06-03T17:23:23.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:23:23.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:23:23.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:23:23.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:23:23.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:23:23.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T17:23:23.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:22:12, diff=71.976611s, valid=True
2026-06-03T17:23:23.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:23:23.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:23:23.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:23:23.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74400.977438s, valid=False
2026-06-03T17:23:23.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:23:23.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:23:23.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:23:23.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:23:23.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:23:24.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:23:24.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:23:24.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:23:24.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:23:24.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:23:24.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:23:24.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:23:24.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:23:24.371 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:23:24.578 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:23:24.919 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:23:25.022 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:23:25.022 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:23:25.022 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:23:25.094 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:23:25.094 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:23:55.124 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:23:55.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:23:55.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:23:55.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:23:55.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:23:55.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:23:55.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:23:55.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:23:55.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:23:55.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:23:55.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:23:55.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:23:55.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:23:58.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:23:58.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:23:58.402 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:23:58.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:23:58.413 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:23:58.426 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:23:58.426 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:23:58.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:23:58.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:23:58.427 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:23:58.428 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:23:58.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:23:58.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T17:23:58.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:23:58.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T17:23:58.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:23:58.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T17:23:58.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:23:58.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T17:23:58.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:23:58.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:23:58.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:23:58.791 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:23:58.861 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:23:32
2026-06-03T17:23:58.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86609, datetime.datetime(2026, 6, 3, 17, 23, 32), datetime.datetime(2026, 6, 3, 17, 23, 32), 'salt', 6.38, 100.18, None, 50.49, 128.63, -0.03, 820.47, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:23:58.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:23:58.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T17:23:58.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:23:32, diff=26.869262s, valid=True
2026-06-03T17:23:58.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:23:58.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T17:23:58.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:22:12, diff=106.872876s, valid=True
2026-06-03T17:23:58.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:23:58.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T17:23:58.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:23:30, diff=28.881205s, valid=True
2026-06-03T17:23:58.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:23:58.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:23:58.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:23:58.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:23:58.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:23:58.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T17:23:58.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:22:12, diff=106.88506s, valid=True
2026-06-03T17:23:58.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:23:58.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:23:58.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:23:58.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74435.885906s, valid=False
2026-06-03T17:23:58.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:23:58.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:23:58.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:23:58.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:23:58.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:23:58.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:23:58.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:23:58.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:23:58.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:23:59.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:23:59.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:23:59.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:23:59.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:23:59.209 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:23:59.417 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:23:59.758 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:23:59.865 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:23:59.865 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:23:59.865 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:24:00.123 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:24:00.123 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:24:30.152 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:24:30.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:24:30.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:24:30.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:24:30.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:24:30.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:24:30.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:24:30.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:24:30.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:24:30.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:24:30.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:24:30.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:24:30.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:24:33.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:24:33.687 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:24:33.688 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:24:33.688 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:24:33.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:24:33.710 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:24:33.711 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:24:33.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:24:33.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:24:33.712 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:24:33.712 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:24:33.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:24:33.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:24:33.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:24:33.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:24:33.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:24:33.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T17:24:33.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:24:34.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T17:24:34.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:24:34.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:24:34.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:24:34.043 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:24:34.115 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:24:33
2026-06-03T17:24:34.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86611, datetime.datetime(2026, 6, 3, 17, 24, 33), datetime.datetime(2026, 6, 3, 17, 24, 32), 'salt', 6.28, 100.11, None, 49.08, 129.41, -0.02, 820.53, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:24:34.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:24:34.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:24:34.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:24:32, diff=2.125541s, valid=True
2026-06-03T17:24:34.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:24:34.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T17:24:34.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:22:12, diff=142.130189s, valid=True
2026-06-03T17:24:34.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:24:34.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:24:34.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:24:27, diff=7.140006s, valid=True
2026-06-03T17:24:34.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:24:34.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:24:34.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:24:34.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:24:34.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:24:34.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T17:24:34.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:22:12, diff=142.143787s, valid=True
2026-06-03T17:24:34.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:24:34.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:24:34.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:24:34.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74471.144593s, valid=False
2026-06-03T17:24:34.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:24:34.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:24:34.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:24:34.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:24:34.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:24:34.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:24:34.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:24:34.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:24:34.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:24:34.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:24:34.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:24:34.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:24:34.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:24:34.531 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:24:34.738 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:24:35.077 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:24:35.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:24:35.180 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:24:35.180 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:24:35.398 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:24:35.398 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:25:05.428 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:25:05.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:25:05.429 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:25:05.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:25:05.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:25:06.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:25:06.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:25:06.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:25:06.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:25:06.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:25:06.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:25:06.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:25:06.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:25:08.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:25:08.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:25:08.737 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:25:08.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:25:08.747 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:25:08.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:25:08.761 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:25:08.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:25:08.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:25:08.762 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:25:08.762 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:25:08.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:25:08.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:25:08.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:25:08.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:25:08.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:25:09.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:25:09.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:25:09.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:25:09.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:25:09.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:25:09.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:25:09.088 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:25:09.159 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:25:03
2026-06-03T17:25:09.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86612, datetime.datetime(2026, 6, 3, 17, 25, 3), datetime.datetime(2026, 6, 3, 17, 25, 2), 'salt', 6.38, 100.18, None, 47.46, 122.58, -0.03, 820.41, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:25:09.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:25:09.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:25:09.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:25:02, diff=7.166677s, valid=True
2026-06-03T17:25:09.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:25:09.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:25:09.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:22:12, diff=177.170146s, valid=True
2026-06-03T17:25:09.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:25:09.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:25:09.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:24:57, diff=12.178262s, valid=True
2026-06-03T17:25:09.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:25:09.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:25:09.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:25:09.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:25:09.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:25:09.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:25:09.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:22:12, diff=177.18219s, valid=True
2026-06-03T17:25:09.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:25:09.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:25:09.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:25:09.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74506.183019s, valid=False
2026-06-03T17:25:09.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:25:09.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:25:09.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:25:09.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:25:09.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:25:09.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:25:09.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:25:09.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:25:09.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:25:09.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:25:09.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:25:09.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:25:09.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:25:09.501 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:25:09.707 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:25:10.099 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:25:10.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:25:10.220 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:25:10.220 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:25:11.310 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:25:11.310 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:25:41.324 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:25:41.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:25:41.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:25:41.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:25:41.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:25:41.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:25:41.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:25:41.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:25:41.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:25:41.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:25:41.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:25:41.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:25:41.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:25:44.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:25:44.535 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:25:44.535 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:25:44.536 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:25:44.545 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:25:44.557 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:25:44.558 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:25:44.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:25:44.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:25:44.559 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:25:44.559 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:25:44.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:25:44.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:25:44.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:25:44.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:25:44.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:25:44.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:25:44.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:25:44.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:25:44.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:25:44.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:25:44.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:25:44.883 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:25:44.954 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:25:33
2026-06-03T17:25:44.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86613, datetime.datetime(2026, 6, 3, 17, 25, 33), datetime.datetime(2026, 6, 3, 17, 25, 33), 'salt', 6.24, 100.15, None, 44.67, 127.81, -0.03, 820.41, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:25:44.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:25:44.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:25:44.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:25:33, diff=11.961474s, valid=True
2026-06-03T17:25:44.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:25:44.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:25:44.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:22:12, diff=212.964942s, valid=True
2026-06-03T17:25:44.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:25:44.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:25:44.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:25:27, diff=17.973157s, valid=True
2026-06-03T17:25:44.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:25:44.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:25:44.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:25:44.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:25:44.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:25:44.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:25:44.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:22:12, diff=212.976867s, valid=True
2026-06-03T17:25:44.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:25:44.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:25:44.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:25:44.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74541.977672s, valid=False
2026-06-03T17:25:44.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:25:44.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:25:44.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:25:44.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:25:44.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:25:45.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:25:45.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:25:45.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:25:45.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:25:45.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:25:45.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:25:45.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:25:45.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:25:45.367 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:25:45.573 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:25:45.913 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:25:46.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:25:46.016 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:25:46.016 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:25:46.245 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:25:46.245 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:26:16.275 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:26:16.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:26:16.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:26:16.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:26:16.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:26:16.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:26:16.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:26:16.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:26:16.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:26:16.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:26:16.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:26:16.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:26:16.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:26:19.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:26:19.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:26:19.364 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:26:19.365 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:26:19.375 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:26:19.387 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:26:19.388 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:26:19.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:26:19.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:26:19.389 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:26:19.389 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:26:19.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:26:19.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:26:19.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:26:19.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:26:19.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:26:19.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:26:19.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:26:19.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:26:19.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:26:19.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:26:19.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:26:19.717 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:26:19.823 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:26:04
2026-06-03T17:26:19.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86614, datetime.datetime(2026, 6, 3, 17, 26, 4), datetime.datetime(2026, 6, 3, 17, 26, 3), 'salt', 6.24, 100.08, None, 36.45, 123.54, -0.02, 820.66, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:26:19.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:26:19.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:26:19.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:26:03, diff=16.830428s, valid=True
2026-06-03T17:26:19.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:26:19.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:26:19.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:22:12, diff=247.83353s, valid=True
2026-06-03T17:26:19.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:26:19.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:26:19.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:25:57, diff=22.840223s, valid=True
2026-06-03T17:26:19.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:26:19.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:26:19.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:26:19.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:26:19.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:26:19.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:26:19.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:22:12, diff=247.84359s, valid=True
2026-06-03T17:26:19.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:26:19.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:26:19.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:26:19.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74576.844295s, valid=False
2026-06-03T17:26:19.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:26:19.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:26:19.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:26:19.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:26:19.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:26:19.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:26:19.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:26:19.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:26:19.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:26:19.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:26:20.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:26:20.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:26:20.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:26:20.169 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:26:20.374 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:26:20.712 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:26:20.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:26:20.815 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:26:20.815 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:26:21.010 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:26:21.010 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:26:51.037 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:26:51.038 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:26:51.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:26:51.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:26:51.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:26:51.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:26:51.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:26:51.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:26:51.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:26:51.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:26:51.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:26:51.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:26:51.744 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:26:54.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:26:54.289 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:26:54.290 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:26:54.290 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:26:54.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:26:54.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:26:54.314 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:26:54.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:26:54.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:26:54.316 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:26:54.316 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:26:54.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:26:54.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:26:54.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:26:54.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:26:54.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:26:54.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:26:54.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:26:54.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:26:54.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:26:54.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:26:54.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:26:54.651 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:26:54.721 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:26:34
2026-06-03T17:26:54.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86615, datetime.datetime(2026, 6, 3, 17, 26, 34), datetime.datetime(2026, 6, 3, 17, 26, 33), 'salt', 6.38, 100.15, None, 35.57, 123.3, -0.02, 820.48, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:26:54.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:26:54.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:26:54.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:26:33, diff=21.730145s, valid=True
2026-06-03T17:26:54.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:26:54.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:26:54.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:27:12, diff=-17.266331s, valid=True
2026-06-03T17:26:54.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:26:54.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:26:54.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:26:29, diff=25.741921s, valid=True
2026-06-03T17:26:54.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:26:54.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:26:54.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:26:54.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:26:54.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:26:54.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:26:54.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:27:12, diff=-17.254276s, valid=True
2026-06-03T17:26:54.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:26:54.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:26:54.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:26:54.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74611.746527s, valid=False
2026-06-03T17:26:54.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:26:54.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:26:54.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:26:54.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:26:54.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:26:54.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:26:54.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:26:54.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:26:54.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:26:54.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:26:54.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:26:54.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:26:55.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:26:55.066 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:26:55.271 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:26:55.620 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:26:55.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:26:55.728 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:26:55.728 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:26:55.820 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:26:55.821 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:27:25.851 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:27:25.851 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:27:25.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:27:26.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:27:26.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:27:26.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:27:26.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:27:26.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:27:26.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:27:26.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:27:26.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:27:26.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:27:26.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:27:29.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:27:29.329 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:27:29.330 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:27:29.330 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:27:29.340 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:27:29.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:27:29.354 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:27:29.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:27:29.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:27:29.355 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:27:29.355 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:27:29.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:27:29.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T17:27:29.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:27:29.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T17:27:29.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:27:29.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:27:29.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:27:29.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:27:29.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:27:29.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:27:29.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:27:29.696 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:27:29.770 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:27:04
2026-06-03T17:27:29.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86616, datetime.datetime(2026, 6, 3, 17, 27, 4), datetime.datetime(2026, 6, 3, 17, 27, 3), 'salt', 6.28, 100.15, None, 47.7, 126.0, -0.02, 820.41, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:27:29.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:27:29.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T17:27:29.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:27:03, diff=26.779468s, valid=True
2026-06-03T17:27:29.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:27:29.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:27:29.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:27:12, diff=17.782891s, valid=True
2026-06-03T17:27:29.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:27:29.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T17:27:29.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:27:00, diff=29.790873s, valid=True
2026-06-03T17:27:29.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:27:29.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:27:29.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:27:29.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:27:29.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:27:29.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:27:29.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:27:12, diff=17.794489s, valid=True
2026-06-03T17:27:29.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:27:29.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:27:29.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:27:29.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74646.795304s, valid=False
2026-06-03T17:27:29.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:27:29.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:27:29.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:27:29.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:27:29.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:27:29.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:27:29.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:27:29.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:27:29.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:27:29.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:27:30.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:27:30.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:27:30.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:27:30.139 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:27:30.412 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:27:30.755 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:27:30.860 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:27:30.860 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:27:30.860 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:27:31.040 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:27:31.040 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:28:01.057 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:28:01.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:28:01.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:28:01.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:28:01.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:28:01.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:28:01.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:28:01.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:28:01.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:28:01.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:28:01.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:28:01.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:28:01.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:28:04.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:28:04.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:28:04.413 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:28:04.413 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:28:04.421 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:28:04.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:28:04.433 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:28:04.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:28:04.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:28:04.434 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:28:04.434 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:28:04.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:28:04.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T17:28:04.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:28:04.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T17:28:04.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:28:04.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:28:04.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:28:04.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:28:04.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:28:04.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:28:04.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:28:04.709 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:28:04.779 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:27:35
2026-06-03T17:28:04.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86617, datetime.datetime(2026, 6, 3, 17, 27, 35), datetime.datetime(2026, 6, 3, 17, 27, 34), 'salt', 6.25, 100.15, None, 47.49, 120.35, -0.02, 820.23, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:28:04.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:28:04.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T17:28:04.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:27:34, diff=30.786716s, valid=True
2026-06-03T17:28:04.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:28:04.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:28:04.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:28:12, diff=-7.210087s, valid=True
2026-06-03T17:28:04.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:28:04.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T17:28:04.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:27:32, diff=32.797553s, valid=True
2026-06-03T17:28:04.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:28:04.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:28:04.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:28:04.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:28:04.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:28:04.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:28:04.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:28:12, diff=-7.199044s, valid=True
2026-06-03T17:28:04.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:28:04.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:28:04.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:28:04.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74681.801731s, valid=False
2026-06-03T17:28:04.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:28:04.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:28:04.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:28:04.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:28:04.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:28:04.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:28:04.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:28:04.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:28:04.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:28:04.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:28:05.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:28:05.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:28:05.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:28:05.124 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:28:05.332 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:28:05.675 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:28:05.778 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:28:05.778 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:28:05.778 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:28:06.076 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:28:06.076 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:28:36.094 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:28:36.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:28:36.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:28:36.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:28:36.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:28:36.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:28:36.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:28:36.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:28:36.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:28:36.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:28:36.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:28:36.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:28:36.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:28:39.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:28:39.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:28:39.360 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:28:39.360 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:28:39.370 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:28:39.382 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:28:39.383 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:28:39.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:28:39.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:28:39.384 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:28:39.384 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:28:39.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:28:39.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:28:39.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:28:39.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:28:39.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:28:39.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:28:39.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:28:39.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:28:39.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:28:39.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:28:39.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:28:39.717 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:28:39.788 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:28:36
2026-06-03T17:28:39.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86619, datetime.datetime(2026, 6, 3, 17, 28, 36), datetime.datetime(2026, 6, 3, 17, 28, 35), 'salt', 6.31, 100.15, None, 47.95, 130.18, -0.03, 820.35, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:28:39.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:28:39.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:28:39.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:28:35, diff=4.795272s, valid=True
2026-06-03T17:28:39.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:28:39.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:28:39.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:29:12, diff=-32.201229s, valid=True
2026-06-03T17:28:39.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:28:39.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:28:39.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:28:34, diff=5.806898s, valid=True
2026-06-03T17:28:39.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:28:39.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:28:39.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:28:39.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:28:39.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:28:39.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:28:39.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:29:12, diff=-32.189388s, valid=True
2026-06-03T17:28:39.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:28:39.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:28:39.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:28:39.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74716.811432s, valid=False
2026-06-03T17:28:39.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:28:39.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:28:39.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:28:39.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:28:39.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:28:39.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:28:39.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:28:39.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:28:39.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:28:39.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:28:40.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:28:40.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:28:40.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:28:40.235 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:28:40.442 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:28:40.784 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:28:40.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:28:40.887 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:28:40.887 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:28:41.143 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:28:41.143 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:29:11.173 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:29:11.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:29:11.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:29:11.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:29:11.715 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:29:11.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:29:11.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:29:11.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:29:11.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:29:11.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:29:11.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:29:11.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:29:11.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:29:14.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:29:14.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:29:14.689 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:29:14.689 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:29:14.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:29:14.713 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:29:14.713 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:29:14.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:29:14.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:29:14.714 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:29:14.715 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:29:14.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:29:14.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:29:14.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:29:14.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:29:14.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:29:15.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:29:15.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:29:15.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:29:15.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:29:15.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:29:15.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:29:15.056 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:29:15.128 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:29:06
2026-06-03T17:29:15.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86620, datetime.datetime(2026, 6, 3, 17, 29, 6), datetime.datetime(2026, 6, 3, 17, 29, 5), 'salt', 6.21, 100.11, None, 54.51, 118.47, -0.02, 820.23, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:29:15.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:29:15.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:29:15.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:29:05, diff=10.135434s, valid=True
2026-06-03T17:29:15.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:29:15.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:29:15.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:29:12, diff=3.138912s, valid=True
2026-06-03T17:29:15.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:29:15.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:29:15.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:29:06, diff=9.146947s, valid=True
2026-06-03T17:29:15.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:29:15.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:29:15.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:29:15.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:29:15.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:29:15.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:29:15.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:29:12, diff=3.150647s, valid=True
2026-06-03T17:29:15.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:29:15.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:29:15.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:29:15.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74752.151438s, valid=False
2026-06-03T17:29:15.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:29:15.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:29:15.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:29:15.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:29:15.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:29:15.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:29:15.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:29:15.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:29:15.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:29:15.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:29:15.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:29:15.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:29:15.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:29:15.474 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:29:15.681 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:29:16.023 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:29:16.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:29:16.127 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:29:16.127 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:29:16.316 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:29:16.316 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:29:46.346 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:29:46.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:29:46.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:29:46.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:29:46.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:29:47.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:29:47.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:29:47.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:29:47.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:29:47.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:29:47.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:29:47.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:29:47.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:29:49.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:29:49.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:29:49.868 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:29:49.868 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:29:49.875 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:29:49.886 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:29:49.887 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:29:49.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:29:49.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:29:49.887 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:29:49.887 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:29:49.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:29:49.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:29:49.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:29:50.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:29:50.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:29:50.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:29:50.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:29:50.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:29:50.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:29:50.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:29:50.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:29:50.185 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:29:50.257 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:29:36
2026-06-03T17:29:50.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86621, datetime.datetime(2026, 6, 3, 17, 29, 36), datetime.datetime(2026, 6, 3, 17, 29, 36), 'salt', 6.15, 100.11, None, 51.69, 120.04, -0.02, 820.29, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:29:50.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:29:50.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:29:50.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:29:36, diff=14.263499s, valid=True
2026-06-03T17:29:50.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:29:50.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:29:50.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:30:12, diff=-21.733455s, valid=True
2026-06-03T17:29:50.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:29:50.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:29:50.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:29:29, diff=21.273584s, valid=True
2026-06-03T17:29:50.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:29:50.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:29:50.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:29:50.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:29:50.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:29:50.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:29:50.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:30:12, diff=-21.723263s, valid=True
2026-06-03T17:29:50.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:29:50.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:29:50.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:29:50.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74787.277416s, valid=False
2026-06-03T17:29:50.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:29:50.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:29:50.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:29:50.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:29:50.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:29:50.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:29:50.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:29:50.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:29:50.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:29:50.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:29:50.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:29:50.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:29:50.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:29:50.661 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:29:50.866 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:29:51.209 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:29:51.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:29:51.312 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:29:51.312 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:29:51.499 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:29:51.499 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:30:21.529 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:30:21.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:30:21.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:30:21.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:30:21.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:30:22.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:30:22.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:30:22.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:30:22.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:30:22.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:30:22.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:30:22.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:30:22.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:30:24.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:30:24.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:30:24.828 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:30:24.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:30:24.838 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:30:24.850 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:30:24.850 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:30:24.851 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:30:24.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:30:24.851 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:30:24.851 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:30:24.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:30:24.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:30:24.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:30:25.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:30:25.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:30:25.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:30:25.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:30:25.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:30:25.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:30:25.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:30:25.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:30:25.123 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:30:25.193 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:30:07
2026-06-03T17:30:25.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86622, datetime.datetime(2026, 6, 3, 17, 30, 7), datetime.datetime(2026, 6, 3, 17, 30, 6), 'salt', 6.21, 100.11, None, 55.22, 128.7, -0.02, 820.17, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:30:25.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:30:25.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:30:25.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:30:06, diff=19.198884s, valid=True
2026-06-03T17:30:25.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:30:25.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:30:25.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:30:12, diff=13.201671s, valid=True
2026-06-03T17:30:25.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:30:25.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:30:25.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:29:59, diff=26.208096s, valid=True
2026-06-03T17:30:25.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:30:25.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:30:25.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:30:25.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:30:25.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:30:25.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:30:25.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:30:12, diff=13.211045s, valid=True
2026-06-03T17:30:25.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:30:25.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:30:25.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:30:25.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74822.211691s, valid=False
2026-06-03T17:30:25.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:30:25.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:30:25.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:30:25.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:30:25.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:30:25.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:30:25.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:30:25.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:30:25.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:30:25.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:30:25.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:30:25.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:30:25.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:30:25.527 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:30:25.732 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:30:26.074 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:30:26.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:30:26.176 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:30:26.176 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:30:26.366 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:30:26.366 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:30:56.396 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:30:56.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:30:56.396 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:30:56.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:30:56.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:30:56.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:30:56.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:30:56.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:30:56.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:30:56.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:30:56.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:30:56.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:30:56.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:30:59.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:30:59.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:30:59.457 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:30:59.457 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:30:59.467 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:30:59.479 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:30:59.480 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:30:59.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:30:59.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:30:59.481 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:30:59.481 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:30:59.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:30:59.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:30:59.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:30:59.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:30:59.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:30:59.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:30:59.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:30:59.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:30:59.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:30:59.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:30:59.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:30:59.810 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:30:59.881 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:30:37
2026-06-03T17:30:59.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86623, datetime.datetime(2026, 6, 3, 17, 30, 37), datetime.datetime(2026, 6, 3, 17, 30, 36), 'salt', 6.21, 100.15, None, 44.7, 123.59, -0.03, 820.35, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:30:59.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:30:59.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:30:59.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:30:36, diff=23.887392s, valid=True
2026-06-03T17:30:59.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:30:59.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:30:59.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:31:12, diff=-12.109619s, valid=True
2026-06-03T17:30:59.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:30:59.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:30:59.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:30:30, diff=29.897326s, valid=True
2026-06-03T17:30:59.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:30:59.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:30:59.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:30:59.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:30:59.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:30:59.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:30:59.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:31:12, diff=-12.09952s, valid=True
2026-06-03T17:30:59.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:30:59.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:30:59.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:30:59.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74856.901205s, valid=False
2026-06-03T17:30:59.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:30:59.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:30:59.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:30:59.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:30:59.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:30:59.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:30:59.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:30:59.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:31:00.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:31:00.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:31:00.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:31:00.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:31:00.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:31:00.302 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:31:00.509 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:31:00.849 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:31:00.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:31:00.951 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:31:00.951 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:31:01.287 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:31:01.287 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:31:31.294 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:31:31.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:31:31.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:31:31.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:31:31.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:31:31.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:31:31.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:31:31.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:31:31.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:31:31.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:31:31.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:31:31.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:31:31.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:31:34.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:31:34.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:31:34.793 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:31:34.793 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:31:34.801 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:31:34.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:31:34.813 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:31:34.813 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:31:34.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:31:34.813 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:31:34.813 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:31:34.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:31:34.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T17:31:34.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:31:35.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T17:31:35.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:31:35.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:31:35.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:31:35.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:31:35.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:31:35.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:31:35.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:31:35.097 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:31:35.168 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:31:07
2026-06-03T17:31:35.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86624, datetime.datetime(2026, 6, 3, 17, 31, 7), datetime.datetime(2026, 6, 3, 17, 31, 6), 'salt', 6.08, 100.11, None, 40.58, 119.92, -0.02, 820.48, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:31:35.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:31:35.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T17:31:35.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:31:06, diff=29.176702s, valid=True
2026-06-03T17:31:35.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:31:35.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:31:35.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:31:12, diff=23.179978s, valid=True
2026-06-03T17:31:35.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:31:35.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T17:31:35.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:31:01, diff=34.187491s, valid=True
2026-06-03T17:31:35.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:31:35.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:31:35.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:31:35.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:31:35.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:31:35.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:31:35.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:31:12, diff=23.190938s, valid=True
2026-06-03T17:31:35.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:31:35.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:31:35.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:31:35.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74892.191699s, valid=False
2026-06-03T17:31:35.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:31:35.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:31:35.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:31:35.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:31:35.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:31:35.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:31:35.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:31:35.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:31:35.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:31:35.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:31:35.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:31:35.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:31:35.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:31:35.509 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:31:35.714 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:31:36.053 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:31:36.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:31:36.155 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:31:36.155 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:31:36.341 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:31:36.341 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:32:06.366 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:32:06.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:32:06.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:32:06.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:32:06.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:32:06.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:32:06.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:32:06.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:32:06.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:32:06.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:32:06.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:32:06.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:32:06.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:32:09.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:32:09.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:32:09.687 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:32:09.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:32:09.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:32:09.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:32:09.710 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:32:09.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:32:09.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:32:09.711 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:32:09.711 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:32:09.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:32:09.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:32:09.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:32:09.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:32:09.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:32:09.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:32:09.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:32:10.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:32:10.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:32:10.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:32:10.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:32:10.030 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:32:10.113 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:32:08
2026-06-03T17:32:10.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86626, datetime.datetime(2026, 6, 3, 17, 32, 8), datetime.datetime(2026, 6, 3, 17, 32, 7), 'salt', 6.21, 100.15, None, 38.95, 132.74, -0.03, 820.48, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:32:10.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:32:10.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:32:10.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:32:07, diff=3.120538s, valid=True
2026-06-03T17:32:10.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:32:10.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:32:10.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:32:12, diff=-1.876248s, valid=True
2026-06-03T17:32:10.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:32:10.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:32:10.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:32:04, diff=6.1311s, valid=True
2026-06-03T17:32:10.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:32:10.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:32:10.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:32:10.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:32:10.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:32:10.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:32:10.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:32:12, diff=-1.865524s, valid=True
2026-06-03T17:32:10.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:32:10.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:32:10.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:32:10.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74927.135219s, valid=False
2026-06-03T17:32:10.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:32:10.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:32:10.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:32:10.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:32:10.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:32:10.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:32:10.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:32:10.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:32:10.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:32:10.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:32:10.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:32:10.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:32:10.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:32:10.452 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:32:10.658 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:32:10.999 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:32:11.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:32:11.103 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:32:11.103 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:32:11.299 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:32:11.300 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:32:41.330 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:32:41.330 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:32:41.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:32:41.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:32:41.778 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:32:42.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:32:42.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:32:42.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:32:42.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:32:42.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:32:42.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:32:42.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:32:42.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:32:44.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:32:44.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:32:44.818 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:32:44.818 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:32:44.827 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:32:44.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:32:44.841 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:32:44.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:32:44.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:32:44.842 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:32:44.842 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:32:44.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:32:44.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:32:44.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:32:45.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:32:45.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:32:45.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:32:45.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:32:45.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:32:45.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:32:45.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:32:45.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:32:45.172 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:32:45.247 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:32:38
2026-06-03T17:32:45.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86627, datetime.datetime(2026, 6, 3, 17, 32, 38), datetime.datetime(2026, 6, 3, 17, 32, 37), 'salt', 6.18, 100.18, None, 37.22, 105.06, -0.03, 820.42, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:32:45.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:32:45.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:32:45.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:32:37, diff=8.255236s, valid=True
2026-06-03T17:32:45.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:32:45.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:32:45.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:33:12, diff=-26.741285s, valid=True
2026-06-03T17:32:45.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:32:45.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:32:45.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:32:35, diff=10.266837s, valid=True
2026-06-03T17:32:45.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:32:45.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:32:45.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:32:45.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:32:45.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:32:45.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:32:45.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:33:12, diff=-26.729392s, valid=True
2026-06-03T17:32:45.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:32:45.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:32:45.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:32:45.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74962.271455s, valid=False
2026-06-03T17:32:45.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:32:45.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:32:45.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:32:45.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:32:45.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:32:45.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:32:45.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:32:45.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:32:45.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:32:45.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:32:45.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:32:45.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:32:45.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:32:45.590 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:32:45.854 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:32:46.192 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:32:46.295 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:32:46.296 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:32:46.296 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:32:46.383 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:32:46.383 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:33:16.413 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:33:16.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:33:16.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:33:17.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:33:17.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:33:17.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:33:17.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:33:17.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:33:17.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:33:17.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:33:17.437 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:33:17.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:33:17.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:33:20.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:33:20.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:33:20.157 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:33:20.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:33:20.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:33:20.178 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:33:20.178 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:33:20.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:33:20.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:33:20.179 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:33:20.179 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:33:20.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:33:20.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:33:20.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:33:20.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:33:20.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:33:20.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:33:20.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:33:20.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:33:20.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:33:20.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:33:20.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:33:20.499 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:33:20.569 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:33:08
2026-06-03T17:33:20.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86628, datetime.datetime(2026, 6, 3, 17, 33, 8), datetime.datetime(2026, 6, 3, 17, 33, 7), 'salt', 6.15, 100.11, None, 41.88, 118.82, -0.02, 820.66, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:33:20.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:33:20.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:33:20.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:33:07, diff=13.577113s, valid=True
2026-06-03T17:33:20.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:33:20.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:33:20.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:33:12, diff=8.580571s, valid=True
2026-06-03T17:33:20.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:33:20.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:33:20.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:33:07, diff=13.588663s, valid=True
2026-06-03T17:33:20.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:33:20.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:33:20.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:33:20.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:33:20.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:33:20.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:33:20.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:33:12, diff=8.592391s, valid=True
2026-06-03T17:33:20.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:33:20.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:33:20.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:33:20.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=74997.593214s, valid=False
2026-06-03T17:33:20.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:33:20.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:33:20.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:33:20.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:33:20.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:33:20.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:33:20.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:33:20.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:33:20.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:33:20.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:33:20.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:33:20.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:33:20.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:33:20.911 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:33:21.116 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:33:21.457 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:33:21.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:33:21.559 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:33:21.559 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:33:21.742 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:33:21.743 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:33:51.746 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:33:51.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:33:51.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:33:52.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:33:52.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:33:52.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:33:52.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:33:52.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:33:52.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:33:52.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:33:52.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:33:52.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:33:52.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:33:54.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:33:54.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:33:54.965 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:33:54.965 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:33:54.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:33:54.988 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:33:54.988 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:33:54.989 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:33:54.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:33:54.989 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:33:54.990 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:33:54.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:33:55.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:33:55.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:33:55.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:33:55.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:33:55.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:33:55.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:33:55.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:33:55.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:33:55.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:33:55.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:33:55.333 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:33:55.413 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:33:38
2026-06-03T17:33:55.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86629, datetime.datetime(2026, 6, 3, 17, 33, 38), datetime.datetime(2026, 6, 3, 17, 33, 38), 'salt', 6.15, 100.11, None, 47.81, 115.56, -0.02, 820.42, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:33:55.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:33:55.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:33:55.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:33:38, diff=17.421321s, valid=True
2026-06-03T17:33:55.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:33:55.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:33:55.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:34:12, diff=-16.575486s, valid=True
2026-06-03T17:33:55.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:33:55.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:33:55.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:33:38, diff=17.431999s, valid=True
2026-06-03T17:33:55.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:33:55.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:33:55.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:33:55.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:33:55.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:33:55.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:33:55.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:34:12, diff=-16.564684s, valid=True
2026-06-03T17:33:55.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:33:55.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:33:55.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:33:55.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75032.436047s, valid=False
2026-06-03T17:33:55.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:33:55.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:33:55.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:33:55.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:33:55.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:33:55.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:33:55.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:33:55.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:33:55.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:33:55.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:33:55.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:33:55.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:33:55.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:33:55.858 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:33:56.065 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:33:56.403 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:33:56.507 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:33:56.507 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:33:56.507 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:33:56.659 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:33:56.659 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:34:26.672 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:34:26.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:34:26.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:34:26.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:34:26.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:34:27.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:34:27.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:34:27.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:34:27.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:34:27.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:34:27.084 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:34:27.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:34:27.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:34:29.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:34:29.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:34:29.819 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:34:29.819 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:34:29.827 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:34:29.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:34:29.840 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:34:29.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:34:29.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:34:29.840 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:34:29.840 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:34:29.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:34:29.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:34:29.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:34:30.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:34:30.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:34:30.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:34:30.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:34:30.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:34:30.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:34:30.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:34:30.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:34:30.122 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:34:30.191 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:34:08
2026-06-03T17:34:30.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86630, datetime.datetime(2026, 6, 3, 17, 34, 8), datetime.datetime(2026, 6, 3, 17, 34, 8), 'salt', 6.08, 100.08, None, 34.08, 118.66, -0.02, 820.42, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:34:30.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:34:30.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:34:30.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:34:08, diff=22.198268s, valid=True
2026-06-03T17:34:30.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:34:30.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:34:30.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:34:12, diff=18.201404s, valid=True
2026-06-03T17:34:30.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:34:30.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:34:30.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:34:01, diff=29.208813s, valid=True
2026-06-03T17:34:30.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:34:30.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:34:30.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:34:30.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:34:30.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:34:30.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:34:30.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:34:12, diff=18.212172s, valid=True
2026-06-03T17:34:30.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:34:30.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:34:30.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:34:30.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75067.212912s, valid=False
2026-06-03T17:34:30.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:34:30.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:34:30.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:34:30.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:34:30.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:34:30.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:34:30.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:34:30.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:34:30.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:34:30.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:34:30.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:34:30.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:34:30.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:34:30.534 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:34:30.739 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:34:31.090 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:34:31.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:34:31.194 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:34:31.194 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:34:31.423 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:34:31.423 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:35:01.453 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:35:01.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:35:01.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:35:01.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:35:01.952 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:35:02.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:35:02.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:35:02.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:35:02.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:35:02.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:35:02.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:35:02.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:35:02.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:35:04.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:35:04.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:35:04.787 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:35:04.787 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:35:04.796 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:35:04.808 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:35:04.808 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:35:04.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:35:04.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:35:04.809 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:35:04.809 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:35:04.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:35:04.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T17:35:04.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:35:05.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T17:35:05.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:35:05.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:35:05.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:35:05.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:35:05.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:35:05.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:35:05.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:35:05.104 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:35:05.175 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:34:39
2026-06-03T17:35:05.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86631, datetime.datetime(2026, 6, 3, 17, 34, 39), datetime.datetime(2026, 6, 3, 17, 34, 38), 'salt', 6.08, 100.11, None, 49.54, 133.0, -0.02, 820.48, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:35:05.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:35:05.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T17:35:05.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:34:38, diff=27.182791s, valid=True
2026-06-03T17:35:05.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:35:05.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:35:05.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:35:12, diff=-6.813851s, valid=True
2026-06-03T17:35:05.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:35:05.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T17:35:05.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:34:32, diff=33.194399s, valid=True
2026-06-03T17:35:05.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:35:05.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:35:05.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:35:05.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:35:05.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:35:05.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:35:05.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:35:12, diff=-6.801985s, valid=True
2026-06-03T17:35:05.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:35:05.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:35:05.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:35:05.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75102.198805s, valid=False
2026-06-03T17:35:05.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:35:05.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:35:05.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:35:05.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:35:05.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:35:05.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:35:05.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:35:05.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:35:05.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:35:05.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:35:05.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:35:05.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:35:05.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:35:05.589 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:35:05.796 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:35:06.136 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:35:06.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:35:06.238 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:35:06.238 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:35:06.426 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:35:06.426 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:35:36.456 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:35:36.457 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:35:36.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:35:36.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:35:36.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:35:37.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:35:37.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:35:37.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:35:37.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:35:37.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:35:37.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:35:37.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:35:37.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:35:39.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:35:40.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:35:40.003 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:35:40.003 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:35:40.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:35:40.023 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:35:40.023 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:35:40.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:35:40.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:35:40.024 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:35:40.024 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:35:40.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:35:40.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:35:40.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:35:40.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:35:40.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:35:40.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:35:40.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:35:40.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:35:40.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:35:40.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:35:40.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:35:40.315 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:35:40.387 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:35:39
2026-06-03T17:35:40.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86633, datetime.datetime(2026, 6, 3, 17, 35, 39), datetime.datetime(2026, 6, 3, 17, 35, 39), 'salt', 5.98, 100.08, None, 46.11, 128.77, -0.02, 820.42, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:35:40.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:35:40.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:35:40.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:35:39, diff=1.395448s, valid=True
2026-06-03T17:35:40.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:35:40.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:35:40.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:36:12, diff=-31.598709s, valid=True
2026-06-03T17:35:40.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:35:40.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:35:40.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:35:34, diff=6.410285s, valid=True
2026-06-03T17:35:40.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:35:40.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:35:40.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:35:40.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:35:40.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:35:40.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:35:40.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:36:12, diff=-31.586073s, valid=True
2026-06-03T17:35:40.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:35:40.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:35:40.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:35:40.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75137.414731s, valid=False
2026-06-03T17:35:40.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:35:40.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:35:40.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:35:40.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:35:40.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:35:40.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:35:40.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:35:40.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:35:40.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:35:40.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:35:40.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:35:40.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:35:40.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:35:40.759 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:35:40.980 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:35:41.349 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:35:41.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:35:41.453 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:35:41.453 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:35:41.623 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:35:41.623 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:36:11.651 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:36:11.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:36:11.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:36:11.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:36:11.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:36:12.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:36:12.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:36:12.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:36:12.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:36:12.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:36:12.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:36:12.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:36:12.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:36:16.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:36:16.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:36:16.302 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:36:16.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:36:16.313 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:36:16.325 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:36:16.325 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:36:16.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:36:16.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:36:16.327 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:36:16.327 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:36:16.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:36:16.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:36:16.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:36:16.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:36:16.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:36:16.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:36:16.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:36:16.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:36:16.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:36:16.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:36:16.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:36:16.663 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:36:16.734 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:36:10
2026-06-03T17:36:16.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86634, datetime.datetime(2026, 6, 3, 17, 36, 10), datetime.datetime(2026, 6, 3, 17, 36, 9), 'salt', 5.95, 100.05, None, 54.16, 137.39, -0.01, 820.48, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:36:16.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:36:16.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:36:16.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:36:09, diff=7.742072s, valid=True
2026-06-03T17:36:16.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:36:16.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:36:16.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:36:12, diff=4.745582s, valid=True
2026-06-03T17:36:16.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:36:16.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:36:16.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:36:05, diff=11.753692s, valid=True
2026-06-03T17:36:16.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:36:16.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:36:16.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:36:16.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:36:16.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:36:16.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:36:16.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:36:12, diff=4.757429s, valid=True
2026-06-03T17:36:16.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:36:16.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:36:16.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:36:16.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75173.758286s, valid=False
2026-06-03T17:36:16.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:36:16.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:36:16.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:36:16.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:36:16.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:36:16.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:36:16.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:36:16.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:36:16.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:36:16.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:36:17.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:36:17.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:36:17.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:36:17.148 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:36:17.354 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:36:17.695 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:36:17.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:36:17.797 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:36:17.798 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:36:18.390 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:36:18.391 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:36:48.421 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:36:48.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:36:48.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:36:48.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:36:48.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:36:48.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:36:48.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:36:48.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:36:48.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:36:48.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:36:48.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:36:48.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:36:48.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:36:51.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:36:51.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:36:51.706 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:36:51.706 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:36:51.717 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:36:51.730 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:36:51.730 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:36:51.731 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:36:51.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:36:51.732 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:36:51.732 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:36:51.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:36:51.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:36:51.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:36:51.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:36:51.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:36:52.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:36:52.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:36:52.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:36:52.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:36:52.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:36:52.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:36:52.073 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:36:52.157 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:36:40
2026-06-03T17:36:52.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86635, datetime.datetime(2026, 6, 3, 17, 36, 40), datetime.datetime(2026, 6, 3, 17, 36, 39), 'salt', 5.95, 100.08, None, 48.9, 135.07, -0.01, 820.54, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:36:52.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:36:52.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:36:52.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:36:39, diff=13.164701s, valid=True
2026-06-03T17:36:52.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:36:52.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:36:52.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:37:12, diff=-19.831802s, valid=True
2026-06-03T17:36:52.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:36:52.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:36:52.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:36:37, diff=15.176426s, valid=True
2026-06-03T17:36:52.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:36:52.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:36:52.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:36:52.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:36:52.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:36:52.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:36:52.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:37:12, diff=-19.819844s, valid=True
2026-06-03T17:36:52.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:36:52.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:36:52.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:36:52.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75209.180967s, valid=False
2026-06-03T17:36:52.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:36:52.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:36:52.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:36:52.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:36:52.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:36:52.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:36:52.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:36:52.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:36:52.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:36:52.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:36:52.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:36:52.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:36:52.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:36:52.500 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:36:52.705 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:36:53.045 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:36:53.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:36:53.147 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:36:53.147 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:36:53.299 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:36:53.299 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:37:23.328 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:37:23.329 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:37:23.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:37:23.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:37:23.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:37:23.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:37:23.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:37:23.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:37:23.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:37:23.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:37:23.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:37:23.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:37:23.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:37:26.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:37:26.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:37:26.659 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:37:26.660 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:37:26.670 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:37:26.683 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:37:26.684 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:37:26.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:37:26.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:37:26.685 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:37:26.685 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:37:26.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:37:26.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:37:26.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:37:26.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:37:26.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:37:26.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:37:26.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:37:27.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:37:27.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:37:27.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:37:27.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:37:27.030 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:37:27.101 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:37:10
2026-06-03T17:37:27.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86636, datetime.datetime(2026, 6, 3, 17, 37, 10), datetime.datetime(2026, 6, 3, 17, 37, 9), 'salt', 5.95, 100.15, None, 47.56, 127.88, -0.02, 820.48, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:37:27.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:37:27.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:37:27.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:37:09, diff=18.108886s, valid=True
2026-06-03T17:37:27.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:37:27.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:37:27.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:37:12, diff=15.112394s, valid=True
2026-06-03T17:37:27.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:37:27.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:37:27.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:37:08, diff=19.120582s, valid=True
2026-06-03T17:37:27.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:37:27.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:37:27.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:37:27.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:37:27.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:37:27.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:37:27.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:37:12, diff=15.124288s, valid=True
2026-06-03T17:37:27.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:37:27.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:37:27.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:37:27.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75244.125153s, valid=False
2026-06-03T17:37:27.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:37:27.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:37:27.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:37:27.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:37:27.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:37:27.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:37:27.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:37:27.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:37:27.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:37:27.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:37:27.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:37:27.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:37:27.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:37:27.444 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:37:27.657 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:37:27.989 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:37:28.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:37:28.090 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:37:28.090 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:37:28.276 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:37:28.276 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:37:58.300 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:37:58.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:37:58.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:37:58.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:37:58.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:37:58.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:37:58.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:37:58.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:37:58.698 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:37:58.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:37:58.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:37:58.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:37:58.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:38:01.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:38:01.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:38:01.360 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:38:01.360 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:38:01.370 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:38:01.383 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:38:01.383 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:38:01.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:38:01.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:38:01.384 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:38:01.385 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:38:01.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:38:01.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:38:01.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:38:01.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:38:01.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:38:01.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:38:01.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:38:01.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:38:01.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:38:01.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:38:01.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:38:01.724 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:38:01.805 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:37:40
2026-06-03T17:38:01.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86637, datetime.datetime(2026, 6, 3, 17, 37, 40), datetime.datetime(2026, 6, 3, 17, 37, 40), 'salt', 5.91, 100.08, None, 41.42, 137.18, -0.02, 820.48, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:38:01.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:38:01.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:38:01.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:37:40, diff=21.812998s, valid=True
2026-06-03T17:38:01.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:38:01.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:38:01.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:38:12, diff=-10.183387s, valid=True
2026-06-03T17:38:01.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:38:01.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:38:01.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:37:40, diff=21.824778s, valid=True
2026-06-03T17:38:01.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:38:01.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:38:01.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:38:01.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:38:01.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:38:01.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:38:01.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:38:12, diff=-10.171504s, valid=True
2026-06-03T17:38:01.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:38:01.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:38:01.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:38:01.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75278.829318s, valid=False
2026-06-03T17:38:01.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:38:01.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:38:01.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:38:01.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:38:01.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:38:01.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:38:01.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:38:01.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:38:01.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:38:01.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:38:02.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:38:02.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:38:02.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:38:02.149 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:38:02.346 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:38:02.736 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:38:02.838 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:38:02.838 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:38:02.838 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:38:03.027 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:38:03.027 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:38:33.028 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:38:33.028 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:38:33.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:38:33.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:38:33.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:38:33.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:38:33.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:38:33.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:38:33.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:38:33.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:38:33.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:38:33.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:38:33.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:38:36.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:38:36.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:38:36.432 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:38:36.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:38:36.441 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:38:36.454 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:38:36.455 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:38:36.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:38:36.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:38:36.456 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:38:36.456 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:38:36.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:38:36.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T17:38:36.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:38:36.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T17:38:36.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:38:36.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:38:36.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:38:36.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:38:36.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:38:36.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:38:36.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:38:36.822 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:38:36.905 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:38:11
2026-06-03T17:38:36.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86638, datetime.datetime(2026, 6, 3, 17, 38, 11), datetime.datetime(2026, 6, 3, 17, 38, 10), 'salt', 5.85, 100.08, None, 47.53, 137.72, -0.02, 820.54, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:38:36.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:38:36.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T17:38:36.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:38:10, diff=26.913282s, valid=True
2026-06-03T17:38:36.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:38:36.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:38:36.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:38:12, diff=24.916876s, valid=True
2026-06-03T17:38:36.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:38:36.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T17:38:36.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:38:04, diff=32.925406s, valid=True
2026-06-03T17:38:36.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:38:36.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:38:36.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:38:36.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:38:36.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:38:36.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:38:36.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:38:12, diff=24.929261s, valid=True
2026-06-03T17:38:36.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:38:36.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:38:36.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:38:36.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75313.930104s, valid=False
2026-06-03T17:38:36.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:38:36.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:38:36.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:38:36.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:38:36.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:38:36.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:38:36.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:38:36.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:38:37.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:38:37.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:38:37.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:38:37.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:38:37.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:38:37.253 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:38:37.454 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:38:37.789 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:38:37.890 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:38:37.890 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:38:37.890 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:38:38.042 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:38:38.042 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:39:08.072 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:39:08.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:39:08.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:39:08.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:39:08.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:39:08.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:39:08.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:39:08.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:39:08.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:39:08.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:39:08.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:39:08.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:39:08.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:39:11.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:39:11.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:39:11.402 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:39:11.402 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:39:11.413 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:39:11.426 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:39:11.426 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:39:11.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:39:11.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:39:11.427 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:39:11.428 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:39:11.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:39:11.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:39:11.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:39:11.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:39:11.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:39:11.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:39:11.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:39:11.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:39:11.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:39:11.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:39:11.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:39:11.770 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:39:11.841 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:39:11
2026-06-03T17:39:11.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86640, datetime.datetime(2026, 6, 3, 17, 39, 11), datetime.datetime(2026, 6, 3, 17, 39, 10), 'salt', 5.92, 100.18, None, 40.36, 135.07, -0.03, 820.67, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:39:11.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:39:11.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:39:11.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:39:10, diff=1.848569s, valid=True
2026-06-03T17:39:11.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:39:11.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:39:11.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:39:12, diff=-0.147938s, valid=True
2026-06-03T17:39:11.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:39:11.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:39:11.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:39:04, diff=7.860289s, valid=True
2026-06-03T17:39:11.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:39:11.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:39:11.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:39:11.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:39:11.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:39:11.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:39:11.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:39:12, diff=-0.135991s, valid=True
2026-06-03T17:39:11.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:39:11.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:39:11.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:39:11.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75348.864822s, valid=False
2026-06-03T17:39:11.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:39:11.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:39:11.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:39:11.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:39:11.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:39:11.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:39:11.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:39:11.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:39:11.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:39:12.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:39:12.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:39:12.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:39:12.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:39:12.257 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:39:12.453 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:39:12.786 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:39:12.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:39:12.887 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:39:12.887 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:39:13.019 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:39:13.019 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:39:43.047 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:39:43.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:39:43.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:39:43.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:39:43.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:39:43.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:39:43.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:39:43.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:39:43.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:39:43.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:39:43.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:39:43.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:39:43.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:39:46.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:39:46.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:39:46.936 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:39:46.936 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:39:46.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:39:46.958 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:39:46.958 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:39:46.959 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:39:46.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:39:46.960 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:39:46.960 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:39:46.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:39:47.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:39:47.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:39:47.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:39:47.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:39:47.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:39:47.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:39:47.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:39:47.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:39:47.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:39:47.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:39:47.305 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:39:47.381 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:39:41
2026-06-03T17:39:47.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86641, datetime.datetime(2026, 6, 3, 17, 39, 41), datetime.datetime(2026, 6, 3, 17, 39, 41), 'salt', 5.85, 100.12, None, 35.35, 135.75, -0.02, 820.55, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:39:47.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:39:47.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:39:47.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:39:41, diff=6.389144s, valid=True
2026-06-03T17:39:47.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:39:47.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:39:47.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:40:12, diff=-24.607347s, valid=True
2026-06-03T17:39:47.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:39:47.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:39:47.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:39:35, diff=12.400657s, valid=True
2026-06-03T17:39:47.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:39:47.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:39:47.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:39:47.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:39:47.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:39:47.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:39:47.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:40:12, diff=-24.595618s, valid=True
2026-06-03T17:39:47.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:39:47.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:39:47.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:39:47.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75384.405196s, valid=False
2026-06-03T17:39:47.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:39:47.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:39:47.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:39:47.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:39:47.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:39:47.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:39:47.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:39:47.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:39:47.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:39:47.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:39:47.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:39:47.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:39:47.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:39:47.724 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:39:47.920 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:39:48.252 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:39:48.352 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:39:48.353 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:39:48.353 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:39:48.424 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:39:48.425 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:40:18.455 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:40:18.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:40:18.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:40:18.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:40:18.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:40:18.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:40:18.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:40:18.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:40:18.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:40:18.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:40:18.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:40:18.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:40:18.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:40:21.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:40:21.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:40:21.503 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:40:21.504 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:40:21.514 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:40:21.527 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:40:21.527 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:40:21.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:40:21.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:40:21.529 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:40:21.529 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:40:21.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:40:21.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:40:21.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:40:21.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:40:21.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:40:21.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:40:21.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:40:21.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:40:21.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:40:21.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:40:21.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:40:21.865 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:40:21.936 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:40:12
2026-06-03T17:40:21.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86642, datetime.datetime(2026, 6, 3, 17, 40, 12), datetime.datetime(2026, 6, 3, 17, 40, 11), 'salt', 5.75, 100.08, None, 40.93, 121.01, -0.02, 820.55, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:40:21.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:40:21.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:40:21.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:40:11, diff=10.943923s, valid=True
2026-06-03T17:40:21.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:40:21.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:40:21.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:40:12, diff=9.947286s, valid=True
2026-06-03T17:40:21.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:40:21.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:40:21.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:40:07, diff=14.955446s, valid=True
2026-06-03T17:40:21.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:40:21.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:40:21.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:40:21.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:40:21.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:40:21.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:40:21.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:40:12, diff=9.959067s, valid=True
2026-06-03T17:40:21.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:40:21.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:40:21.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:40:21.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75418.959876s, valid=False
2026-06-03T17:40:21.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:40:21.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:40:21.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:40:21.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:40:21.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:40:22.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:40:22.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:40:22.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:40:22.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:40:22.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:40:22.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:40:22.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:40:22.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:40:22.359 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:40:22.559 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:40:22.896 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:40:22.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:40:22.999 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:40:22.999 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:40:23.247 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:40:23.247 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:40:53.277 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:40:53.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:40:53.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:40:53.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:40:53.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:40:53.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:40:53.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:40:53.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:40:53.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:40:53.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:40:53.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:40:53.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:40:53.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:40:56.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:40:56.538 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:40:56.538 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:40:56.538 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:40:56.546 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:40:56.558 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:40:56.558 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:40:56.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:40:56.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:40:56.558 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:40:56.558 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:40:56.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:40:56.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:40:56.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:40:56.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:40:56.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:40:56.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:40:56.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:40:56.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:40:56.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:40:56.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:40:56.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:40:56.820 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:40:56.892 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:40:42
2026-06-03T17:40:56.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86643, datetime.datetime(2026, 6, 3, 17, 40, 42), datetime.datetime(2026, 6, 3, 17, 40, 41), 'salt', 5.75, 100.08, None, 38.95, 135.42, -0.02, 820.61, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:40:56.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:40:56.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:40:56.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:40:41, diff=15.89887s, valid=True
2026-06-03T17:40:56.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:40:56.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:40:56.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:41:12, diff=-15.097981s, valid=True
2026-06-03T17:40:56.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:40:56.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:40:56.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:40:38, diff=18.909429s, valid=True
2026-06-03T17:40:56.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:40:56.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:40:56.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:40:56.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:40:56.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:40:56.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:40:56.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:41:12, diff=-15.0872s, valid=True
2026-06-03T17:40:56.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:40:56.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:40:56.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:40:56.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75453.913524s, valid=False
2026-06-03T17:40:56.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:40:56.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:40:56.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:40:56.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:40:56.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:40:56.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:40:56.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:40:56.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:40:56.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:40:57.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:40:57.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:40:57.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:40:57.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:40:57.230 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:40:57.426 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:40:57.754 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:40:57.852 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:40:57.852 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:40:57.852 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:40:58.085 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:40:58.085 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:41:28.115 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:41:28.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:41:28.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:41:28.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:41:28.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:41:28.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:41:28.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:41:28.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:41:28.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:41:28.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:41:28.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:41:28.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:41:28.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:41:31.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:41:31.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:41:31.221 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:41:31.221 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:41:31.231 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:41:31.245 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:41:31.245 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:41:31.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:41:31.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:41:31.246 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:41:31.247 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:41:31.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:41:31.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:41:31.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:41:31.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:41:31.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:41:31.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:41:31.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:41:31.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:41:31.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:41:31.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:41:31.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:41:31.573 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:41:31.642 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:41:12
2026-06-03T17:41:31.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86644, datetime.datetime(2026, 6, 3, 17, 41, 12), datetime.datetime(2026, 6, 3, 17, 41, 11), 'salt', 5.75, 100.08, None, 42.76, 135.21, -0.02, 820.67, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:41:31.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:41:31.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:41:31.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:41:11, diff=20.649517s, valid=True
2026-06-03T17:41:31.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:41:31.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:41:31.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:41:12, diff=19.65309s, valid=True
2026-06-03T17:41:31.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:41:31.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:41:31.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:41:10, diff=21.661415s, valid=True
2026-06-03T17:41:31.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:41:31.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:41:31.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:41:31.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:41:31.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:41:31.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:41:31.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:41:12, diff=19.665235s, valid=True
2026-06-03T17:41:31.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:41:31.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:41:31.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:41:31.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75488.666054s, valid=False
2026-06-03T17:41:31.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:41:31.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:41:31.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:41:31.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:41:31.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:41:31.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:41:31.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:41:31.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:41:31.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:41:31.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:41:31.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:41:31.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:41:32.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:41:32.053 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:41:32.252 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:41:32.587 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:41:32.689 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:41:32.689 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:41:32.689 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:41:32.776 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:41:32.777 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:42:02.807 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:42:02.807 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:42:02.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:42:03.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:42:03.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:42:03.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:42:03.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:42:03.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:42:03.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:42:03.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:42:03.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:42:03.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:42:03.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:42:05.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:42:05.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:42:05.911 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:42:05.911 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:42:05.921 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:42:05.936 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:42:05.937 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:42:05.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:42:05.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:42:05.938 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:42:05.938 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:42:05.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:42:06.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T17:42:06.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:42:06.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T17:42:06.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:42:06.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:42:06.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:42:06.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:42:06.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:42:06.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:42:06.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:42:06.277 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:42:06.347 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:41:42
2026-06-03T17:42:06.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86645, datetime.datetime(2026, 6, 3, 17, 41, 42), datetime.datetime(2026, 6, 3, 17, 41, 42), 'salt', 5.65, 99.99, None, 39.87, 129.04, 0.0, 820.85, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:42:06.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:42:06.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T17:42:06.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:41:42, diff=24.35503s, valid=True
2026-06-03T17:42:06.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:42:06.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:42:06.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:42:12, diff=-5.641485s, valid=True
2026-06-03T17:42:06.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:42:06.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T17:42:06.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:41:41, diff=25.366643s, valid=True
2026-06-03T17:42:06.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:42:06.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:42:06.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:42:06.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:42:06.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:42:06.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:42:06.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:42:12, diff=-5.629639s, valid=True
2026-06-03T17:42:06.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:42:06.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:42:06.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:42:06.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75523.371208s, valid=False
2026-06-03T17:42:06.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:42:06.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:42:06.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:42:06.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:42:06.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:42:06.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:42:06.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:42:06.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:42:06.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:42:06.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:42:06.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:42:06.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:42:06.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:42:06.690 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:42:06.886 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:42:07.217 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:42:07.317 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:42:07.317 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:42:07.317 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:42:07.514 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:42:07.514 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:42:37.544 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:42:37.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:42:37.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:42:37.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:42:37.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:42:37.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:42:37.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:42:37.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:42:37.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:42:37.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:42:37.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:42:37.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:42:37.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:42:40.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:42:40.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:42:40.578 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:42:40.578 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:42:40.588 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:42:40.601 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:42:40.602 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:42:40.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:42:40.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:42:40.603 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:42:40.603 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:42:40.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:42:40.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T17:42:40.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:42:40.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T17:42:40.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:42:40.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:42:40.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:42:41.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:42:41.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:42:41.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:42:41.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:42:41.004 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:42:41.073 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:42:13
2026-06-03T17:42:41.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86646, datetime.datetime(2026, 6, 3, 17, 42, 13), datetime.datetime(2026, 6, 3, 17, 42, 12), 'salt', 5.68, 100.05, None, 36.1, 134.18, -0.02, 820.67, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:42:41.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:42:41.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T17:42:41.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:42:12, diff=29.079808s, valid=True
2026-06-03T17:42:41.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:42:41.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:42:41.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:42:12, diff=29.082613s, valid=True
2026-06-03T17:42:41.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:42:41.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T17:42:41.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:42:13, diff=28.089204s, valid=True
2026-06-03T17:42:41.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:42:41.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:42:41.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:42:41.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:42:41.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:42:41.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:42:41.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:42:12, diff=29.092239s, valid=True
2026-06-03T17:42:41.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:42:41.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:42:41.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:42:41.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75558.092902s, valid=False
2026-06-03T17:42:41.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:42:41.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:42:41.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:42:41.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:42:41.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:42:41.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:42:41.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:42:41.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:42:41.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:42:41.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:42:41.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:42:41.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:42:41.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:42:41.404 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:42:41.605 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:42:41.939 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:42:42.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:42:42.039 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:42:42.040 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:42:42.194 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:42:42.194 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:43:12.222 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:43:12.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:43:12.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:43:12.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:43:12.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:43:12.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:43:12.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:43:12.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:43:12.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:43:12.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:43:12.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:43:12.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:43:12.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:43:15.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:43:15.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:43:15.549 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:43:15.549 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:43:15.560 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:43:15.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:43:15.574 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:43:15.574 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:43:15.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:43:15.575 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:43:15.575 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:43:15.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:43:15.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:43:15.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:43:15.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:43:15.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:43:15.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:43:15.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:43:15.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:43:15.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:43:15.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:43:15.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:43:15.909 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:43:15.981 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:43:13
2026-06-03T17:43:15.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86648, datetime.datetime(2026, 6, 3, 17, 43, 13), datetime.datetime(2026, 6, 3, 17, 43, 12), 'salt', 5.82, 100.09, None, 33.17, 126.08, -0.01, 820.67, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:43:15.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:43:15.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:43:15.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:43:12, diff=3.988665s, valid=True
2026-06-03T17:43:15.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:43:15.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:43:15.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:43:12, diff=3.992027s, valid=True
2026-06-03T17:43:15.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:43:15.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:43:15.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:43:06, diff=9.999913s, valid=True
2026-06-03T17:43:16.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:43:16.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:43:16.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:43:16.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:43:16.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:43:16.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:43:16.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:43:12, diff=4.00348s, valid=True
2026-06-03T17:43:16.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:43:16.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:43:16.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:43:16.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75593.004279s, valid=False
2026-06-03T17:43:16.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:43:16.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:43:16.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:43:16.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:43:16.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:43:16.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:43:16.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:43:16.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:43:16.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:43:16.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:43:16.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:43:16.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:43:16.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:43:16.326 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:43:16.525 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:43:16.863 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:43:16.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:43:16.971 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:43:16.971 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:43:17.053 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:43:17.053 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:43:47.055 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:43:47.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:43:47.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:43:47.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:43:47.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:43:47.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:43:47.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:43:47.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:43:47.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:43:47.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:43:47.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:43:47.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:43:47.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:43:50.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:43:50.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:43:50.281 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:43:50.281 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:43:50.290 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:43:50.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:43:50.297 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:43:50.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:43:50.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:43:50.298 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:43:50.298 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:43:50.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:43:50.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:43:50.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:43:50.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:43:50.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:43:50.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:43:50.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:43:50.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:43:50.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:43:50.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:43:50.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:43:50.638 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:43:50.708 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:43:43
2026-06-03T17:43:50.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86649, datetime.datetime(2026, 6, 3, 17, 43, 43), datetime.datetime(2026, 6, 3, 17, 43, 43), 'salt', 5.82, 100.15, None, 34.65, 134.77, -0.02, 820.85, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:43:50.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:43:50.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:43:50.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:43:43, diff=7.715577s, valid=True
2026-06-03T17:43:50.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:43:50.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:43:50.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:44:12, diff=-21.28094s, valid=True
2026-06-03T17:43:50.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:43:50.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:43:50.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:43:37, diff=13.727177s, valid=True
2026-06-03T17:43:50.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:43:50.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:43:50.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:43:50.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:43:50.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:43:50.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:43:50.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:44:12, diff=-21.269127s, valid=True
2026-06-03T17:43:50.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:43:50.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:43:50.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:43:50.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75627.731697s, valid=False
2026-06-03T17:43:50.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:43:50.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:43:50.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:43:50.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:43:50.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:43:50.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:43:50.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:43:50.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:43:50.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:43:50.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:43:50.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:43:50.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:43:51.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:43:51.050 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:43:51.247 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:43:51.579 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:43:51.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:43:51.680 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:43:51.680 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:43:51.877 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:43:51.877 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:44:21.888 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:44:21.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:44:21.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:44:22.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:44:22.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:44:22.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:44:22.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:44:22.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:44:22.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:44:22.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:44:22.458 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:44:22.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:44:22.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:44:25.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:44:25.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:44:25.299 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:44:25.299 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:44:25.310 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:44:25.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:44:25.323 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:44:25.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:44:25.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:44:25.324 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:44:25.325 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:44:25.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:44:25.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:44:25.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:44:25.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:44:25.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:44:25.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:44:25.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:44:25.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:44:25.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:44:25.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:44:25.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:44:25.665 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:44:25.748 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:44:14
2026-06-03T17:44:25.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86650, datetime.datetime(2026, 6, 3, 17, 44, 14), datetime.datetime(2026, 6, 3, 17, 44, 13), 'salt', 5.78, 100.15, None, 48.2, 136.76, -0.03, 820.49, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:44:25.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:44:25.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:44:25.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:44:13, diff=12.75597s, valid=True
2026-06-03T17:44:25.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:44:25.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:44:25.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:44:12, diff=13.759309s, valid=True
2026-06-03T17:44:25.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:44:25.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:44:25.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:44:08, diff=17.766761s, valid=True
2026-06-03T17:44:25.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:44:25.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:44:25.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:44:25.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:44:25.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:44:25.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:44:25.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:44:12, diff=13.769976s, valid=True
2026-06-03T17:44:25.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:44:25.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:44:25.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:44:25.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75662.770659s, valid=False
2026-06-03T17:44:25.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:44:25.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:44:25.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:44:25.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:44:25.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:44:25.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:44:25.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:44:25.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:44:25.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:44:25.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:44:25.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:44:25.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:44:26.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:44:26.084 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:44:26.339 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:44:26.672 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:44:26.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:44:26.773 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:44:26.773 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:44:27.048 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:44:27.048 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:44:57.068 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:44:57.068 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:44:57.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:44:57.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:44:57.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:44:57.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:44:57.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:44:57.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:44:57.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:44:57.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:44:57.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:44:57.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:44:57.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:45:00.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:45:00.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:45:00.499 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:45:00.499 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:45:00.509 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:45:00.522 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:45:00.522 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:45:00.523 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:45:00.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:45:00.523 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:45:00.524 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:45:00.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:45:00.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:45:00.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:45:00.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:45:00.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:45:00.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:45:00.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:45:00.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:45:00.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:45:00.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:45:00.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:45:00.859 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:45:00.950 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:44:44
2026-06-03T17:45:00.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86651, datetime.datetime(2026, 6, 3, 17, 44, 44), datetime.datetime(2026, 6, 3, 17, 44, 43), 'salt', 5.78, 100.08, None, 40.89, 135.94, -0.02, 820.67, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:45:00.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:45:00.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:45:00.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:44:43, diff=17.957849s, valid=True
2026-06-03T17:45:00.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:45:00.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:45:00.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:45:12, diff=-11.038656s, valid=True
2026-06-03T17:45:00.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:45:00.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:45:00.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:44:39, diff=21.969435s, valid=True
2026-06-03T17:45:00.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:45:00.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:45:00.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:45:00.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:45:00.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:45:00.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:45:00.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:45:12, diff=-11.026849s, valid=True
2026-06-03T17:45:00.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:45:00.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:45:00.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:45:00.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75697.973958s, valid=False
2026-06-03T17:45:00.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:45:00.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:45:00.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:45:00.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:45:00.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:45:01.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:45:01.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:45:01.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:45:01.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:45:01.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:45:01.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:45:01.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:45:01.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:45:01.377 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:45:01.609 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:45:01.958 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:45:02.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:45:02.062 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:45:02.062 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:45:02.259 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:45:02.259 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:45:32.277 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:45:32.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:45:32.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:45:32.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:45:32.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:45:32.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:45:32.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:45:32.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:45:32.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:45:32.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:45:32.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:45:32.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:45:32.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:45:35.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:45:35.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:45:35.862 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:45:35.862 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:45:35.873 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:45:35.885 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:45:35.886 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:45:35.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:45:35.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:45:35.887 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:45:35.887 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:45:35.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:45:36.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:45:36.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:45:36.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:45:36.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:45:36.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:45:36.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:45:36.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:45:36.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:45:36.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:45:36.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:45:36.214 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:45:36.284 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:45:14
2026-06-03T17:45:36.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86652, datetime.datetime(2026, 6, 3, 17, 45, 14), datetime.datetime(2026, 6, 3, 17, 45, 14), 'salt', 5.72, 100.12, None, 41.99, 140.14, -0.02, 820.61, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:45:36.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:45:36.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:45:36.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:45:14, diff=22.292276s, valid=True
2026-06-03T17:45:36.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:45:36.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:45:36.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:45:12, diff=24.295755s, valid=True
2026-06-03T17:45:36.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:45:36.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:45:36.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:45:11, diff=25.303769s, valid=True
2026-06-03T17:45:36.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:45:36.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:45:36.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:45:36.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:45:36.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:45:36.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:45:36.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:45:12, diff=24.307442s, valid=True
2026-06-03T17:45:36.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:45:36.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:45:36.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:45:36.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75733.308279s, valid=False
2026-06-03T17:45:36.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:45:36.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:45:36.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:45:36.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:45:36.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:45:36.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:45:36.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:45:36.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:45:36.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:45:36.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:45:36.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:45:36.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:45:36.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:45:36.702 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:45:36.900 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:45:37.234 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:45:37.337 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:45:37.337 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:45:37.337 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:45:37.580 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:45:37.580 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:46:07.610 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:46:07.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:46:07.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:46:07.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:46:07.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:46:08.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:46:08.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:46:08.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:46:08.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:46:08.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:46:08.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:46:08.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:46:08.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:46:11.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:46:11.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:46:11.220 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:46:11.220 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:46:11.231 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:46:11.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:46:11.244 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:46:11.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:46:11.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:46:11.245 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:46:11.246 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:46:11.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:46:11.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T17:46:11.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:46:11.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T17:46:11.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:46:11.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:46:11.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:46:11.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:46:11.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:46:11.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:46:11.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:46:11.578 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:46:11.651 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:45:44
2026-06-03T17:46:11.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86653, datetime.datetime(2026, 6, 3, 17, 45, 44), datetime.datetime(2026, 6, 3, 17, 45, 44), 'salt', 5.65, 100.05, None, 44.99, 130.42, -0.01, 820.61, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:46:11.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:46:11.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T17:46:11.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:45:44, diff=27.659211s, valid=True
2026-06-03T17:46:11.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:46:11.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:46:11.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:46:12, diff=-0.337279s, valid=True
2026-06-03T17:46:11.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:46:11.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T17:46:11.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:45:42, diff=29.670897s, valid=True
2026-06-03T17:46:11.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:46:11.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:46:11.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:46:11.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:46:11.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:46:11.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:46:11.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:46:12, diff=-0.325365s, valid=True
2026-06-03T17:46:11.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:46:11.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:46:11.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:46:11.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75768.675446s, valid=False
2026-06-03T17:46:11.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:46:11.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:46:11.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:46:11.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:46:11.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:46:11.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:46:11.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:46:11.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:46:11.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:46:11.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:46:11.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:46:11.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:46:11.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:46:11.996 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:46:12.194 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:46:12.529 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:46:12.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:46:12.635 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:46:12.636 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:46:12.828 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:46:12.828 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:46:42.858 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:46:42.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:46:42.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:46:42.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:46:42.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:46:43.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:46:43.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:46:43.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:46:43.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:46:43.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:46:43.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:46:43.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:46:43.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:46:46.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:46:46.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:46:46.205 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:46:46.205 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:46:46.215 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:46:46.228 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:46:46.229 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:46:46.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:46:46.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:46:46.230 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:46:46.230 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:46:46.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:46:46.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:46:46.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:46:46.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:46:46.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:46:46.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:46:46.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:46:46.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:46:46.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:46:46.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:46:46.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:46:46.585 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:46:46.656 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:46:45
2026-06-03T17:46:46.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86655, datetime.datetime(2026, 6, 3, 17, 46, 45), datetime.datetime(2026, 6, 3, 17, 46, 44), 'salt', 5.68, 100.09, None, 46.43, 137.7, -0.02, 820.61, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:46:46.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:46:46.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:46:46.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:46:44, diff=2.663493s, valid=True
2026-06-03T17:46:46.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:46:46.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:46:46.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:47:12, diff=-25.333068s, valid=True
2026-06-03T17:46:46.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:46:46.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:46:46.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:46:38, diff=8.675148s, valid=True
2026-06-03T17:46:46.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:46:46.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:46:46.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:46:46.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:46:46.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:46:46.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:46:46.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:47:12, diff=-25.321181s, valid=True
2026-06-03T17:46:46.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:46:46.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:46:46.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:46:46.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75803.679612s, valid=False
2026-06-03T17:46:46.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:46:46.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:46:46.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:46:46.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:46:46.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:46:46.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:46:46.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:46:46.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:46:46.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:46:46.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:46:46.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:46:46.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:46:47.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:46:47.071 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:46:47.269 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:46:47.603 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:46:47.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:46:47.704 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:46:47.704 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:46:47.859 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:46:47.860 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:47:17.890 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:47:17.890 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:47:17.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:47:18.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:47:18.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:47:18.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:47:18.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:47:18.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:47:18.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:47:18.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:47:18.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:47:18.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:47:18.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:47:21.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:47:21.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:47:21.278 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:47:21.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:47:21.287 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:47:21.299 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:47:21.299 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:47:21.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:47:21.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:47:21.300 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:47:21.300 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:47:21.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:47:21.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:47:21.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:47:21.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:47:21.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:47:21.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:47:21.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:47:21.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:47:21.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:47:21.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:47:21.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:47:21.629 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:47:21.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:47:15
2026-06-03T17:47:21.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86656, datetime.datetime(2026, 6, 3, 17, 47, 15), datetime.datetime(2026, 6, 3, 17, 47, 14), 'salt', 5.68, 100.15, None, 43.64, 125.47, -0.03, 820.67, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:47:21.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:47:21.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:47:21.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:47:14, diff=7.707421s, valid=True
2026-06-03T17:47:21.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:47:21.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:47:21.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:47:12, diff=9.710843s, valid=True
2026-06-03T17:47:21.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:47:21.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:47:21.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:47:08, diff=13.71886s, valid=True
2026-06-03T17:47:21.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:47:21.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:47:21.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:47:21.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:47:21.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:47:21.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:47:21.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:47:12, diff=9.722459s, valid=True
2026-06-03T17:47:21.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:47:21.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:47:21.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:47:21.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75838.723255s, valid=False
2026-06-03T17:47:21.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:47:21.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:47:21.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:47:21.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:47:21.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:47:21.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:47:21.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:47:21.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:47:21.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:47:21.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:47:21.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:47:21.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:47:22.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:47:22.042 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:47:22.238 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:47:22.569 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:47:22.669 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:47:22.669 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:47:22.669 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:47:22.860 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:47:22.860 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:47:52.878 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:47:52.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:47:52.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:47:53.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:47:53.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:47:53.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:47:53.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:47:53.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:47:53.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:47:53.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:47:53.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:47:53.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:47:53.314 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:47:56.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:47:56.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:47:56.504 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:47:56.504 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:47:56.514 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:47:56.527 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:47:56.528 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:47:56.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:47:56.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:47:56.529 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:47:56.529 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:47:56.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:47:56.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:47:56.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:47:56.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:47:56.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:47:56.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:47:56.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:47:56.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:47:56.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:47:56.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:47:56.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:47:56.945 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:47:57.019 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:47:45
2026-06-03T17:47:57.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86657, datetime.datetime(2026, 6, 3, 17, 47, 45), datetime.datetime(2026, 6, 3, 17, 47, 45), 'salt', 5.58, 100.05, None, 45.16, 134.79, -0.02, 820.55, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:47:57.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:47:57.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:47:57.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:47:45, diff=12.025074s, valid=True
2026-06-03T17:47:57.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:47:57.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:47:57.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:48:12, diff=-14.972035s, valid=True
2026-06-03T17:47:57.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:47:57.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:47:57.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:47:38, diff=19.03461s, valid=True
2026-06-03T17:47:57.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:47:57.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:47:57.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:47:57.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:47:57.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:47:57.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:47:57.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:48:12, diff=-14.962407s, valid=True
2026-06-03T17:47:57.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:47:57.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:47:57.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:47:57.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75874.038258s, valid=False
2026-06-03T17:47:57.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:47:57.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:47:57.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:47:57.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:47:57.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:47:57.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:47:57.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:47:57.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:47:57.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:47:57.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:47:57.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:47:57.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:47:57.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:47:57.350 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:47:57.548 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:47:57.905 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:47:58.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:47:58.006 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:47:58.006 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:47:58.228 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:47:58.229 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:48:28.249 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:48:28.249 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:48:28.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:48:28.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:48:28.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:48:28.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:48:28.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:48:28.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:48:28.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:48:28.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:48:28.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:48:28.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:48:28.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:48:31.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:48:31.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:48:31.714 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:48:31.714 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:48:31.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:48:31.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:48:31.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:48:31.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:48:31.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:48:31.738 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:48:31.738 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:48:31.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:48:31.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:48:31.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:48:31.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:48:31.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:48:32.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:48:32.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:48:32.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:48:32.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:48:32.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:48:32.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:48:32.070 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:48:32.140 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:48:16
2026-06-03T17:48:32.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86658, datetime.datetime(2026, 6, 3, 17, 48, 16), datetime.datetime(2026, 6, 3, 17, 48, 15), 'salt', 5.72, 100.18, None, 33.06, 134.3, -0.03, 820.79, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:48:32.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:48:32.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:48:32.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:48:15, diff=17.147723s, valid=True
2026-06-03T17:48:32.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:48:32.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:48:32.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:48:12, diff=20.151207s, valid=True
2026-06-03T17:48:32.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:48:32.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:48:32.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:48:09, diff=23.159371s, valid=True
2026-06-03T17:48:32.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:48:32.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:48:32.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:48:32.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:48:32.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:48:32.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:48:32.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:48:12, diff=20.163068s, valid=True
2026-06-03T17:48:32.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:48:32.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:48:32.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:48:32.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75909.163877s, valid=False
2026-06-03T17:48:32.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:48:32.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:48:32.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:48:32.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:48:32.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:48:32.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:48:32.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:48:32.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:48:32.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:48:32.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:48:32.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:48:32.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:48:32.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:48:32.482 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:48:32.677 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:48:33.008 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:48:33.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:48:33.110 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:48:33.110 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:48:33.309 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:48:33.309 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:49:03.309 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:49:03.309 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:49:03.310 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:49:03.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:49:03.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:49:03.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:49:03.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:49:03.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:49:03.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:49:03.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:49:03.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:49:03.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:49:03.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:49:07.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:49:07.040 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:49:07.041 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:49:07.042 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:49:07.052 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:49:07.064 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:49:07.065 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:49:07.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:49:07.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:49:07.066 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:49:07.066 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:49:07.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:49:07.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:49:07.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:49:07.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:49:07.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:49:07.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:49:07.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:49:07.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:49:07.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:49:07.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:49:07.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:49:07.429 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:49:07.501 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:48:46
2026-06-03T17:49:07.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86659, datetime.datetime(2026, 6, 3, 17, 48, 46), datetime.datetime(2026, 6, 3, 17, 48, 46), 'salt', 5.65, 100.05, None, 37.89, 136.08, -0.01, 820.98, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:49:07.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:49:07.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:49:07.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:48:46, diff=21.508616s, valid=True
2026-06-03T17:49:07.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:49:07.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:49:07.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:49:12, diff=-4.48787s, valid=True
2026-06-03T17:49:07.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:49:07.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:49:07.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:48:40, diff=27.520409s, valid=True
2026-06-03T17:49:07.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:49:07.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:49:07.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:49:07.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:49:07.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:49:07.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:49:07.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:49:12, diff=-4.475762s, valid=True
2026-06-03T17:49:07.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:49:07.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:49:07.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:49:07.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75944.525083s, valid=False
2026-06-03T17:49:07.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:49:07.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:49:07.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:49:07.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:49:07.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:49:07.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:49:07.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:49:07.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:49:07.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:49:07.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:49:07.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:49:07.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:49:07.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:49:07.847 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:49:08.045 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:49:08.378 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:49:08.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:49:08.479 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:49:08.479 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:49:09.641 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:49:09.641 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:49:39.653 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:49:39.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:49:39.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:49:39.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:49:39.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:49:40.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:49:40.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:49:40.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:49:40.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:49:40.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:49:40.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:49:40.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:49:40.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:49:43.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:49:43.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:49:43.011 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:49:43.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:49:43.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:49:43.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:49:43.034 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:49:43.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:49:43.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:49:43.035 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:49:43.035 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:49:43.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:49:43.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T17:49:43.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:49:43.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T17:49:43.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:49:43.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:49:43.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:49:43.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:49:43.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:49:43.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:49:43.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:49:43.369 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:49:43.437 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:49:16
2026-06-03T17:49:43.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86660, datetime.datetime(2026, 6, 3, 17, 49, 16), datetime.datetime(2026, 6, 3, 17, 49, 16), 'salt', 5.68, 100.09, None, 38.71, 134.91, -0.02, 820.73, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:49:43.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:49:43.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T17:49:43.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:49:16, diff=27.443648s, valid=True
2026-06-03T17:49:43.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:49:43.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:49:43.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:49:12, diff=31.446601s, valid=True
2026-06-03T17:49:43.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:49:43.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T17:49:43.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:49:11, diff=32.453293s, valid=True
2026-06-03T17:49:43.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:49:43.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:49:43.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:49:43.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:49:43.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:49:43.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:49:43.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:49:12, diff=31.456285s, valid=True
2026-06-03T17:49:43.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:49:43.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:49:43.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:49:43.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=75980.456933s, valid=False
2026-06-03T17:49:43.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:49:43.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:49:43.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:49:43.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:49:43.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:49:43.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:49:43.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:49:43.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:49:43.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:49:43.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:49:43.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:49:43.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:49:43.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:49:43.807 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:49:44.070 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:49:44.410 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:49:44.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:49:44.513 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:49:44.513 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:49:44.726 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:49:44.726 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:50:14.756 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:50:14.756 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:50:14.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:50:15.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:50:15.081 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:50:15.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:50:15.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:50:15.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:50:15.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:50:15.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:50:15.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:50:15.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:50:15.355 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:50:18.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:50:18.266 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:50:18.267 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:50:18.267 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:50:18.277 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:50:18.290 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:50:18.290 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:50:18.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:50:18.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:50:18.291 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:50:18.292 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:50:18.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:50:18.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:50:18.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:50:18.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:50:18.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:50:18.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:50:18.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:50:18.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:50:18.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:50:18.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:50:18.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:50:18.629 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:50:18.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:50:17
2026-06-03T17:50:18.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86662, datetime.datetime(2026, 6, 3, 17, 50, 17), datetime.datetime(2026, 6, 3, 17, 50, 16), 'salt', 5.68, 100.12, None, 23.99, 130.19, -0.03, 820.79, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:50:18.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:50:18.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:50:18.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:50:16, diff=2.708089s, valid=True
2026-06-03T17:50:18.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:50:18.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:50:18.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:50:12, diff=6.711562s, valid=True
2026-06-03T17:50:18.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:50:18.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:50:18.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:50:14, diff=4.719755s, valid=True
2026-06-03T17:50:18.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:50:18.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:50:18.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:50:18.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:50:18.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:50:18.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:50:18.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:50:12, diff=6.723441s, valid=True
2026-06-03T17:50:18.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:50:18.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:50:18.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:50:18.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76015.724246s, valid=False
2026-06-03T17:50:18.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:50:18.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:50:18.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:50:18.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:50:18.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:50:18.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:50:18.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:50:18.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:50:18.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:50:18.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:50:18.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:50:18.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:50:19.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:50:19.043 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:50:19.248 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:50:19.589 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:50:19.691 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:50:19.691 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:50:19.691 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:50:19.843 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:50:19.844 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:50:49.873 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:50:49.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:50:49.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:50:49.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:50:49.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:50:50.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:50:50.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:50:50.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:50:50.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:50:50.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:50:50.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:50:50.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:50:50.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:50:53.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:50:53.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:50:53.182 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:50:53.182 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:50:53.192 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:50:53.204 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:50:53.205 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:50:53.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:50:53.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:50:53.206 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:50:53.206 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:50:53.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:50:53.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:50:53.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:50:53.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:50:53.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:50:53.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:50:53.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:50:53.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:50:53.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:50:53.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:50:53.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:50:53.556 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:50:53.650 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:50:47
2026-06-03T17:50:53.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86663, datetime.datetime(2026, 6, 3, 17, 50, 47), datetime.datetime(2026, 6, 3, 17, 50, 46), 'salt', 5.82, 100.12, None, 33.77, 132.89, -0.02, 820.73, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:50:53.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:50:53.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:50:53.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:50:46, diff=7.656135s, valid=True
2026-06-03T17:50:53.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:50:53.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:50:53.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:51:12, diff=-18.341013s, valid=True
2026-06-03T17:50:53.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:50:53.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:50:53.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:50:46, diff=7.665732s, valid=True
2026-06-03T17:50:53.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:50:53.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:50:53.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:50:53.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:50:53.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:50:53.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:50:53.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:51:12, diff=-18.331183s, valid=True
2026-06-03T17:50:53.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:50:53.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:50:53.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:50:53.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76050.669462s, valid=False
2026-06-03T17:50:53.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:50:53.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:50:53.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:50:53.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:50:53.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:50:53.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:50:53.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:50:53.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:50:53.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:50:53.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:50:54.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:50:54.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:50:54.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:50:54.205 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:50:54.410 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:50:54.750 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:50:54.851 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:50:54.852 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:50:54.852 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:50:55.011 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:50:55.011 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:51:25.022 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:51:25.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:51:25.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:51:25.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:51:25.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:51:25.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:51:25.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:51:25.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:51:25.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:51:25.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:51:25.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:51:25.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:51:25.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:51:28.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:51:28.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:51:28.551 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:51:28.551 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:51:28.561 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:51:28.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:51:28.582 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:51:28.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:51:28.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:51:28.583 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:51:28.583 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:51:28.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:51:28.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:51:28.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:51:28.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:51:28.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:51:28.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:51:28.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:51:28.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:51:28.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:51:28.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:51:28.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:51:28.908 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:51:28.979 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:51:17
2026-06-03T17:51:28.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86664, datetime.datetime(2026, 6, 3, 17, 51, 17), datetime.datetime(2026, 6, 3, 17, 51, 17), 'salt', 5.72, 100.12, None, 34.51, 132.87, -0.02, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:51:28.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:51:28.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:51:28.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:51:17, diff=11.986972s, valid=True
2026-06-03T17:51:28.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:51:28.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:51:28.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:51:12, diff=16.990387s, valid=True
2026-06-03T17:51:28.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:51:28.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:51:28.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:51:17, diff=11.998472s, valid=True
2026-06-03T17:51:28.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:51:28.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:51:28.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:51:28.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:51:28.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:51:28.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:51:29.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:51:12, diff=17.002093s, valid=True
2026-06-03T17:51:29.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:51:29.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:51:29.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:51:29.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76086.002886s, valid=False
2026-06-03T17:51:29.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:51:29.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:51:29.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:51:29.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:51:29.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:51:29.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:51:29.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:51:29.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:51:29.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:51:29.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:51:29.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:51:29.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:51:29.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:51:29.320 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:51:29.526 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:51:29.869 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:51:29.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:51:29.977 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:51:29.977 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:51:30.217 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:51:30.217 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:52:00.225 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:52:00.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:52:00.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:52:00.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:52:00.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:52:00.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:52:00.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:52:00.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:52:00.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:52:00.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:52:00.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:52:00.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:52:00.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:52:03.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:52:03.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:52:03.650 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:52:03.650 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:52:03.661 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:52:03.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:52:03.675 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:52:03.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:52:03.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:52:03.676 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:52:03.676 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:52:03.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:52:03.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:52:03.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:52:03.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:52:03.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:52:03.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:52:03.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:52:04.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:52:04.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:52:04.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:52:04.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:52:04.010 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:52:04.084 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:51:48
2026-06-03T17:52:04.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86665, datetime.datetime(2026, 6, 3, 17, 51, 48), datetime.datetime(2026, 6, 3, 17, 51, 47), 'salt', 5.62, 100.09, None, 45.97, 135.31, -0.02, 820.67, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:52:04.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:52:04.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:52:04.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:51:47, diff=17.091355s, valid=True
2026-06-03T17:52:04.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:52:04.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:52:04.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:52:12, diff=-7.905175s, valid=True
2026-06-03T17:52:04.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:52:04.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:52:04.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:51:41, diff=23.103062s, valid=True
2026-06-03T17:52:04.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:52:04.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:52:04.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:52:04.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:52:04.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:52:04.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:52:04.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:52:12, diff=-7.893199s, valid=True
2026-06-03T17:52:04.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:52:04.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:52:04.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:52:04.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76121.107617s, valid=False
2026-06-03T17:52:04.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:52:04.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:52:04.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:52:04.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:52:04.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:52:04.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:52:04.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:52:04.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:52:04.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:52:04.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:52:04.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:52:04.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:52:04.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:52:04.499 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:52:04.724 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:52:05.065 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:52:05.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:52:05.166 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:52:05.166 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:52:05.439 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:52:05.439 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:52:35.469 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:52:35.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:52:35.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:52:36.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:52:36.052 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:52:36.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:52:36.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:52:36.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:52:36.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:52:36.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:52:36.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:52:36.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:52:36.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:52:39.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:52:39.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:52:39.280 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:52:39.280 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:52:39.289 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:52:39.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:52:39.303 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:52:39.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:52:39.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:52:39.304 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:52:39.304 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:52:39.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:52:39.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:52:39.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:52:39.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:52:39.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:52:39.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:52:39.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:52:39.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:52:39.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:52:39.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:52:39.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:52:39.665 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:52:39.734 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:52:18
2026-06-03T17:52:39.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86666, datetime.datetime(2026, 6, 3, 17, 52, 18), datetime.datetime(2026, 6, 3, 17, 52, 17), 'salt', 5.58, 100.05, None, 41.78, 135.71, -0.02, 820.67, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:52:39.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:52:39.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:52:39.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:52:17, diff=22.742591s, valid=True
2026-06-03T17:52:39.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:52:39.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:52:39.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:52:12, diff=27.746217s, valid=True
2026-06-03T17:52:39.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:52:39.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:52:39.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:52:11, diff=28.754789s, valid=True
2026-06-03T17:52:39.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:52:39.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:52:39.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:52:39.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:52:39.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:52:39.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:52:39.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:52:12, diff=27.758706s, valid=True
2026-06-03T17:52:39.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:52:39.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:52:39.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:52:39.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76156.759548s, valid=False
2026-06-03T17:52:39.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:52:39.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:52:39.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:52:39.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:52:39.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:52:39.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:52:39.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:52:39.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:52:39.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:52:39.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:52:39.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:52:40.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:52:40.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:52:40.106 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:52:40.320 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:52:40.660 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:52:40.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:52:40.763 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:52:40.763 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:52:40.848 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:52:40.849 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:53:10.864 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:53:10.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:53:10.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:53:11.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:53:11.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:53:11.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:53:11.444 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:53:11.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:53:11.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:53:11.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:53:11.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:53:11.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:53:11.477 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:53:14.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:53:14.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:53:14.407 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:53:14.407 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:53:14.419 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:53:14.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:53:14.432 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:53:14.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:53:14.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:53:14.434 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:53:14.434 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:53:14.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:53:14.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T17:53:14.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:53:14.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T17:53:14.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:53:14.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:53:14.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:53:14.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T17:53:14.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:53:14.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:53:14.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:53:14.754 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:53:14.823 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:52:48
2026-06-03T17:53:14.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86667, datetime.datetime(2026, 6, 3, 17, 52, 48), datetime.datetime(2026, 6, 3, 17, 52, 48), 'salt', 5.68, 100.15, None, 39.31, 121.81, -0.03, 820.61, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:53:14.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:53:14.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T17:53:14.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:52:48, diff=26.829101s, valid=True
2026-06-03T17:53:14.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:53:14.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:53:14.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:53:12, diff=2.831913s, valid=True
2026-06-03T17:53:14.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:53:14.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T17:53:14.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:52:41, diff=33.838609s, valid=True
2026-06-03T17:53:14.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:53:14.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:53:14.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:53:14.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:53:14.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:53:14.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T17:53:14.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:53:12, diff=2.841647s, valid=True
2026-06-03T17:53:14.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:53:14.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:53:14.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:53:14.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76191.842292s, valid=False
2026-06-03T17:53:14.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:53:14.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:53:14.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:53:14.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:53:14.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:53:14.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:53:14.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:53:14.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:53:14.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:53:15.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:53:15.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:53:15.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:53:15.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:53:15.228 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:53:15.440 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:53:15.788 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:53:15.892 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:53:15.892 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:53:15.892 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:53:16.124 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:53:16.124 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:53:46.154 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:53:46.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:53:46.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:53:46.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:53:46.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:53:47.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:53:47.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:53:47.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:53:47.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:53:47.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:53:47.084 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:53:47.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:53:47.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:53:49.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:53:50.002 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:53:50.002 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:53:50.002 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:53:50.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:53:50.023 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:53:50.023 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:53:50.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:53:50.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:53:50.024 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:53:50.024 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:53:50.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:53:50.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:53:50.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:53:50.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:53:50.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:53:50.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:53:50.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:53:50.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:53:50.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:53:50.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:53:50.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:53:50.316 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:53:50.388 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:53:49
2026-06-03T17:53:50.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86669, datetime.datetime(2026, 6, 3, 17, 53, 49), datetime.datetime(2026, 6, 3, 17, 53, 48), 'salt', 5.52, 100.05, None, 35.18, 135.43, -0.01, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:53:50.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:53:50.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:53:50.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:53:48, diff=2.394965s, valid=True
2026-06-03T17:53:50.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:53:50.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:53:50.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:54:12, diff=-21.601897s, valid=True
2026-06-03T17:53:50.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:53:50.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:53:50.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:53:44, diff=6.405345s, valid=True
2026-06-03T17:53:50.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:53:50.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:53:50.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:53:50.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:53:50.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:53:50.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:53:50.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:54:12, diff=-21.591266s, valid=True
2026-06-03T17:53:50.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:53:50.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:53:50.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:53:50.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76227.409463s, valid=False
2026-06-03T17:53:50.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:53:50.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:53:50.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:53:50.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:53:50.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:53:50.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:53:50.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:53:50.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:53:50.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:53:50.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:53:50.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:53:50.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:53:50.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:53:50.728 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:53:50.935 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:53:51.284 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:53:51.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:53:51.388 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:53:51.388 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:53:51.548 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:53:51.548 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:54:21.578 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:54:21.578 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:54:21.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:54:21.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:54:21.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:54:22.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:54:22.212 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:54:22.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:54:22.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:54:22.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:54:22.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:54:22.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:54:22.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:54:25.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:54:25.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:54:25.157 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:54:25.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:54:25.167 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:54:25.180 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:54:25.181 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:54:25.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:54:25.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:54:25.182 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:54:25.182 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:54:25.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:54:25.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:54:25.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:54:25.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:54:25.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:54:25.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:54:25.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:54:25.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T17:54:25.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:54:25.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:54:25.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:54:25.510 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:54:25.589 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:54:19
2026-06-03T17:54:25.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86670, datetime.datetime(2026, 6, 3, 17, 54, 19), datetime.datetime(2026, 6, 3, 17, 54, 18), 'salt', 5.52, 100.12, None, 37.44, 135.07, -0.02, 820.67, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:54:25.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:54:25.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:54:25.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:54:18, diff=7.596984s, valid=True
2026-06-03T17:54:25.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:54:25.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:54:25.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:54:12, diff=13.600472s, valid=True
2026-06-03T17:54:25.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:54:25.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:54:25.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:54:15, diff=10.608775s, valid=True
2026-06-03T17:54:25.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:54:25.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:54:25.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:54:25.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:54:25.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:54:25.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T17:54:25.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:54:12, diff=13.61249s, valid=True
2026-06-03T17:54:25.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:54:25.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:54:25.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:54:25.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76262.613304s, valid=False
2026-06-03T17:54:25.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:54:25.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:54:25.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:54:25.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:54:25.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:54:25.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:54:25.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:54:25.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:54:25.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:54:25.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:54:25.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:54:25.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:54:25.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:54:25.934 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:54:26.141 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:54:26.483 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:54:26.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:54:26.585 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:54:26.585 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:54:26.847 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:54:26.848 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:54:56.877 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:54:56.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:54:56.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:54:57.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:54:57.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:54:57.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:54:57.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:54:57.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:54:57.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:54:57.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:54:57.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:54:57.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:54:57.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:55:00.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:55:00.426 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:55:00.427 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:55:00.427 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:55:00.437 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:55:00.450 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:55:00.451 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:55:00.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:55:00.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:55:00.452 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:55:00.452 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:55:00.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:55:00.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:55:00.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:55:00.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:55:00.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:55:00.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T17:55:00.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:55:00.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T17:55:00.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:55:00.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:55:00.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:55:00.784 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:55:00.858 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:54:49
2026-06-03T17:55:00.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86671, datetime.datetime(2026, 6, 3, 17, 54, 49), datetime.datetime(2026, 6, 3, 17, 54, 48), 'salt', 5.59, 100.12, None, 38.78, 136.67, -0.02, 820.73, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:55:00.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:55:00.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:55:00.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:54:48, diff=12.866085s, valid=True
2026-06-03T17:55:00.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:55:00.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T17:55:00.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:55:12, diff=-11.13042s, valid=True
2026-06-03T17:55:00.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:55:00.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:55:00.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:54:47, diff=13.877738s, valid=True
2026-06-03T17:55:00.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:55:00.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:55:00.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:55:00.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:55:00.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:55:00.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T17:55:00.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:55:12, diff=-11.118574s, valid=True
2026-06-03T17:55:00.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:55:00.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:55:00.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:55:00.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76297.882256s, valid=False
2026-06-03T17:55:00.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:55:00.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:55:00.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:55:00.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:55:00.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:55:00.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:55:00.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:55:00.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:55:00.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:55:01.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:55:01.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:55:01.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:55:01.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:55:01.204 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:55:01.500 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:55:01.845 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:55:01.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:55:01.950 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:55:01.950 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:55:02.144 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:55:02.144 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:55:32.174 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:55:32.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:55:32.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:55:32.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:55:32.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:55:32.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:55:32.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:55:32.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:55:32.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:55:32.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:55:32.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:55:32.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:55:32.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:55:35.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:55:35.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:55:35.976 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:55:35.977 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:55:35.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:55:36.000 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:55:36.000 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:55:36.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:55:36.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:55:36.002 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:55:36.002 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:55:36.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:55:36.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:55:36.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:55:36.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:55:36.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:55:36.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T17:55:36.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:55:36.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T17:55:36.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:55:36.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:55:36.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:55:36.329 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:55:36.400 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:55:19
2026-06-03T17:55:36.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86672, datetime.datetime(2026, 6, 3, 17, 55, 19), datetime.datetime(2026, 6, 3, 17, 55, 19), 'salt', 5.49, 100.12, None, 44.84, 129.51, -0.02, 820.61, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:55:36.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:55:36.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:55:36.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:55:19, diff=17.408305s, valid=True
2026-06-03T17:55:36.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:55:36.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T17:55:36.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:55:12, diff=24.411816s, valid=True
2026-06-03T17:55:36.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:55:36.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:55:36.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:55:18, diff=18.419947s, valid=True
2026-06-03T17:55:36.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:55:36.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:55:36.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:55:36.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:55:36.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:55:36.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T17:55:36.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:55:12, diff=24.423641s, valid=True
2026-06-03T17:55:36.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:55:36.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:55:36.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:55:36.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76333.424446s, valid=False
2026-06-03T17:55:36.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:55:36.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:55:36.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:55:36.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:55:36.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:55:36.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:55:36.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:55:36.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:55:36.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:55:36.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:55:36.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:55:36.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:55:36.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:55:36.748 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:55:36.957 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:55:37.301 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:55:37.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:55:37.405 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:55:37.405 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:55:37.491 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:55:37.491 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:56:07.501 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:56:07.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:56:07.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:56:07.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:56:07.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:56:07.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:56:07.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:56:07.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:56:07.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:56:07.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:56:07.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:56:07.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:56:07.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:56:10.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:56:10.880 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:56:10.881 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:56:10.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:56:10.890 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:56:10.902 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:56:10.903 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:56:10.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:56:10.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:56:10.903 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:56:10.904 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:56:10.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:56:10.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:56:10.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:56:11.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:56:11.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:56:11.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T17:56:11.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:56:11.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T17:56:11.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:56:11.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:56:11.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:56:11.174 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:56:11.246 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:55:50
2026-06-03T17:56:11.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86673, datetime.datetime(2026, 6, 3, 17, 55, 50), datetime.datetime(2026, 6, 3, 17, 55, 49), 'salt', 5.32, 99.95, None, 40.26, 115.33, 0.0, 820.67, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:56:11.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:56:11.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:56:11.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:55:49, diff=22.253155s, valid=True
2026-06-03T17:56:11.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:56:11.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T17:56:11.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:56:12, diff=-0.743629s, valid=True
2026-06-03T17:56:11.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:56:11.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:56:11.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:55:50, diff=21.264062s, valid=True
2026-06-03T17:56:11.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:56:11.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:56:11.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:56:11.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:56:11.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:56:11.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T17:56:11.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:56:12, diff=-0.732621s, valid=True
2026-06-03T17:56:11.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:56:11.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:56:11.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:56:11.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76368.268102s, valid=False
2026-06-03T17:56:11.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:56:11.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:56:11.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:56:11.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:56:11.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:56:11.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:56:11.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:56:11.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:56:11.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:56:11.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:56:11.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:56:11.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:56:11.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:56:11.656 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:56:11.865 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:56:12.202 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:56:12.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:56:12.305 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:56:12.305 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:56:12.541 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:56:12.541 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:56:42.543 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:56:42.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:56:42.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:56:42.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:56:42.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:56:43.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:56:43.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:56:43.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:56:43.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:56:43.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:56:43.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:56:43.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:56:43.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:56:46.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:56:46.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:56:46.047 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:56:46.047 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:56:46.057 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:56:46.069 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:56:46.070 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:56:46.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:56:46.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:56:46.071 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:56:46.071 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:56:46.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:56:46.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T17:56:46.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:56:46.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T17:56:46.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:56:46.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T17:56:46.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:56:46.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T17:56:46.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:56:46.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:56:46.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:56:46.403 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:56:46.475 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:56:20
2026-06-03T17:56:46.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86674, datetime.datetime(2026, 6, 3, 17, 56, 20), datetime.datetime(2026, 6, 3, 17, 56, 19), 'salt', 5.49, 100.15, None, 42.55, 129.7, -0.02, 820.67, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:56:46.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:56:46.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T17:56:46.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:56:19, diff=27.483076s, valid=True
2026-06-03T17:56:46.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:56:46.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T17:56:46.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:56:12, diff=34.486577s, valid=True
2026-06-03T17:56:46.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:56:46.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T17:56:46.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:56:13, diff=33.494707s, valid=True
2026-06-03T17:56:46.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:56:46.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:56:46.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:56:46.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:56:46.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:56:46.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T17:56:46.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:56:12, diff=34.498511s, valid=True
2026-06-03T17:56:46.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:56:46.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:56:46.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:56:46.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76403.499388s, valid=False
2026-06-03T17:56:46.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:56:46.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:56:46.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:56:46.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:56:46.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:56:46.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:56:46.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:56:46.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:56:46.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:56:46.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:56:46.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:56:46.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:56:46.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:56:46.822 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:56:47.026 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:56:47.366 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:56:47.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:56:47.469 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:56:47.469 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:56:47.663 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:56:47.663 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:57:17.693 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:57:17.694 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:57:17.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:57:17.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:57:17.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:57:18.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:57:18.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:57:18.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:57:18.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:57:18.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:57:18.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:57:18.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:57:18.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:57:21.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:57:21.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:57:21.590 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:57:21.590 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:57:21.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:57:21.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:57:21.613 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:57:21.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:57:21.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:57:21.614 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:57:21.614 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:57:21.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:57:21.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:57:21.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:57:21.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:57:21.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:57:21.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:57:21.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:57:21.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:57:21.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:57:21.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:57:21.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:57:21.964 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:57:22.038 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:57:20
2026-06-03T17:57:22.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86676, datetime.datetime(2026, 6, 3, 17, 57, 20), datetime.datetime(2026, 6, 3, 17, 57, 20), 'salt', 5.49, 100.15, None, 46.29, 129.46, -0.02, 820.67, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:57:22.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:57:22.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:57:22.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:57:20, diff=2.046366s, valid=True
2026-06-03T17:57:22.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:57:22.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:57:22.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:57:12, diff=10.050019s, valid=True
2026-06-03T17:57:22.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:57:22.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:57:22.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:57:14, diff=8.058467s, valid=True
2026-06-03T17:57:22.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:57:22.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:57:22.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:57:22.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:57:22.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:57:22.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:57:22.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:57:12, diff=10.062354s, valid=True
2026-06-03T17:57:22.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:57:22.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:57:22.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:57:22.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76439.063204s, valid=False
2026-06-03T17:57:22.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:57:22.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:57:22.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:57:22.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:57:22.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:57:22.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:57:22.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:57:22.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:57:22.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:57:22.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:57:22.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:57:22.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:57:22.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:57:22.452 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:57:22.658 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:57:23.000 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:57:23.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:57:23.103 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:57:23.103 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:57:23.190 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:57:23.190 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:57:53.214 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:57:53.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:57:53.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:57:53.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:57:53.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:57:53.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:57:53.618 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:57:53.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:57:53.634 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:57:53.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:57:53.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:57:53.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:57:53.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:57:56.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:57:56.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:57:56.570 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:57:56.570 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:57:56.579 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:57:56.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:57:56.592 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:57:56.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:57:56.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:57:56.594 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:57:56.594 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:57:56.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:57:56.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:57:56.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:57:56.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:57:56.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:57:56.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:57:56.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:57:56.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:57:56.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:57:56.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:57:56.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:57:56.933 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:57:57.002 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:57:51
2026-06-03T17:57:57.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86677, datetime.datetime(2026, 6, 3, 17, 57, 51), datetime.datetime(2026, 6, 3, 17, 57, 50), 'salt', 5.39, 100.09, None, 48.65, 131.29, -0.01, 820.43, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:57:57.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:57:57.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:57:57.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:57:50, diff=7.009123s, valid=True
2026-06-03T17:57:57.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:57:57.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:57:57.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:58:12, diff=-14.987943s, valid=True
2026-06-03T17:57:57.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:57:57.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:57:57.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:57:45, diff=12.018783s, valid=True
2026-06-03T17:57:57.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:57:57.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:57:57.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:57:57.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:57:57.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:57:57.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:57:57.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:58:12, diff=-14.978172s, valid=True
2026-06-03T17:57:57.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:57:57.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:57:57.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:57:57.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76474.022476s, valid=False
2026-06-03T17:57:57.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:57:57.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:57:57.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:57:57.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:57:57.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:57:57.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:57:57.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:57:57.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:57:57.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:57:57.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:57:57.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:57:57.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:57:57.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:57:57.342 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:57:57.548 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:57:57.889 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:57:57.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:57:57.991 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:57:57.991 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:57:58.081 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:57:58.081 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:58:28.094 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:58:28.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:58:28.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:58:28.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:58:28.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:58:28.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:58:28.744 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:58:28.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:58:28.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:58:28.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:58:28.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:58:28.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:58:28.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:58:31.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:58:31.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:58:31.770 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:58:31.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:58:31.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:58:31.793 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:58:31.794 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:58:31.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:58:31.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:58:31.795 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:58:31.795 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:58:31.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:58:31.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:58:31.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:58:32.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:58:32.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:58:32.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:58:32.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:58:32.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:58:32.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:58:32.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:58:32.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:58:32.120 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:58:32.205 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:58:21
2026-06-03T17:58:32.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86678, datetime.datetime(2026, 6, 3, 17, 58, 21), datetime.datetime(2026, 6, 3, 17, 58, 20), 'salt', 5.35, 100.02, None, 49.22, 120.35, -0.01, 820.61, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:58:32.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:58:32.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:58:32.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:58:20, diff=12.212374s, valid=True
2026-06-03T17:58:32.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:58:32.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:58:32.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:58:12, diff=20.215817s, valid=True
2026-06-03T17:58:32.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:58:32.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:58:32.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:58:17, diff=15.223857s, valid=True
2026-06-03T17:58:32.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:58:32.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:58:32.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:58:32.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:58:32.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:58:32.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:58:32.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:58:12, diff=20.227483s, valid=True
2026-06-03T17:58:32.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:58:32.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:58:32.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:58:32.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76509.228292s, valid=False
2026-06-03T17:58:32.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:58:32.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:58:32.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:58:32.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:58:32.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:58:32.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:58:32.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:58:32.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:58:32.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:58:32.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:58:32.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:58:32.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:58:32.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:58:32.613 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:58:32.817 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:58:33.156 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:58:33.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:58:33.258 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:58:33.258 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:58:33.411 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:58:33.411 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:59:03.417 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:59:03.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:59:03.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:59:03.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:59:03.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:59:03.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:59:03.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:59:03.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:59:03.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:59:04.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:59:04.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:59:04.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:59:04.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:59:06.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:59:06.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:59:06.830 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:59:06.830 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:59:06.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:59:06.852 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:59:06.853 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:59:06.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:59:06.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:59:06.854 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:59:06.854 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:59:06.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:59:07.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:59:07.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:59:07.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:59:07.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:59:07.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:59:07.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:59:07.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:59:07.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:59:07.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:59:07.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:59:07.223 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:59:07.300 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:58:51
2026-06-03T17:59:07.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86679, datetime.datetime(2026, 6, 3, 17, 58, 51), datetime.datetime(2026, 6, 3, 17, 58, 50), 'salt', 5.29, 99.95, None, 47.74, 132.14, 0.01, 820.61, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T17:59:07.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:59:07.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:59:07.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:58:50, diff=17.308442s, valid=True
2026-06-03T17:59:07.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:59:07.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:59:07.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:59:12, diff=-4.688003s, valid=True
2026-06-03T17:59:07.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:59:07.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:59:07.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:58:48, diff=19.320344s, valid=True
2026-06-03T17:59:07.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:59:07.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:59:07.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:59:07.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:59:07.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:59:07.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:59:07.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:59:12, diff=-4.675869s, valid=True
2026-06-03T17:59:07.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:59:07.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:59:07.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:59:07.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76544.324976s, valid=False
2026-06-03T17:59:07.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:59:07.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:59:07.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:59:07.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:59:07.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:59:07.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:59:07.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:59:07.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:59:07.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:59:07.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:59:07.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:59:07.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:59:07.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:59:07.645 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:59:07.851 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:59:08.207 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:59:08.309 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:59:08.309 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:59:08.310 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:59:08.467 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:59:08.468 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T17:59:38.477 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T17:59:38.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T17:59:38.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T17:59:39.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T17:59:39.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T17:59:39.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T17:59:39.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T17:59:39.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T17:59:39.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T17:59:39.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T17:59:39.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T17:59:39.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T17:59:39.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T17:59:42.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T17:59:42.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T17:59:42.362 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T17:59:42.362 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T17:59:42.372 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T17:59:42.385 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T17:59:42.386 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T17:59:42.386 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T17:59:42.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T17:59:42.387 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T17:59:42.387 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T17:59:42.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T17:59:42.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T17:59:42.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T17:59:42.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T17:59:42.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:59:42.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:59:42.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T17:59:42.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T17:59:42.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T17:59:42.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T17:59:42.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T17:59:42.735 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T17:59:42.805 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:59:22
2026-06-03T17:59:42.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86680, datetime.datetime(2026, 6, 3, 17, 59, 22), datetime.datetime(2026, 6, 3, 17, 59, 21), 'salt', 5.39, 100.12, None, 33.48, 151.27, -0.02, 820.61, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T17:59:42.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T17:59:42.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T17:59:42.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:59:21, diff=21.813219s, valid=True
2026-06-03T17:59:42.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T17:59:42.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:59:42.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:59:12, diff=30.816712s, valid=True
2026-06-03T17:59:42.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T17:59:42.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T17:59:42.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:59:20, diff=22.824794s, valid=True
2026-06-03T17:59:42.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T17:59:42.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:59:42.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T17:59:42.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T17:59:42.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T17:59:42.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T17:59:42.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:59:12, diff=30.828431s, valid=True
2026-06-03T17:59:42.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T17:59:42.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T17:59:42.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T17:59:42.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76579.829234s, valid=False
2026-06-03T17:59:42.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T17:59:42.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T17:59:42.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T17:59:42.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T17:59:42.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T17:59:42.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T17:59:42.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T17:59:42.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T17:59:42.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T17:59:42.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T17:59:43.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T17:59:43.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T17:59:43.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T17:59:43.149 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T17:59:43.370 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:59:43.715 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T17:59:43.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T17:59:43.817 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T17:59:43.817 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T17:59:43.972 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T17:59:43.972 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:00:14.002 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:00:14.002 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:00:14.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:00:14.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:00:14.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:00:14.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:00:14.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:00:14.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:00:14.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:00:14.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:00:14.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:00:14.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:00:14.618 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:00:17.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:00:17.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:00:17.655 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:00:17.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:00:17.665 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:00:17.678 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:00:17.678 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:00:17.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:00:17.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:00:17.679 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:00:17.680 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:00:17.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:00:17.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T18:00:17.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:00:17.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T18:00:17.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:00:17.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:00:17.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:00:18.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:00:18.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:00:18.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:00:18.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:00:18.035 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:00:18.106 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 17:59:52
2026-06-03T18:00:18.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86681, datetime.datetime(2026, 6, 3, 17, 59, 52), datetime.datetime(2026, 6, 3, 17, 59, 51), 'salt', 5.29, 100.05, None, 29.36, 116.41, -0.01, 820.67, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:00:18.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:00:18.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T18:00:18.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:59:51, diff=27.114481s, valid=True
2026-06-03T18:00:18.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:00:18.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:00:18.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:00:12, diff=6.11798s, valid=True
2026-06-03T18:00:18.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:00:18.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T18:00:18.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 17:59:51, diff=27.126099s, valid=True
2026-06-03T18:00:18.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:00:18.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:00:18.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:00:18.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:00:18.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:00:18.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:00:18.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:00:12, diff=6.129851s, valid=True
2026-06-03T18:00:18.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:00:18.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:00:18.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:00:18.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76615.130652s, valid=False
2026-06-03T18:00:18.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:00:18.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:00:18.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:00:18.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:00:18.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:00:18.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:00:18.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:00:18.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:00:18.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:00:18.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:00:18.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:00:18.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:00:18.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:00:18.453 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:00:18.721 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:00:19.065 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:00:19.169 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:00:19.169 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:00:19.169 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:00:19.354 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:00:19.355 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:00:49.384 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:00:49.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:00:49.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:00:49.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:00:49.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:00:49.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:00:49.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:00:49.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:00:49.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:00:49.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:00:49.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:00:49.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:00:49.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:00:53.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:00:53.077 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:00:53.077 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:00:53.077 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:00:53.086 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:00:53.098 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:00:53.098 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:00:53.098 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:00:53.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:00:53.098 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:00:53.098 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:00:53.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:00:53.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:00:53.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:00:53.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:00:53.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:00:53.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:00:53.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:00:53.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:00:53.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:00:53.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:00:53.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:00:53.398 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:00:53.467 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:00:52
2026-06-03T18:00:53.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86683, datetime.datetime(2026, 6, 3, 18, 0, 52), datetime.datetime(2026, 6, 3, 18, 0, 52), 'salt', 5.32, 100.05, None, 35.11, 132.75, -0.01, 820.61, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:00:53.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:00:53.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:00:53.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:00:52, diff=1.474277s, valid=True
2026-06-03T18:00:53.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:00:53.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:00:53.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:01:12, diff=-18.522941s, valid=True
2026-06-03T18:00:53.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:00:53.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:00:53.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:00:45, diff=8.484336s, valid=True
2026-06-03T18:00:53.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:00:53.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:00:53.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:00:53.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:00:53.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:00:53.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:00:53.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:01:12, diff=-18.512161s, valid=True
2026-06-03T18:00:53.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:00:53.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:00:53.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:00:53.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76650.488575s, valid=False
2026-06-03T18:00:53.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:00:53.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:00:53.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:00:53.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:00:53.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:00:53.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:00:53.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:00:53.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:00:53.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:00:53.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:00:53.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:00:53.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:00:53.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:00:53.807 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:00:54.012 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:00:54.351 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:00:54.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:00:54.453 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:00:54.453 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:00:54.640 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:00:54.640 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:01:24.653 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:01:24.653 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:01:24.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:01:25.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:01:25.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:01:25.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:01:25.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:01:25.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:01:25.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:01:25.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:01:25.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:01:25.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:01:25.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:01:28.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:01:28.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:01:28.397 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:01:28.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:01:28.408 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:01:28.420 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:01:28.421 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:01:28.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:01:28.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:01:28.422 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:01:28.422 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:01:28.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:01:28.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:01:28.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:01:28.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:01:28.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:01:28.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:01:28.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:01:28.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:01:28.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:01:28.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:01:28.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:01:28.771 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:01:28.847 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:01:23
2026-06-03T18:01:28.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86684, datetime.datetime(2026, 6, 3, 18, 1, 23), datetime.datetime(2026, 6, 3, 18, 1, 22), 'salt', 5.35, 100.05, None, 38.11, 130.45, -0.02, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:01:28.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:01:28.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:01:28.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:01:22, diff=6.855103s, valid=True
2026-06-03T18:01:28.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:01:28.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:01:28.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:01:12, diff=16.858649s, valid=True
2026-06-03T18:01:28.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:01:28.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:01:28.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:01:16, diff=12.866858s, valid=True
2026-06-03T18:01:28.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:01:28.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:01:28.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:01:28.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:01:28.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:01:28.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:01:28.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:01:12, diff=16.87059s, valid=True
2026-06-03T18:01:28.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:01:28.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:01:28.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:01:28.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76685.871391s, valid=False
2026-06-03T18:01:28.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:01:28.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:01:28.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:01:28.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:01:28.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:01:28.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:01:28.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:01:28.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:01:28.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:01:29.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:01:29.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:01:29.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:01:29.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:01:29.265 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:01:29.469 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:01:29.810 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:01:29.917 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:01:29.917 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:01:29.917 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:01:30.095 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:01:30.095 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:02:00.125 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:02:00.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:02:00.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:02:00.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:02:00.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:02:00.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:02:00.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:02:00.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:02:00.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:02:00.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:02:00.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:02:00.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:02:00.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:02:04.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:02:04.343 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:02:04.344 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:02:04.344 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:02:04.354 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:02:04.367 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:02:04.368 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:02:04.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:02:04.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:02:04.369 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:02:04.369 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:02:04.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:02:04.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:02:04.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:02:04.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:02:04.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:02:04.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:02:04.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:02:04.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:02:04.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:02:04.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:02:04.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:02:04.680 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:02:04.772 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:01:53
2026-06-03T18:02:04.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86685, datetime.datetime(2026, 6, 3, 18, 1, 53), datetime.datetime(2026, 6, 3, 18, 1, 52), 'salt', 5.19, 99.99, None, 42.16, 120.47, 0.0, 820.98, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:02:04.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:02:04.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:02:04.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:01:52, diff=12.77951s, valid=True
2026-06-03T18:02:04.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:02:04.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:02:04.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:02:12, diff=-7.217101s, valid=True
2026-06-03T18:02:04.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:02:04.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:02:04.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:01:47, diff=17.790725s, valid=True
2026-06-03T18:02:04.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:02:04.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:02:04.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:02:04.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:02:04.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:02:04.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:02:04.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:02:12, diff=-7.205617s, valid=True
2026-06-03T18:02:04.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:02:04.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:02:04.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:02:04.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76721.795187s, valid=False
2026-06-03T18:02:04.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:02:04.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:02:04.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:02:04.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:02:04.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:02:04.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:02:04.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:02:04.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:02:04.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:02:04.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:02:04.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:02:05.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:02:05.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:02:05.117 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:02:05.326 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:02:05.667 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:02:05.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:02:05.771 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:02:05.771 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:02:06.009 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:02:06.009 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:02:36.012 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:02:36.013 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:02:36.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:02:36.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:02:36.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:02:36.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:02:36.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:02:36.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:02:36.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:02:36.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:02:36.618 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:02:36.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:02:36.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:02:39.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:02:39.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:02:39.814 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:02:39.815 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:02:39.824 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:02:39.836 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:02:39.836 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:02:39.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:02:39.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:02:39.837 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:02:39.837 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:02:39.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:02:39.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:02:39.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:02:40.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:02:40.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:02:40.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:02:40.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:02:40.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:02:40.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:02:40.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:02:40.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:02:40.131 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:02:40.208 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:02:23
2026-06-03T18:02:40.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86686, datetime.datetime(2026, 6, 3, 18, 2, 23), datetime.datetime(2026, 6, 3, 18, 2, 22), 'salt', 5.19, 99.99, None, 46.57, 136.88, 0.0, 820.74, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T18:02:40.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:02:40.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:02:40.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:02:22, diff=18.215608s, valid=True
2026-06-03T18:02:40.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:02:40.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:02:40.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:02:12, diff=28.218951s, valid=True
2026-06-03T18:02:40.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:02:40.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:02:40.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:02:18, diff=22.226693s, valid=True
2026-06-03T18:02:40.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:02:40.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:02:40.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:02:40.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:02:40.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:02:40.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:02:40.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:02:12, diff=28.230238s, valid=True
2026-06-03T18:02:40.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:02:40.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:02:40.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:02:40.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76757.231017s, valid=False
2026-06-03T18:02:40.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:02:40.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:02:40.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:02:40.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:02:40.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:02:40.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:02:40.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:02:40.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:02:40.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:02:40.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:02:40.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:02:40.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:02:40.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:02:40.619 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:02:40.826 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:02:41.169 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:02:41.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:02:41.273 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:02:41.273 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:02:41.536 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:02:41.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:03:11.567 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:03:11.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:03:11.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:03:11.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:03:11.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:03:12.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:03:12.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:03:12.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:03:12.163 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:03:12.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:03:12.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:03:12.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:03:12.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:03:15.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:03:15.098 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:03:15.099 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:03:15.099 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:03:15.109 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:03:15.123 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:03:15.123 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:03:15.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:03:15.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:03:15.124 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:03:15.125 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:03:15.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:03:15.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:03:15.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:03:15.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:03:15.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:03:15.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:03:15.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:03:15.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:03:15.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:03:15.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:03:15.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:03:15.464 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:03:15.538 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:02:53
2026-06-03T18:03:15.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86687, datetime.datetime(2026, 6, 3, 18, 2, 53), datetime.datetime(2026, 6, 3, 18, 2, 53), 'salt', 5.19, 99.99, None, 46.96, 137.33, 0.0, 820.67, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T18:03:15.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:03:15.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:03:15.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:02:53, diff=22.545774s, valid=True
2026-06-03T18:03:15.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:03:15.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:03:15.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:03:12, diff=3.549289s, valid=True
2026-06-03T18:03:15.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:03:15.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:03:15.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:02:50, diff=25.557598s, valid=True
2026-06-03T18:03:15.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:03:15.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:03:15.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:03:15.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:03:15.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:03:15.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:03:15.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:03:12, diff=3.561344s, valid=True
2026-06-03T18:03:15.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:03:15.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:03:15.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:03:15.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76792.562166s, valid=False
2026-06-03T18:03:15.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:03:15.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:03:15.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:03:15.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:03:15.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:03:15.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:03:15.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:03:15.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:03:15.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:03:15.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:03:15.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:03:15.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:03:15.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:03:15.884 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:03:16.091 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:03:16.433 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:03:16.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:03:16.536 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:03:16.536 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:03:16.777 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:03:16.777 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:03:46.808 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:03:46.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:03:46.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:03:46.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:03:46.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:03:47.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:03:47.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:03:47.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:03:47.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:03:47.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:03:47.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:03:47.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:03:47.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:03:50.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:03:50.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:03:50.422 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:03:50.422 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:03:50.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:03:50.445 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:03:50.446 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:03:50.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:03:50.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:03:50.447 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:03:50.447 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:03:50.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:03:50.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T18:03:50.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:03:50.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T18:03:50.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:03:50.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:03:50.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:03:50.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:03:50.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:03:50.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:03:50.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:03:50.809 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:03:50.889 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:03:24
2026-06-03T18:03:50.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86688, datetime.datetime(2026, 6, 3, 18, 3, 24), datetime.datetime(2026, 6, 3, 18, 3, 23), 'salt', 5.15, 100.09, None, 44.74, 138.6, -0.02, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:03:50.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:03:50.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T18:03:50.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:03:23, diff=27.896733s, valid=True
2026-06-03T18:03:50.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:03:50.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:03:50.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:03:12, diff=38.900333s, valid=True
2026-06-03T18:03:50.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:03:50.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T18:03:50.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:03:21, diff=29.908837s, valid=True
2026-06-03T18:03:50.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:03:50.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:03:50.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:03:50.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:03:50.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:03:50.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:03:50.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:03:12, diff=38.912713s, valid=True
2026-06-03T18:03:50.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:03:50.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:03:50.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:03:50.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76827.913517s, valid=False
2026-06-03T18:03:50.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:03:50.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:03:50.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:03:50.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:03:50.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:03:50.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:03:50.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:03:50.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:03:51.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:03:51.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:03:51.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:03:51.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:03:51.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:03:51.308 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:03:51.517 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:03:51.883 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:03:51.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:03:51.988 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:03:51.988 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:03:52.204 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:03:52.204 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:04:22.210 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:04:22.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:04:22.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:04:22.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:04:22.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:04:22.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:04:22.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:04:22.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:04:22.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:04:22.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:04:22.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:04:22.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:04:22.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:04:25.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:04:25.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:04:25.632 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:04:25.633 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:04:25.644 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:04:25.657 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:04:25.657 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:04:25.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:04:25.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:04:25.658 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:04:25.659 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:04:25.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:04:25.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:04:25.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:04:25.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:04:25.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:04:25.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:04:25.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:04:25.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:04:25.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:04:25.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:04:25.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:04:25.998 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:04:26.078 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:04:24
2026-06-03T18:04:26.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86690, datetime.datetime(2026, 6, 3, 18, 4, 24), datetime.datetime(2026, 6, 3, 18, 4, 23), 'salt', 5.12, 100.02, None, 36.69, 139.61, -0.01, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:04:26.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:04:26.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:04:26.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:04:23, diff=3.086233s, valid=True
2026-06-03T18:04:26.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:04:26.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:04:26.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:04:12, diff=14.08972s, valid=True
2026-06-03T18:04:26.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:04:26.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:04:26.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:04:24, diff=2.097867s, valid=True
2026-06-03T18:04:26.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:04:26.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:04:26.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:04:26.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:04:26.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:04:26.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:04:26.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:04:12, diff=14.10159s, valid=True
2026-06-03T18:04:26.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:04:26.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:04:26.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:04:26.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76863.102409s, valid=False
2026-06-03T18:04:26.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:04:26.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:04:26.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:04:26.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:04:26.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:04:26.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:04:26.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:04:26.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:04:26.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:04:26.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:04:26.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:04:26.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:04:26.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:04:26.426 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:04:26.634 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:04:26.984 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:04:27.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:04:27.093 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:04:27.093 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:04:27.458 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:04:27.458 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:04:57.463 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:04:57.463 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:04:57.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:04:57.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:04:57.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:04:57.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:04:57.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:04:57.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:04:57.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:04:57.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:04:57.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:04:57.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:04:57.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:05:00.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:05:00.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:05:00.815 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:05:00.816 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:05:00.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:05:00.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:05:00.839 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:05:00.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:05:00.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:05:00.840 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:05:00.841 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:05:00.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:05:00.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:05:00.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:05:01.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:05:01.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:05:01.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:05:01.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:05:01.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:05:01.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:05:01.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:05:01.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:05:01.190 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:05:01.271 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:04:54
2026-06-03T18:05:01.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86691, datetime.datetime(2026, 6, 3, 18, 4, 54), datetime.datetime(2026, 6, 3, 18, 4, 54), 'salt', 4.99, 99.99, None, 30.2, 146.56, 0.0, 820.67, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:05:01.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:05:01.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:05:01.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:04:54, diff=7.278782s, valid=True
2026-06-03T18:05:01.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:05:01.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:05:01.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:05:12, diff=-10.717679s, valid=True
2026-06-03T18:05:01.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:05:01.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:05:01.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:04:47, diff=14.290447s, valid=True
2026-06-03T18:05:01.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:05:01.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:05:01.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:05:01.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:05:01.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:05:01.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:05:01.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:05:12, diff=-10.705787s, valid=True
2026-06-03T18:05:01.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:05:01.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:05:01.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:05:01.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76898.295026s, valid=False
2026-06-03T18:05:01.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:05:01.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:05:01.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:05:01.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:05:01.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:05:01.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:05:01.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:05:01.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:05:01.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:05:01.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:05:01.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:05:01.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:05:01.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:05:01.648 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:05:01.854 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:05:02.194 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:05:02.295 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:05:02.295 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:05:02.295 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:05:02.547 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:05:02.547 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:05:32.577 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:05:32.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:05:32.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:05:32.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:05:33.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:05:33.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:05:33.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:05:33.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:05:33.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:05:33.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:05:33.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:05:33.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:05:33.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:05:36.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:05:36.393 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:05:36.394 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:05:36.394 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:05:36.402 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:05:36.414 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:05:36.414 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:05:36.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:05:36.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:05:36.414 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:05:36.415 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:05:36.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:05:36.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:05:36.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:05:36.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:05:36.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:05:36.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:05:36.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:05:36.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:05:36.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:05:36.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:05:36.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:05:36.754 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:05:36.831 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:05:25
2026-06-03T18:05:36.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86692, datetime.datetime(2026, 6, 3, 18, 5, 25), datetime.datetime(2026, 6, 3, 18, 5, 24), 'salt', 5.12, 100.12, None, 42.94, 132.05, -0.02, 820.68, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:05:36.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:05:36.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:05:36.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:05:24, diff=12.839271s, valid=True
2026-06-03T18:05:36.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:05:36.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:05:36.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:05:12, diff=24.842778s, valid=True
2026-06-03T18:05:36.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:05:36.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:05:36.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:05:18, diff=18.85085s, valid=True
2026-06-03T18:05:36.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:05:36.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:05:36.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:05:36.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:05:36.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:05:36.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:05:36.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:05:12, diff=24.854574s, valid=True
2026-06-03T18:05:36.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:05:36.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:05:36.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:05:36.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76933.855385s, valid=False
2026-06-03T18:05:36.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:05:36.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:05:36.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:05:36.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:05:36.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:05:36.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:05:36.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:05:36.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:05:36.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:05:36.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:05:37.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:05:37.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:05:37.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:05:37.177 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:05:37.447 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:05:37.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:05:37.896 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:05:37.896 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:05:37.897 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:05:37.982 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:05:37.982 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:06:08.012 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:06:08.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:06:08.012 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:06:08.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:06:08.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:06:08.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:06:08.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:06:08.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:06:08.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:06:08.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:06:08.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:06:08.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:06:08.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:06:11.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:06:11.507 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:06:11.508 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:06:11.509 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:06:11.519 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:06:11.532 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:06:11.533 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:06:11.533 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:06:11.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:06:11.534 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:06:11.534 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:06:11.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:06:11.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:06:11.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:06:11.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:06:11.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:06:11.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:06:11.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:06:11.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:06:11.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:06:11.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:06:11.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:06:11.912 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:06:11.993 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:05:55
2026-06-03T18:06:11.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86693, datetime.datetime(2026, 6, 3, 18, 5, 55), datetime.datetime(2026, 6, 3, 18, 5, 54), 'salt', 5.09, 100.05, None, 36.06, 133.9, -0.01, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:06:11.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:06:11.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:06:12.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:05:54, diff=18.000905s, valid=True
2026-06-03T18:06:12.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:06:12.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:06:12.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:06:12, diff=0.004654s, valid=True
2026-06-03T18:06:12.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:06:12.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:06:12.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:05:48, diff=24.013142s, valid=True
2026-06-03T18:06:12.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:06:12.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:06:12.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:06:12.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:06:12.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:06:12.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:06:12.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:06:12, diff=0.017043s, valid=True
2026-06-03T18:06:12.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:06:12.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:06:12.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:06:12.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=76969.017895s, valid=False
2026-06-03T18:06:12.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:06:12.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:06:12.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:06:12.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:06:12.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:06:12.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:06:12.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:06:12.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:06:12.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:06:12.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:06:12.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:06:12.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:06:12.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:06:12.339 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:06:12.545 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:06:12.889 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:06:12.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:06:12.993 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:06:12.993 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:06:13.086 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:06:13.087 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:06:43.117 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:06:43.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:06:43.117 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:06:43.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:06:43.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:06:43.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:06:43.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:06:43.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:06:43.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:06:43.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:06:43.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:06:43.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:06:43.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:06:47.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:06:47.457 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:06:47.458 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:06:47.458 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:06:47.467 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:06:47.480 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:06:47.480 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:06:47.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:06:47.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:06:47.481 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:06:47.482 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:06:47.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:06:47.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:06:47.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:06:47.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:06:47.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:06:47.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:06:47.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:06:47.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:06:47.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:06:47.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:06:47.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:06:47.825 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:06:47.899 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:06:25
2026-06-03T18:06:47.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86694, datetime.datetime(2026, 6, 3, 18, 6, 25), datetime.datetime(2026, 6, 3, 18, 6, 24), 'salt', 5.09, 100.02, None, 38.35, 140.05, -0.01, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:06:47.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:06:47.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:06:47.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:06:24, diff=23.906721s, valid=True
2026-06-03T18:06:47.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:06:47.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:06:47.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:06:12, diff=35.910205s, valid=True
2026-06-03T18:06:47.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:06:47.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:06:47.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:06:19, diff=28.918406s, valid=True
2026-06-03T18:06:47.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:06:47.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:06:47.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:06:47.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:06:47.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:06:47.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:06:47.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:06:12, diff=35.922158s, valid=True
2026-06-03T18:06:47.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:06:47.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:06:47.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:06:47.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77004.922984s, valid=False
2026-06-03T18:06:47.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:06:47.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:06:47.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:06:47.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:06:47.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:06:47.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:06:47.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:06:47.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:06:48.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:06:48.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:06:48.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:06:48.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:06:48.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:06:48.316 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:06:48.520 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:06:48.859 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:06:48.961 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:06:48.961 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:06:48.961 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:06:49.221 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:06:49.221 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:07:19.233 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:07:19.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:07:19.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:07:19.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:07:19.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:07:19.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:07:19.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:07:19.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:07:19.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:07:19.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:07:19.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:07:19.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:07:19.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:07:22.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:07:22.628 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:07:22.629 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:07:22.629 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:07:22.640 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:07:22.653 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:07:22.653 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:07:22.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:07:22.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:07:22.654 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:07:22.655 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:07:22.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:07:22.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T18:07:22.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:07:22.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T18:07:22.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:07:22.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:07:22.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:07:23.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:07:23.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:07:23.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:07:23.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:07:23.005 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:07:23.079 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:06:55
2026-06-03T18:07:23.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86695, datetime.datetime(2026, 6, 3, 18, 6, 55), datetime.datetime(2026, 6, 3, 18, 6, 55), 'salt', 5.19, 100.12, None, 40.61, 134.68, -0.02, 820.62, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:07:23.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:07:23.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T18:07:23.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:06:55, diff=28.086617s, valid=True
2026-06-03T18:07:23.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:07:23.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:07:23.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:07:12, diff=11.090131s, valid=True
2026-06-03T18:07:23.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:07:23.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T18:07:23.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:06:51, diff=32.098296s, valid=True
2026-06-03T18:07:23.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:07:23.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:07:23.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:07:23.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:07:23.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:07:23.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:07:23.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:07:12, diff=11.102114s, valid=True
2026-06-03T18:07:23.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:07:23.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:07:23.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:07:23.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77040.102933s, valid=False
2026-06-03T18:07:23.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:07:23.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:07:23.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:07:23.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:07:23.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:07:23.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:07:23.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:07:23.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:07:23.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:07:23.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:07:23.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:07:23.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:07:23.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:07:23.423 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:07:23.627 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:07:23.965 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:07:24.068 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:07:24.068 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:07:24.068 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:07:24.260 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:07:24.260 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:07:54.290 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:07:54.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:07:54.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:07:54.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:07:54.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:07:54.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:07:54.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:07:54.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:07:54.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:07:54.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:07:54.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:07:54.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:07:54.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:07:58.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:07:58.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:07:58.639 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:07:58.640 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:07:58.650 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:07:58.663 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:07:58.663 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:07:58.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:07:58.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:07:58.664 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:07:58.665 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:07:58.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:07:58.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:07:58.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:07:58.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:07:58.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:07:58.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:07:58.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:07:59.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:07:59.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:07:59.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:07:59.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:07:59.014 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:07:59.088 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:07:56
2026-06-03T18:07:59.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86697, datetime.datetime(2026, 6, 3, 18, 7, 56), datetime.datetime(2026, 6, 3, 18, 7, 55), 'salt', 5.06, 100.02, None, 39.41, 138.83, 0.0, 820.56, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:07:59.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:07:59.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:07:59.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:07:55, diff=4.096288s, valid=True
2026-06-03T18:07:59.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:07:59.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:07:59.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:08:12, diff=-12.900191s, valid=True
2026-06-03T18:07:59.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:07:59.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:07:59.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:07:54, diff=5.107911s, valid=True
2026-06-03T18:07:59.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:07:59.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:07:59.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:07:59.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:07:59.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:07:59.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:07:59.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:08:12, diff=-12.88837s, valid=True
2026-06-03T18:07:59.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:07:59.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:07:59.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:07:59.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77076.112456s, valid=False
2026-06-03T18:07:59.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:07:59.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:07:59.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:07:59.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:07:59.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:07:59.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:07:59.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:07:59.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:07:59.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:07:59.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:07:59.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:07:59.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:07:59.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:07:59.502 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:07:59.707 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:08:00.055 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:08:00.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:08:00.162 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:08:00.162 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:08:00.426 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:08:00.427 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:08:30.430 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:08:30.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:08:30.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:08:30.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:08:30.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:08:30.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:08:30.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:08:30.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:08:30.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:08:30.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:08:30.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:08:30.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:08:30.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:08:35.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:08:35.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:08:35.598 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:08:35.598 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:08:35.611 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:08:35.623 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:08:35.624 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:08:35.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:08:35.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:08:35.625 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:08:35.625 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:08:35.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:08:35.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:08:35.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:08:35.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:08:35.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:08:35.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:08:35.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:08:35.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:08:35.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:08:35.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:08:35.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:08:35.978 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:08:36.053 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:08:26
2026-06-03T18:08:36.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86698, datetime.datetime(2026, 6, 3, 18, 8, 26), datetime.datetime(2026, 6, 3, 18, 8, 25), 'salt', 5.06, 100.06, None, 40.36, 142.82, -0.01, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:08:36.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:08:36.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:08:36.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:08:25, diff=11.060594s, valid=True
2026-06-03T18:08:36.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:08:36.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:08:36.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:08:12, diff=24.064s, valid=True
2026-06-03T18:08:36.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:08:36.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:08:36.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:08:25, diff=11.072007s, valid=True
2026-06-03T18:08:36.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:08:36.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:08:36.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:08:36.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:08:36.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:08:36.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:08:36.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:08:12, diff=24.075571s, valid=True
2026-06-03T18:08:36.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:08:36.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:08:36.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:08:36.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77113.076352s, valid=False
2026-06-03T18:08:36.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:08:36.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:08:36.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:08:36.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:08:36.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:08:36.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:08:36.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:08:36.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:08:36.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:08:36.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:08:36.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:08:36.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:08:36.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:08:36.395 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:08:36.600 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:08:36.942 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:08:37.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:08:37.045 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:08:37.045 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:08:37.137 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:08:37.285 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:09:07.316 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:09:07.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:09:07.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:09:07.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:09:07.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:09:07.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:09:07.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:09:07.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:09:07.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:09:07.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:09:07.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:09:07.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:09:07.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:09:10.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:09:10.916 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:09:10.917 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:09:10.917 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:09:10.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:09:10.938 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:09:10.939 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:09:10.939 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:09:10.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:09:10.939 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:09:10.939 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:09:10.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:09:11.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:09:11.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:09:11.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:09:11.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:09:11.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:09:11.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:09:11.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:09:11.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:09:11.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:09:11.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:09:11.248 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:09:11.321 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:08:56
2026-06-03T18:09:11.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86699, datetime.datetime(2026, 6, 3, 18, 8, 56), datetime.datetime(2026, 6, 3, 18, 8, 56), 'salt', 5.06, 100.09, None, 34.33, 155.41, -0.01, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:09:11.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:09:11.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:09:11.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:08:56, diff=15.329099s, valid=True
2026-06-03T18:09:11.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:09:11.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:09:11.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:09:12, diff=-0.667454s, valid=True
2026-06-03T18:09:11.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:09:11.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:09:11.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:08:49, diff=22.340201s, valid=True
2026-06-03T18:09:11.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:09:11.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:09:11.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:09:11.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:09:11.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:09:11.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:09:11.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:09:12, diff=-0.656411s, valid=True
2026-06-03T18:09:11.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:09:11.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:09:11.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:09:11.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77148.344375s, valid=False
2026-06-03T18:09:11.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:09:11.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:09:11.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:09:11.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:09:11.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:09:11.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:09:11.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:09:11.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:09:11.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:09:11.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:09:11.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:09:11.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:09:11.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:09:11.745 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:09:11.952 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:09:12.292 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:09:12.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:09:12.394 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:09:12.394 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:09:12.598 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:09:12.598 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:09:42.599 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:09:42.600 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:09:42.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:09:42.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:09:42.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:09:43.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:09:43.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:09:43.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:09:43.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:09:43.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:09:43.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:09:43.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:09:43.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:09:46.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:09:46.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:09:46.128 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:09:46.129 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:09:46.138 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:09:46.151 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:09:46.151 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:09:46.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:09:46.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:09:46.152 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:09:46.153 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:09:46.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:09:46.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:09:46.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:09:46.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:09:46.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:09:46.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:09:46.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:09:46.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:09:46.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:09:46.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:09:46.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:09:46.505 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:09:46.578 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:09:27
2026-06-03T18:09:46.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86700, datetime.datetime(2026, 6, 3, 18, 9, 27), datetime.datetime(2026, 6, 3, 18, 9, 26), 'salt', 5.19, 100.09, None, 28.58, 141.88, -0.02, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:09:46.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:09:46.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:09:46.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:09:26, diff=20.585979s, valid=True
2026-06-03T18:09:46.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:09:46.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:09:46.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:09:12, diff=34.589542s, valid=True
2026-06-03T18:09:46.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:09:46.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:09:46.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:09:19, diff=27.597749s, valid=True
2026-06-03T18:09:46.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:09:46.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:09:46.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:09:46.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:09:46.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:09:46.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:09:46.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:09:12, diff=34.60153s, valid=True
2026-06-03T18:09:46.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:09:46.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:09:46.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:09:46.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77183.602386s, valid=False
2026-06-03T18:09:46.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:09:46.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:09:46.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:09:46.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:09:46.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:09:46.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:09:46.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:09:46.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:09:46.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:09:46.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:09:46.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:09:46.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:09:46.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:09:46.924 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:09:47.134 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:09:47.486 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:09:47.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:09:47.603 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:09:47.603 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:09:47.790 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:09:47.790 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:10:17.819 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:10:17.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:10:17.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:10:18.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:10:18.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:10:18.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:10:18.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:10:18.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:10:18.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:10:18.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:10:18.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:10:18.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:10:18.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:10:21.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:10:21.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:10:21.713 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:10:21.714 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:10:21.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:10:21.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:10:21.737 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:10:21.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:10:21.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:10:21.739 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:10:21.739 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:10:21.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:10:21.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:10:21.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:10:21.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:10:21.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:10:22.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:10:22.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:10:22.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:10:22.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:10:22.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:10:22.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:10:22.090 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:10:22.168 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:09:57
2026-06-03T18:10:22.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86701, datetime.datetime(2026, 6, 3, 18, 9, 57), datetime.datetime(2026, 6, 3, 18, 9, 56), 'salt', 5.22, 100.12, None, 46.26, 144.42, -0.02, 820.74, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T18:10:22.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:10:22.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:10:22.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:09:56, diff=26.176553s, valid=True
2026-06-03T18:10:22.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:10:22.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:10:22.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:10:12, diff=10.180157s, valid=True
2026-06-03T18:10:22.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:10:22.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:10:22.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:09:49, diff=33.18838s, valid=True
2026-06-03T18:10:22.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:10:22.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:10:22.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:10:22.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:10:22.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:10:22.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:10:22.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:10:12, diff=10.192191s, valid=True
2026-06-03T18:10:22.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:10:22.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:10:22.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:10:22.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77219.193016s, valid=False
2026-06-03T18:10:22.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:10:22.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:10:22.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:10:22.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:10:22.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:10:22.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:10:22.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:10:22.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:10:22.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:10:22.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:10:22.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:10:22.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:10:22.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:10:22.517 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:10:22.725 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:10:23.071 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:10:23.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:10:23.174 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:10:23.175 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:10:23.462 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:10:23.462 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:10:53.469 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:10:53.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:10:53.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:10:53.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:10:53.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:10:54.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:10:54.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:10:54.132 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:10:54.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:10:54.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:10:54.144 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:10:54.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:10:54.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:10:57.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:10:57.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:10:57.162 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:10:57.163 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:10:57.181 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:10:57.194 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:10:57.194 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:10:57.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:10:57.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:10:57.196 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:10:57.196 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:10:57.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:10:57.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from salt
2026-06-03T18:10:57.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:10:57.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1426 rows from monet
2026-06-03T18:10:57.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:10:57.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:10:57.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:10:57.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:10:57.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:10:57.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:10:57.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:10:57.542 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:10:57.630 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:10:27
2026-06-03T18:10:57.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86702, datetime.datetime(2026, 6, 3, 18, 10, 27), datetime.datetime(2026, 6, 3, 18, 10, 26), 'salt', 5.06, 100.09, None, 43.26, 141.96, -0.01, 820.44, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:10:57.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:10:57.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 10 fields
2026-06-03T18:10:57.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:10:26, diff=31.637675s, valid=True
2026-06-03T18:10:57.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:10:57.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:10:57.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:10:12, diff=45.641139s, valid=True
2026-06-03T18:10:57.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:10:57.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1426 rows. Structure expected: 11 fields
2026-06-03T18:10:57.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:10:21, diff=36.649275s, valid=True
2026-06-03T18:10:57.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:10:57.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:10:57.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:10:57.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:10:57.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:10:57.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:10:57.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:10:12, diff=45.65297s, valid=True
2026-06-03T18:10:57.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:10:57.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:10:57.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:10:57.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77254.653779s, valid=False
2026-06-03T18:10:57.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:10:57.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:10:57.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:10:57.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:10:57.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:10:57.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:10:57.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:10:57.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:10:57.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:10:57.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:10:57.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:10:57.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:10:57.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:10:57.973 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:10:58.237 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:10:58.575 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:10:58.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:10:58.679 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:10:58.679 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:10:58.925 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:10:58.926 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:11:28.956 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:11:28.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:11:28.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:11:29.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:11:29.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:11:29.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:11:29.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:11:29.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:11:29.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:11:29.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:11:29.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:11:29.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:11:29.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:11:32.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:11:32.686 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:11:32.687 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:11:32.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:11:32.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:11:32.711 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:11:32.712 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:11:32.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:11:32.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:11:32.713 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:11:32.713 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:11:32.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:11:32.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:11:32.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:11:32.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:11:32.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:11:33.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:11:33.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:11:33.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:11:33.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:11:33.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:11:33.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:11:33.060 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:11:33.139 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:11:28
2026-06-03T18:11:33.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86704, datetime.datetime(2026, 6, 3, 18, 11, 28), datetime.datetime(2026, 6, 3, 18, 11, 27), 'salt', 5.06, 100.06, None, 36.2, 137.52, -0.01, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:11:33.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:11:33.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:11:33.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:11:27, diff=6.146436s, valid=True
2026-06-03T18:11:33.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:11:33.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:11:33.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:11:12, diff=21.149959s, valid=True
2026-06-03T18:11:33.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:11:33.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:11:33.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:11:24, diff=9.158263s, valid=True
2026-06-03T18:11:33.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:11:33.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:11:33.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:11:33.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:11:33.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:11:33.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:11:33.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:11:12, diff=21.162034s, valid=True
2026-06-03T18:11:33.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:11:33.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:11:33.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:11:33.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77290.162891s, valid=False
2026-06-03T18:11:33.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:11:33.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:11:33.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:11:33.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:11:33.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:11:33.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:11:33.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:11:33.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:11:33.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:11:33.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:11:33.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:11:33.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:11:33.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:11:33.485 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:11:33.693 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:11:34.036 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:11:34.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:11:34.140 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:11:34.140 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:11:34.331 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:11:34.332 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:12:04.342 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:12:04.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:12:04.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:12:04.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:12:04.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:12:04.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:12:04.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:12:04.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:12:04.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:12:04.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:12:04.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:12:04.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:12:04.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:12:07.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:12:07.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:12:07.785 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:12:07.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:12:07.795 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:12:07.808 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:12:07.808 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:12:07.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:12:07.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:12:07.810 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:12:07.810 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:12:07.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:12:07.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:12:07.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:12:08.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:12:08.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:12:08.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:12:08.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:12:08.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:12:08.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:12:08.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:12:08.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:12:08.174 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:12:08.249 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:11:58
2026-06-03T18:12:08.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86705, datetime.datetime(2026, 6, 3, 18, 11, 58), datetime.datetime(2026, 6, 3, 18, 11, 57), 'salt', 5.06, 100.06, None, 46.19, 126.48, -0.01, 820.56, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T18:12:08.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:12:08.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:12:08.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:11:57, diff=11.256519s, valid=True
2026-06-03T18:12:08.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:12:08.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:12:08.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:12:12, diff=-3.739857s, valid=True
2026-06-03T18:12:08.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:12:08.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:12:08.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:11:55, diff=13.268464s, valid=True
2026-06-03T18:12:08.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:12:08.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:12:08.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:12:08.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:12:08.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:12:08.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:12:08.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:12:12, diff=-3.727708s, valid=True
2026-06-03T18:12:08.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:12:08.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:12:08.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:12:08.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77325.273136s, valid=False
2026-06-03T18:12:08.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:12:08.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:12:08.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:12:08.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:12:08.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:12:08.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:12:08.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:12:08.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:12:08.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:12:08.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:12:08.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:12:08.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:12:08.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:12:08.670 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:12:08.877 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:12:09.220 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:12:09.323 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:12:09.323 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:12:09.323 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:12:09.515 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:12:09.515 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:12:39.535 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:12:39.535 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:12:39.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:12:39.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:12:40.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:12:40.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:12:40.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:12:40.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:12:40.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:12:40.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:12:40.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:12:40.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:12:40.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:12:43.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:12:43.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:12:43.442 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:12:43.442 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:12:43.453 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:12:43.466 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:12:43.467 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:12:43.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:12:43.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:12:43.468 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:12:43.468 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:12:43.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:12:43.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:12:43.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:12:43.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:12:43.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:12:43.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:12:43.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:12:43.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:12:43.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:12:43.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:12:43.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:12:43.815 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:12:43.943 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:12:28
2026-06-03T18:12:43.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86706, datetime.datetime(2026, 6, 3, 18, 12, 28), datetime.datetime(2026, 6, 3, 18, 12, 28), 'salt', 5.06, 100.06, None, 51.19, 135.71, -0.01, 820.5, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T18:12:43.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:12:43.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:12:43.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:12:28, diff=15.950842s, valid=True
2026-06-03T18:12:43.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:12:43.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:12:43.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:12:12, diff=31.954344s, valid=True
2026-06-03T18:12:43.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:12:43.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:12:43.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:12:27, diff=16.962452s, valid=True
2026-06-03T18:12:43.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:12:43.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:12:43.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:12:43.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:12:43.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:12:43.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:12:43.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:12:12, diff=31.966206s, valid=True
2026-06-03T18:12:43.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:12:43.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:12:43.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:12:43.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77360.967035s, valid=False
2026-06-03T18:12:43.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:12:43.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:12:43.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:12:43.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:12:43.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:12:44.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:12:44.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:12:44.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:12:44.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:12:44.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:12:44.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:12:44.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:12:44.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:12:44.291 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:12:44.497 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:12:44.840 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:12:44.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:12:44.944 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:12:44.944 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:12:45.198 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:12:45.198 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:13:15.228 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:13:15.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:13:15.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:13:15.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:13:15.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:13:15.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:13:15.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:13:15.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:13:15.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:13:15.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:13:15.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:13:15.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:13:15.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:13:18.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:13:18.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:13:18.868 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:13:18.868 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:13:18.879 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:13:18.893 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:13:18.893 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:13:18.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:13:18.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:13:18.894 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:13:18.895 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:13:18.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:13:19.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:13:19.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:13:19.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:13:19.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:13:19.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:13:19.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:13:19.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:13:19.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:13:19.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:13:19.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:13:19.235 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:13:19.313 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:12:59
2026-06-03T18:13:19.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86707, datetime.datetime(2026, 6, 3, 18, 12, 59), datetime.datetime(2026, 6, 3, 18, 12, 58), 'salt', 5.02, 100.06, None, 43.75, 134.44, -0.02, 820.44, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:13:19.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:13:19.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:13:19.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:12:58, diff=21.320899s, valid=True
2026-06-03T18:13:19.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:13:19.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:13:19.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:13:12, diff=7.324409s, valid=True
2026-06-03T18:13:19.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:13:19.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:13:19.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:12:58, diff=21.332599s, valid=True
2026-06-03T18:13:19.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:13:19.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:13:19.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:13:19.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:13:19.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:13:19.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:13:19.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:13:12, diff=7.336352s, valid=True
2026-06-03T18:13:19.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:13:19.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:13:19.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:13:19.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77396.337182s, valid=False
2026-06-03T18:13:19.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:13:19.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:13:19.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:13:19.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:13:19.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:13:19.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:13:19.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:13:19.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:13:19.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:13:19.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:13:19.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:13:19.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:13:19.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:13:19.728 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:13:19.944 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:13:20.297 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:13:20.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:13:20.401 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:13:20.401 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:13:20.596 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:13:20.596 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:13:50.622 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:13:50.623 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:13:50.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:13:51.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:13:51.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:13:51.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:13:51.674 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:13:51.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:13:51.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:13:51.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:13:51.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:13:51.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:13:51.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:13:54.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:13:54.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:13:54.705 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:13:54.705 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:13:54.711 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:13:54.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:13:54.724 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:13:54.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:13:54.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:13:54.724 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:13:54.724 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:13:54.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:13:54.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:13:54.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:13:54.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:13:54.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:13:54.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:13:54.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:13:55.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:13:55.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:13:55.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:13:55.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:13:55.022 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:13:55.098 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:13:29
2026-06-03T18:13:55.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86708, datetime.datetime(2026, 6, 3, 18, 13, 29), datetime.datetime(2026, 6, 3, 18, 13, 28), 'salt', 5.02, 100.06, None, 46.5, 142.59, -0.02, 820.44, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T18:13:55.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:13:55.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:13:55.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:13:28, diff=27.105436s, valid=True
2026-06-03T18:13:55.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:13:55.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:13:55.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:13:12, diff=43.108736s, valid=True
2026-06-03T18:13:55.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:13:55.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:13:55.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:13:21, diff=34.116477s, valid=True
2026-06-03T18:13:55.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:13:55.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:13:55.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:13:55.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:13:55.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:13:55.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:13:55.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:13:12, diff=43.119993s, valid=True
2026-06-03T18:13:55.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:13:55.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:13:55.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:13:55.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77432.120761s, valid=False
2026-06-03T18:13:55.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:13:55.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:13:55.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:13:55.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:13:55.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:13:55.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:13:55.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:13:55.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:13:55.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:13:55.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:13:55.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:13:55.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:13:55.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:13:55.439 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:13:55.646 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:13:55.989 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:13:56.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:13:56.092 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:13:56.092 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:13:56.278 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:13:56.278 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:14:26.297 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:14:26.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:14:26.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:14:26.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:14:26.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:14:26.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:14:26.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:14:26.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:14:26.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:14:26.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:14:26.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:14:26.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:14:26.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:14:30.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:14:30.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:14:30.744 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:14:30.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:14:30.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:14:30.768 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:14:30.769 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:14:30.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:14:30.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:14:30.770 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:14:30.770 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:14:30.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:14:30.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:14:30.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:14:31.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:14:31.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:14:31.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:14:31.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:14:31.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:14:31.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:14:31.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:14:31.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:14:31.109 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:14:31.189 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:14:29
2026-06-03T18:14:31.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86710, datetime.datetime(2026, 6, 3, 18, 14, 29), datetime.datetime(2026, 6, 3, 18, 14, 29), 'salt', 4.99, 100.06, None, 41.21, 142.52, -0.01, 820.81, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:14:31.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:14:31.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:14:31.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:14:29, diff=2.196876s, valid=True
2026-06-03T18:14:31.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:14:31.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:14:31.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:14:12, diff=19.200425s, valid=True
2026-06-03T18:14:31.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:14:31.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:14:31.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:14:22, diff=9.208649s, valid=True
2026-06-03T18:14:31.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:14:31.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:14:31.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:14:31.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:14:31.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:14:31.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:14:31.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:14:12, diff=19.212503s, valid=True
2026-06-03T18:14:31.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:14:31.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:14:31.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:14:31.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77468.213333s, valid=False
2026-06-03T18:14:31.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:14:31.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:14:31.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:14:31.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:14:31.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:14:31.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:14:31.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:14:31.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:14:31.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:14:31.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:14:31.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:14:31.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:14:31.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:14:31.602 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:14:31.811 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:14:32.160 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:14:32.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:14:32.269 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:14:32.269 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:14:32.454 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:14:32.454 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:15:02.455 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:15:02.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:15:02.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:15:02.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:15:02.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:15:02.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:15:02.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:15:02.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:15:02.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:15:02.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:15:02.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:15:02.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:15:02.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:15:05.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:15:05.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:15:05.835 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:15:05.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:15:05.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:15:05.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:15:05.859 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:15:05.860 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:15:05.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:15:05.861 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:15:05.861 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:15:05.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:15:05.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:15:05.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:15:06.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:15:06.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:15:06.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:15:06.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:15:06.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:15:06.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:15:06.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:15:06.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:15:06.204 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:15:06.285 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:15:00
2026-06-03T18:15:06.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86711, datetime.datetime(2026, 6, 3, 18, 15), datetime.datetime(2026, 6, 3, 18, 14, 59), 'salt', 5.06, 100.12, None, 36.34, 134.3, -0.02, 820.44, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:15:06.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:15:06.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:15:06.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:14:59, diff=7.292365s, valid=True
2026-06-03T18:15:06.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:15:06.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:15:06.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:15:12, diff=-5.704176s, valid=True
2026-06-03T18:15:06.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:15:06.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:15:06.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:14:54, diff=12.303877s, valid=True
2026-06-03T18:15:06.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:15:06.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:15:06.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:15:06.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:15:06.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:15:06.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:15:06.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:15:12, diff=-5.692417s, valid=True
2026-06-03T18:15:06.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:15:06.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:15:06.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:15:06.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77503.308387s, valid=False
2026-06-03T18:15:06.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:15:06.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:15:06.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:15:06.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:15:06.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:15:06.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:15:06.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:15:06.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:15:06.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:15:06.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:15:06.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:15:06.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:15:06.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:15:06.631 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:15:06.840 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:15:07.187 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:15:07.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:15:07.290 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:15:07.290 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:15:07.466 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:15:07.466 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:15:37.474 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:15:37.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:15:37.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:15:37.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:15:37.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:15:38.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:15:38.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:15:38.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:15:38.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:15:38.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:15:38.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:15:38.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:15:38.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:15:41.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:15:41.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:15:41.145 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:15:41.145 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:15:41.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:15:41.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:15:41.167 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:15:41.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:15:41.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:15:41.167 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:15:41.167 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:15:41.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:15:41.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:15:41.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:15:41.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:15:41.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:15:41.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:15:41.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:15:41.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:15:41.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:15:41.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:15:41.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:15:41.468 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:15:41.544 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:15:30
2026-06-03T18:15:41.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86712, datetime.datetime(2026, 6, 3, 18, 15, 30), datetime.datetime(2026, 6, 3, 18, 15, 29), 'salt', 5.06, 100.09, None, 40.01, 132.14, -0.01, 820.56, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:15:41.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:15:41.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:15:41.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:15:29, diff=12.551539s, valid=True
2026-06-03T18:15:41.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:15:41.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:15:41.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:15:12, diff=29.554857s, valid=True
2026-06-03T18:15:41.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:15:41.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:15:41.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:15:25, diff=16.562413s, valid=True
2026-06-03T18:15:41.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:15:41.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:15:41.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:15:41.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:15:41.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:15:41.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:15:41.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:15:12, diff=29.565892s, valid=True
2026-06-03T18:15:41.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:15:41.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:15:41.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:15:41.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77538.566637s, valid=False
2026-06-03T18:15:41.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:15:41.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:15:41.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:15:41.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:15:41.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:15:41.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:15:41.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:15:41.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:15:41.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:15:41.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:15:41.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:15:41.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:15:41.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:15:41.887 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:15:42.095 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:15:42.440 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:15:42.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:15:42.542 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:15:42.542 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:15:42.629 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:15:42.630 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:16:12.653 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:16:12.653 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:16:12.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:16:12.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:16:12.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:16:13.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:16:13.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:16:13.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:16:13.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:16:13.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:16:13.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:16:13.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:16:13.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:16:16.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:16:16.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:16:16.101 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:16:16.101 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:16:16.112 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:16:16.124 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:16:16.125 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:16:16.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:16:16.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:16:16.125 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:16:16.126 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:16:16.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:16:16.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:16:16.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:16:16.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:16:16.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:16:16.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:16:16.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:16:16.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:16:16.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:16:16.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:16:16.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:16:16.408 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:16:16.484 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:16:00
2026-06-03T18:16:16.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86713, datetime.datetime(2026, 6, 3, 18, 16), datetime.datetime(2026, 6, 3, 18, 15, 59), 'salt', 5.09, 100.09, None, 35.74, 126.15, -0.02, 820.5, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:16:16.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:16:16.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:16:16.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:15:59, diff=17.491253s, valid=True
2026-06-03T18:16:16.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:16:16.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:16:16.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:16:12, diff=4.494454s, valid=True
2026-06-03T18:16:16.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:16:16.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:16:16.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:15:56, diff=20.501797s, valid=True
2026-06-03T18:16:16.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:16:16.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:16:16.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:16:16.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:16:16.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:16:16.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:16:16.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:16:12, diff=4.505178s, valid=True
2026-06-03T18:16:16.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:16:16.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:16:16.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:16:16.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77573.505913s, valid=False
2026-06-03T18:16:16.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:16:16.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:16:16.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:16:16.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:16:16.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:16:16.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:16:16.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:16:16.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:16:16.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:16:16.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:16:16.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:16:16.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:16:16.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:16:16.827 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:16:17.096 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:16:17.440 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:16:17.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:16:17.544 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:16:17.544 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:16:17.636 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:16:17.636 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:16:47.641 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:16:47.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:16:47.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:16:47.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:16:47.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:16:48.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:16:48.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:16:48.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:16:48.052 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:16:48.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:16:48.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:16:48.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:16:48.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:16:51.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:16:51.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:16:51.013 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:16:51.013 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:16:51.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:16:51.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:16:51.035 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:16:51.036 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:16:51.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:16:51.036 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:16:51.037 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:16:51.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:16:51.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:16:51.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:16:51.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:16:51.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:16:51.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:16:51.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:16:51.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:16:51.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:16:51.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:16:51.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:16:51.373 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:16:51.448 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:16:30
2026-06-03T18:16:51.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86714, datetime.datetime(2026, 6, 3, 18, 16, 30), datetime.datetime(2026, 6, 3, 18, 16, 30), 'salt', 5.06, 100.09, None, 42.73, 149.26, -0.01, 820.68, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:16:51.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:16:51.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:16:51.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:16:30, diff=21.456178s, valid=True
2026-06-03T18:16:51.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:16:51.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:16:51.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:16:12, diff=39.459706s, valid=True
2026-06-03T18:16:51.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:16:51.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:16:51.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:16:28, diff=23.46779s, valid=True
2026-06-03T18:16:51.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:16:51.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:16:51.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:16:51.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:16:51.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:16:51.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:16:51.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:16:12, diff=39.471522s, valid=True
2026-06-03T18:16:51.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:16:51.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:16:51.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:16:51.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77608.47233s, valid=False
2026-06-03T18:16:51.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:16:51.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:16:51.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:16:51.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:16:51.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:16:51.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:16:51.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:16:51.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:16:51.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:16:51.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:16:51.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:16:51.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:16:51.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:16:51.794 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:16:52.001 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:16:52.342 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:16:52.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:16:52.444 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:16:52.444 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:16:52.701 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:16:52.701 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:17:22.726 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:17:22.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:17:22.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:17:22.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:17:22.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:17:23.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:17:23.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:17:23.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:17:23.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:17:23.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:17:23.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:17:23.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:17:23.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:17:26.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:17:26.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:17:26.076 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:17:26.076 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:17:26.087 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:17:26.100 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:17:26.100 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:17:26.101 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:17:26.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:17:26.101 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:17:26.102 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:17:26.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:17:26.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:17:26.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:17:26.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:17:26.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:17:26.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:17:26.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:17:26.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T18:17:26.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:17:26.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:17:26.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:17:26.442 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:17:26.512 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:17:01
2026-06-03T18:17:26.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86715, datetime.datetime(2026, 6, 3, 18, 17, 1), datetime.datetime(2026, 6, 3, 18, 17), 'salt', 4.96, 100.02, None, 38.49, 144.35, 0.0, 820.62, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:17:26.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:17:26.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:17:26.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:17:00, diff=26.520147s, valid=True
2026-06-03T18:17:26.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:17:26.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:17:26.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:17:12, diff=14.523616s, valid=True
2026-06-03T18:17:26.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:17:26.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:17:26.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:16:59, diff=27.531805s, valid=True
2026-06-03T18:17:26.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:17:26.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:17:26.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:17:26.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:17:26.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:17:26.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T18:17:26.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:17:12, diff=14.535539s, valid=True
2026-06-03T18:17:26.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:17:26.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:17:26.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:17:26.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77643.536374s, valid=False
2026-06-03T18:17:26.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:17:26.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:17:26.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:17:26.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:17:26.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:17:26.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:17:26.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:17:26.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:17:26.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:17:26.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:17:26.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:17:26.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:17:26.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:17:26.931 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:17:27.138 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:17:27.478 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:17:27.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:17:27.583 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:17:27.583 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:17:27.786 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:17:27.786 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:17:57.816 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:17:57.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:17:57.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:17:58.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:17:58.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:17:58.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:17:58.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:17:58.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:17:58.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:17:58.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:17:58.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:17:58.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:17:58.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:18:01.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:18:01.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:18:01.532 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:18:01.533 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:18:01.543 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:18:01.556 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:18:01.557 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:18:01.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:18:01.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:18:01.558 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:18:01.558 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:18:01.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:18:01.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:18:01.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:18:01.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:18:01.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:18:01.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:18:01.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:18:01.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:18:01.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:18:01.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:18:01.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:18:01.888 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:18:01.959 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:18:01
2026-06-03T18:18:01.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86717, datetime.datetime(2026, 6, 3, 18, 18, 1), datetime.datetime(2026, 6, 3, 18, 18, 1), 'salt', 4.96, 100.02, None, 46.04, 133.06, 0.0, 820.74, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T18:18:01.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:18:01.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:18:01.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:18:01, diff=0.966556s, valid=True
2026-06-03T18:18:01.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:18:01.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:18:01.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:17:12, diff=49.970026s, valid=True
2026-06-03T18:18:01.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:18:01.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:18:01.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:17:53, diff=8.977851s, valid=True
2026-06-03T18:18:01.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:18:01.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:18:01.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:18:01.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:18:01.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:18:01.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:18:01.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:17:12, diff=49.981465s, valid=True
2026-06-03T18:18:01.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:18:01.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:18:01.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:18:01.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77678.982252s, valid=False
2026-06-03T18:18:01.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:18:01.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:18:01.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:18:01.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:18:01.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:18:02.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:18:02.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:18:02.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:18:02.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:18:02.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:18:02.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:18:02.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:18:02.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:18:02.303 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:18:02.509 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:18:02.847 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:18:02.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:18:02.951 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:18:02.951 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:18:03.175 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:18:03.175 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:18:33.182 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:18:33.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:18:33.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:18:33.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:18:33.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:18:34.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:18:34.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:18:34.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:18:34.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:18:34.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:18:34.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:18:34.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:18:34.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:18:37.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:18:37.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:18:37.225 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:18:37.226 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:18:37.236 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:18:37.249 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:18:37.250 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:18:37.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:18:37.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:18:37.251 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:18:37.251 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:18:37.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:18:37.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:18:37.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:18:37.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:18:37.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:18:37.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:18:37.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:18:37.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:18:37.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:18:37.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:18:37.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:18:37.578 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:18:37.646 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:18:32
2026-06-03T18:18:37.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86718, datetime.datetime(2026, 6, 3, 18, 18, 32), datetime.datetime(2026, 6, 3, 18, 18, 31), 'salt', 5.02, 100.09, None, 41.63, 130.94, -0.02, 820.56, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:18:37.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:18:37.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:18:37.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:18:31, diff=6.652422s, valid=True
2026-06-03T18:18:37.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:18:37.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:18:37.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:17:12, diff=85.655264s, valid=True
2026-06-03T18:18:37.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:18:37.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:18:37.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:18:24, diff=13.661927s, valid=True
2026-06-03T18:18:37.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:18:37.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:18:37.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:18:37.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:18:37.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:18:37.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:18:37.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:17:12, diff=85.664994s, valid=True
2026-06-03T18:18:37.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:18:37.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:18:37.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:18:37.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77714.665651s, valid=False
2026-06-03T18:18:37.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:18:37.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:18:37.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:18:37.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:18:37.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:18:37.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:18:37.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:18:37.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:18:37.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:18:37.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:18:37.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:18:37.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:18:38.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:18:38.064 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:18:38.269 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:18:38.611 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:18:38.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:18:38.714 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:18:38.714 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:18:38.868 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:18:38.868 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:19:08.888 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:19:08.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:19:08.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:19:09.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:19:09.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:19:09.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:19:09.814 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:19:09.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:19:09.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:19:09.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:19:09.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:19:09.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:19:09.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:19:12.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:19:12.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:19:12.784 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:19:12.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:19:12.794 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:19:12.807 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:19:12.807 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:19:12.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:19:12.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:19:12.808 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:19:12.808 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:19:12.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:19:12.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:19:12.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:19:13.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:19:13.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:19:13.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T18:19:13.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:19:13.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T18:19:13.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:19:13.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:19:13.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:19:13.143 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:19:13.213 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:19:02
2026-06-03T18:19:13.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86719, datetime.datetime(2026, 6, 3, 18, 19, 2), datetime.datetime(2026, 6, 3, 18, 19, 1), 'salt', 4.96, 100.06, None, 36.02, 128.34, -0.01, 820.56, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:19:13.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:19:13.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:19:13.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:19:01, diff=12.219516s, valid=True
2026-06-03T18:19:13.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:19:13.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T18:19:13.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:17:12, diff=121.222353s, valid=True
2026-06-03T18:19:13.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:19:13.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:19:13.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:18:55, diff=18.229089s, valid=True
2026-06-03T18:19:13.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:19:13.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:19:13.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:19:13.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:19:13.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:19:13.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T18:19:13.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:17:12, diff=121.232092s, valid=True
2026-06-03T18:19:13.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:19:13.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:19:13.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:19:13.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77750.232746s, valid=False
2026-06-03T18:19:13.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:19:13.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:19:13.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:19:13.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:19:13.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:19:13.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:19:13.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:19:13.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:19:13.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:19:13.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:19:14.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:19:14.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:19:14.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:19:14.518 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:19:14.747 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:19:15.090 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:19:15.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:19:15.193 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:19:15.193 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:19:15.407 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:19:15.407 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:19:45.435 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:19:45.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:19:45.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:19:45.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:19:45.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:19:45.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:19:45.849 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:19:45.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:19:45.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:19:45.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:19:45.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:19:45.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:19:45.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:19:49.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:19:49.381 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:19:49.382 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:19:49.382 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:19:49.393 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:19:49.405 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:19:49.405 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:19:49.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:19:49.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:19:49.407 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:19:49.407 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:19:49.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:19:49.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:19:49.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:19:49.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:19:49.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:19:49.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T18:19:49.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:19:49.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T18:19:49.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:19:49.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:19:49.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:19:49.752 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:19:49.829 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:19:32
2026-06-03T18:19:49.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86720, datetime.datetime(2026, 6, 3, 18, 19, 32), datetime.datetime(2026, 6, 3, 18, 19, 31), 'salt', 4.92, 100.06, None, 50.1, 138.51, -0.02, 820.44, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T18:19:49.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:19:49.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:19:49.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:19:31, diff=18.835524s, valid=True
2026-06-03T18:19:49.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:19:49.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T18:19:49.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:17:12, diff=157.838773s, valid=True
2026-06-03T18:19:49.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:19:49.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:19:49.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:19:26, diff=23.845881s, valid=True
2026-06-03T18:19:49.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:19:49.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:19:49.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:19:49.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:19:49.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:19:49.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T18:19:49.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:17:12, diff=157.849268s, valid=True
2026-06-03T18:19:49.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:19:49.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:19:49.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:19:49.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77786.850021s, valid=False
2026-06-03T18:19:49.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:19:49.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:19:49.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:19:49.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:19:49.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:19:49.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:19:49.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:19:49.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:19:50.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:19:50.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:19:50.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:19:50.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:19:50.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:19:50.250 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:19:50.457 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:19:50.801 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:19:50.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:19:50.904 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:19:50.904 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:19:51.059 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:19:51.059 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:20:21.065 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:20:21.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:20:21.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:20:21.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:20:21.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:20:21.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:20:21.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:20:21.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:20:21.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:20:21.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:20:21.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:20:21.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:20:21.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:20:25.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:20:25.113 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:20:25.113 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:20:25.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:20:25.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:20:25.138 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:20:25.138 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:20:25.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:20:25.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:20:25.140 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:20:25.140 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:20:25.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:20:25.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:20:25.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:20:25.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:20:25.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:20:25.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T18:20:25.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:20:25.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T18:20:25.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:20:25.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:20:25.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:20:25.490 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:20:25.561 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:20:02
2026-06-03T18:20:25.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86721, datetime.datetime(2026, 6, 3, 18, 20, 2), datetime.datetime(2026, 6, 3, 18, 20, 2), 'salt', 4.86, 100.03, None, 43.54, 144.68, -0.01, 820.5, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:20:25.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:20:25.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:20:25.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:20:02, diff=23.568901s, valid=True
2026-06-03T18:20:25.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:20:25.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T18:20:25.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:17:12, diff=193.572359s, valid=True
2026-06-03T18:20:25.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:20:25.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:20:25.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:19:58, diff=27.580555s, valid=True
2026-06-03T18:20:25.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:20:25.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:20:25.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:20:25.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:20:25.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:20:25.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T18:20:25.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:17:12, diff=193.584264s, valid=True
2026-06-03T18:20:25.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:20:25.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:20:25.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:20:25.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77822.58507s, valid=False
2026-06-03T18:20:25.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:20:25.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:20:25.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:20:25.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:20:25.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:20:25.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:20:25.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:20:25.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:20:25.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:20:25.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:20:25.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:20:25.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:20:25.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:20:25.906 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:20:26.112 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:20:26.453 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:20:26.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:20:26.557 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:20:26.557 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:20:26.830 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:20:26.830 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:20:56.860 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:20:56.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:20:56.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:20:57.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:20:57.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:20:57.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:20:57.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:20:57.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:20:57.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:20:57.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:20:57.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:20:57.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:20:57.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:21:00.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:21:00.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:21:00.846 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:21:00.847 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:21:00.854 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:21:00.866 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:21:00.866 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:21:00.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:21:00.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:21:00.866 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:21:00.867 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:21:00.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:21:00.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:21:00.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:21:01.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T18:21:01.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:21:01.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:21:01.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:21:01.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:21:01.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:21:01.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:21:01.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:21:01.162 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:21:01.234 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:20:33
2026-06-03T18:21:01.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86722, datetime.datetime(2026, 6, 3, 18, 20, 33), datetime.datetime(2026, 6, 3, 18, 20, 32), 'salt', 4.99, 100.16, None, 43.96, 138.88, -0.03, 820.62, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:21:01.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:21:01.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:21:01.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:20:32, diff=29.241662s, valid=True
2026-06-03T18:21:01.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:21:01.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:21:01.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:17:12, diff=229.245023s, valid=True
2026-06-03T18:21:01.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:21:01.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T18:21:01.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:20:29, diff=32.252857s, valid=True
2026-06-03T18:21:01.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:21:01.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:21:01.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:21:01.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:21:01.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:21:01.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:21:01.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:17:12, diff=229.256556s, valid=True
2026-06-03T18:21:01.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:21:01.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:21:01.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:21:01.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77858.257498s, valid=False
2026-06-03T18:21:01.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:21:01.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:21:01.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:21:01.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:21:01.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:21:01.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:21:01.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:21:01.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:21:01.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:21:01.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:21:01.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:21:01.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:21:01.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:21:01.581 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:21:01.819 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:21:02.164 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:21:02.267 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:21:02.267 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:21:02.267 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:21:02.454 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:21:02.455 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:21:32.459 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:21:32.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:21:32.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:21:32.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:21:32.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:21:32.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:21:32.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:21:32.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:21:32.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:21:32.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:21:32.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:21:32.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:21:32.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:21:35.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:21:35.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:21:35.821 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:21:35.822 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:21:35.831 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:21:35.844 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:21:35.844 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:21:35.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:21:35.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:21:35.845 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:21:35.846 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:21:35.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:21:35.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:21:35.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:21:36.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:21:36.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:21:36.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:21:36.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:21:36.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:21:36.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:21:36.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:21:36.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:21:36.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:21:36.258 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:21:33
2026-06-03T18:21:36.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86724, datetime.datetime(2026, 6, 3, 18, 21, 33), datetime.datetime(2026, 6, 3, 18, 21, 32), 'salt', 4.96, 100.03, None, 38.53, 134.68, -0.01, 820.87, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:21:36.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:21:36.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:21:36.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:21:32, diff=4.265912s, valid=True
2026-06-03T18:21:36.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:21:36.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:21:36.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:17:12, diff=264.269372s, valid=True
2026-06-03T18:21:36.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:21:36.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:21:36.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:21:32, diff=4.277452s, valid=True
2026-06-03T18:21:36.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:21:36.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:21:36.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:21:36.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:21:36.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:21:36.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:21:36.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:17:12, diff=264.281149s, valid=True
2026-06-03T18:21:36.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:21:36.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:21:36.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:21:36.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77893.281955s, valid=False
2026-06-03T18:21:36.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:21:36.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:21:36.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:21:36.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:21:36.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:21:36.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:21:36.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:21:36.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:21:36.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:21:36.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:21:36.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:21:36.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:21:36.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:21:36.601 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:21:36.865 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:21:37.203 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:21:37.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:21:37.307 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:21:37.307 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:21:37.487 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:21:37.487 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:22:07.500 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:22:07.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:22:07.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:22:07.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:22:07.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:22:08.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:22:08.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:22:08.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:22:08.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:22:08.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:22:08.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:22:08.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:22:08.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:22:11.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:22:11.811 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:22:11.812 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:22:11.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:22:11.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:22:11.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:22:11.836 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:22:11.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:22:11.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:22:11.837 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:22:11.837 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:22:11.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:22:11.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:22:11.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:22:12.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:22:12.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:22:12.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:22:12.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:22:12.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:22:12.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:22:12.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:22:12.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:22:12.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:22:12.263 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:22:03
2026-06-03T18:22:12.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86725, datetime.datetime(2026, 6, 3, 18, 22, 3), datetime.datetime(2026, 6, 3, 18, 22, 2), 'salt', 4.99, 100.09, None, 37.05, 133.95, -0.02, 820.69, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:22:12.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:22:12.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:22:12.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:22:02, diff=10.270637s, valid=True
2026-06-03T18:22:12.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:22:12.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:22:12.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:17:12, diff=300.274185s, valid=True
2026-06-03T18:22:12.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:22:12.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:22:12.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:21:56, diff=16.282526s, valid=True
2026-06-03T18:22:12.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:22:12.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:22:12.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:22:12.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:22:12.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:22:12.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:22:12.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:17:12, diff=300.286309s, valid=True
2026-06-03T18:22:12.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:22:12.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:22:12.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:22:12.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77929.287161s, valid=False
2026-06-03T18:22:12.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:22:12.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:22:12.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:22:12.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:22:12.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:22:12.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:22:12.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:22:12.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:22:12.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:22:12.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:22:12.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:22:12.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:22:12.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:22:12.607 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:22:12.813 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:22:13.155 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:22:13.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:22:13.258 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:22:13.258 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:22:13.443 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:22:13.443 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:22:43.471 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:22:43.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:22:43.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:22:43.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:22:43.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:22:43.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:22:43.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:22:43.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:22:43.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:22:43.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:22:43.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:22:43.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:22:43.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:22:46.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:22:46.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:22:46.841 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:22:46.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:22:46.851 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:22:46.864 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:22:46.864 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:22:46.865 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:22:46.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:22:46.866 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:22:46.866 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:22:46.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:22:47.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:22:47.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:22:47.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:22:47.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:22:47.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:22:47.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:22:47.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:22:47.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:22:47.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:22:47.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:22:47.208 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:22:47.284 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:22:34
2026-06-03T18:22:47.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86726, datetime.datetime(2026, 6, 3, 18, 22, 34), datetime.datetime(2026, 6, 3, 18, 22, 33), 'salt', 4.99, 100.06, None, 30.24, 134.89, -0.01, 820.81, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:22:47.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:22:47.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:22:47.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:22:33, diff=14.291517s, valid=True
2026-06-03T18:22:47.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:22:47.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:22:47.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:23:12, diff=-24.70502s, valid=True
2026-06-03T18:22:47.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:22:47.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:22:47.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:22:26, diff=21.303078s, valid=True
2026-06-03T18:22:47.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:22:47.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:22:47.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:22:47.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:22:47.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:22:47.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:22:47.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:23:12, diff=-24.693179s, valid=True
2026-06-03T18:22:47.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:22:47.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:22:47.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:22:47.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77964.307666s, valid=False
2026-06-03T18:22:47.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:22:47.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:22:47.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:22:47.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:22:47.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:22:47.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:22:47.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:22:47.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:22:47.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:22:47.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:22:47.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:22:47.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:22:47.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:22:47.702 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:22:47.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:22:48.253 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:22:48.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:22:48.355 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:22:48.355 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:22:48.545 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:22:48.546 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:23:18.551 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:23:18.552 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:23:18.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:23:18.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:23:18.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:23:18.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:23:18.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:23:18.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:23:18.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:23:18.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:23:18.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:23:19.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:23:19.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:23:21.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:23:21.939 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:23:21.939 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:23:21.939 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:23:21.948 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:23:21.959 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:23:21.959 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:23:21.960 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:23:21.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:23:21.960 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:23:21.960 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:23:21.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:23:22.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:23:22.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:23:22.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:23:22.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:23:22.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:23:22.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:23:22.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:23:22.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:23:22.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:23:22.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:23:22.295 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:23:22.371 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:23:04
2026-06-03T18:23:22.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86727, datetime.datetime(2026, 6, 3, 18, 23, 4), datetime.datetime(2026, 6, 3, 18, 23, 3), 'salt', 4.96, 100.03, None, 36.66, 130.17, -0.01, 820.75, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:23:22.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:23:22.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:23:22.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:23:03, diff=19.37908s, valid=True
2026-06-03T18:23:22.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:23:22.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:23:22.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:23:12, diff=10.382566s, valid=True
2026-06-03T18:23:22.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:23:22.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:23:22.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:22:56, diff=26.390801s, valid=True
2026-06-03T18:23:22.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:23:22.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:23:22.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:23:22.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:23:22.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:23:22.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:23:22.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:23:12, diff=10.394517s, valid=True
2026-06-03T18:23:22.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:23:22.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:23:22.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:23:22.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=77999.395336s, valid=False
2026-06-03T18:23:22.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:23:22.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:23:22.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:23:22.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:23:22.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:23:22.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:23:22.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:23:22.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:23:22.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:23:22.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:23:22.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:23:22.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:23:22.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:23:22.716 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:23:22.921 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:23:23.260 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:23:23.363 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:23:23.363 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:23:23.363 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:23:23.552 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:23:23.552 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:23:53.553 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:23:53.553 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:23:53.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:23:53.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:23:53.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:23:53.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:23:53.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:23:53.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:23:53.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:23:53.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:23:53.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:23:53.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:23:53.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:23:57.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:23:57.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:23:57.274 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:23:57.274 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:23:57.284 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:23:57.297 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:23:57.297 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:23:57.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:23:57.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:23:57.298 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:23:57.299 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:23:57.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:23:57.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:23:57.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:23:57.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:23:57.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:23:57.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:23:57.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:23:57.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:23:57.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:23:57.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:23:57.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:23:57.633 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:23:57.704 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:23:34
2026-06-03T18:23:57.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86728, datetime.datetime(2026, 6, 3, 18, 23, 34), datetime.datetime(2026, 6, 3, 18, 23, 33), 'salt', 4.92, 100.06, None, 38.11, 134.16, -0.02, 820.75, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:23:57.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:23:57.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:23:57.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:23:33, diff=24.711953s, valid=True
2026-06-03T18:23:57.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:23:57.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:23:57.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:24:12, diff=-14.284594s, valid=True
2026-06-03T18:23:57.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:23:57.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:23:57.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:23:27, diff=30.723627s, valid=True
2026-06-03T18:23:57.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:23:57.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:23:57.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:23:57.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:23:57.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:23:57.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:23:57.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:24:12, diff=-14.272652s, valid=True
2026-06-03T18:23:57.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:23:57.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:23:57.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:23:57.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78034.7282s, valid=False
2026-06-03T18:23:57.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:23:57.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:23:57.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:23:57.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:23:57.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:23:57.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:23:57.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:23:57.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:23:57.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:23:57.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:23:57.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:23:58.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:23:58.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:23:58.122 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:23:58.330 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:23:58.673 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:23:58.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:23:58.777 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:23:58.777 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:24:01.477 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:24:01.478 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:24:31.508 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:24:31.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:24:31.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:24:31.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:24:31.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:24:31.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:24:31.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:24:31.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:24:31.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:24:31.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:24:31.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:24:31.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:24:31.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:24:34.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:24:34.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:24:34.845 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:24:34.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:24:34.855 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:24:34.868 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:24:34.868 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:24:34.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:24:34.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:24:34.869 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:24:34.869 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:24:34.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:24:35.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:24:35.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:24:35.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:24:35.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:24:35.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:24:35.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:24:35.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:24:35.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:24:35.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:24:35.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:24:35.223 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:24:35.294 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:24:35
2026-06-03T18:24:35.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86730, datetime.datetime(2026, 6, 3, 18, 24, 35), datetime.datetime(2026, 6, 3, 18, 24, 34), 'salt', 5.06, 100.09, None, 43.96, 132.1, -0.02, 820.81, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:24:35.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:24:35.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:24:35.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:24:34, diff=1.302223s, valid=True
2026-06-03T18:24:35.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:24:35.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:24:35.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:25:12, diff=-36.69431s, valid=True
2026-06-03T18:24:35.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:24:35.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:24:35.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:24:30, diff=5.313748s, valid=True
2026-06-03T18:24:35.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:24:35.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:24:35.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:24:35.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:24:35.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:24:35.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:24:35.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:25:12, diff=-36.682516s, valid=True
2026-06-03T18:24:35.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:24:35.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:24:35.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:24:35.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78072.318294s, valid=False
2026-06-03T18:24:35.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:24:35.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:24:35.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:24:35.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:24:35.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:24:35.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:24:35.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:24:35.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:24:35.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:24:35.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:24:35.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:24:35.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:24:35.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:24:35.637 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:24:35.858 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:24:36.197 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:24:36.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:24:36.299 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:24:36.299 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:24:36.526 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:24:36.526 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:25:06.554 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:25:06.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:25:06.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:25:06.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:25:06.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:25:07.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:25:07.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:25:07.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:25:07.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:25:07.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:25:07.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:25:07.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:25:07.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:25:10.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:25:10.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:25:10.253 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:25:10.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:25:10.264 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:25:10.277 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:25:10.277 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:25:10.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:25:10.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:25:10.278 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:25:10.279 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:25:10.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:25:10.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:25:10.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:25:10.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:25:10.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:25:10.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:25:10.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:25:10.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:25:10.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:25:10.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:25:10.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:25:10.612 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:25:10.683 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:25:05
2026-06-03T18:25:10.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86731, datetime.datetime(2026, 6, 3, 18, 25, 5), datetime.datetime(2026, 6, 3, 18, 25, 4), 'salt', 4.99, 100.13, None, 43.68, 125.1, -0.02, 820.63, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:25:10.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:25:10.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:25:10.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:25:04, diff=6.690799s, valid=True
2026-06-03T18:25:10.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:25:10.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:25:10.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:25:12, diff=-1.305752s, valid=True
2026-06-03T18:25:10.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:25:10.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:25:10.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:25:02, diff=8.702459s, valid=True
2026-06-03T18:25:10.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:25:10.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:25:10.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:25:10.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:25:10.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:25:10.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:25:10.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:25:12, diff=-1.293839s, valid=True
2026-06-03T18:25:10.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:25:10.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:25:10.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:25:10.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78107.706978s, valid=False
2026-06-03T18:25:10.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:25:10.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:25:10.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:25:10.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:25:10.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:25:10.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:25:10.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:25:10.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:25:10.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:25:10.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:25:10.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:25:11.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:25:11.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:25:11.097 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:25:11.305 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:25:11.645 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:25:11.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:25:11.749 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:25:11.749 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:25:12.013 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:25:12.014 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:25:42.035 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:25:42.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:25:42.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:25:42.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:25:42.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:25:42.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:25:42.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:25:42.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:25:42.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:25:42.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:25:42.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:25:42.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:25:42.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:25:45.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:25:45.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:25:45.614 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:25:45.614 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:25:45.625 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:25:45.638 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:25:45.638 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:25:45.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:25:45.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:25:45.640 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:25:45.640 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:25:45.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:25:45.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:25:45.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:25:45.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:25:45.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:25:45.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:25:45.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:25:45.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:25:45.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:25:45.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:25:45.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:25:45.968 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:25:46.036 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:25:35
2026-06-03T18:25:46.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86732, datetime.datetime(2026, 6, 3, 18, 25, 35), datetime.datetime(2026, 6, 3, 18, 25, 34), 'salt', 4.89, 100.06, None, 44.0, 131.13, -0.01, 820.63, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:25:46.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:25:46.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:25:46.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:25:34, diff=12.042472s, valid=True
2026-06-03T18:25:46.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:25:46.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:25:46.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:26:12, diff=-25.954617s, valid=True
2026-06-03T18:25:46.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:25:46.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:25:46.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:25:33, diff=13.052023s, valid=True
2026-06-03T18:25:46.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:25:46.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:25:46.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:25:46.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:25:46.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:25:46.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:25:46.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:26:12, diff=-25.944939s, valid=True
2026-06-03T18:25:46.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:25:46.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:25:46.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:25:46.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78143.055725s, valid=False
2026-06-03T18:25:46.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:25:46.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:25:46.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:25:46.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:25:46.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:25:46.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:25:46.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:25:46.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:25:46.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:25:46.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:25:46.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:25:46.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:25:46.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:25:46.508 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:25:46.718 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:25:47.061 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:25:47.165 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:25:47.165 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:25:47.165 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:25:47.348 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:25:47.348 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:26:17.377 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:26:17.378 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:26:17.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:26:17.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:26:17.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:26:17.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:26:17.849 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:26:17.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:26:17.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:26:17.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:26:17.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:26:17.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:26:17.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:26:20.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:26:20.807 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:26:20.808 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:26:20.808 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:26:20.819 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:26:20.832 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:26:20.833 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:26:20.833 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:26:20.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:26:20.834 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:26:20.834 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:26:20.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:26:20.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:26:20.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:26:21.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:26:21.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:26:21.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:26:21.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:26:21.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:26:21.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:26:21.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:26:21.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:26:21.169 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:26:21.243 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:26:05
2026-06-03T18:26:21.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86733, datetime.datetime(2026, 6, 3, 18, 26, 5), datetime.datetime(2026, 6, 3, 18, 26, 5), 'salt', 4.96, 100.13, None, 40.36, 143.04, -0.02, 820.57, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:26:21.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:26:21.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:26:21.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:26:05, diff=16.256046s, valid=True
2026-06-03T18:26:21.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:26:21.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:26:21.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:26:12, diff=9.261979s, valid=True
2026-06-03T18:26:21.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:26:21.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:26:21.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:26:04, diff=17.270893s, valid=True
2026-06-03T18:26:21.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:26:21.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:26:21.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:26:21.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:26:21.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:26:21.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:26:21.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:26:12, diff=9.273957s, valid=True
2026-06-03T18:26:21.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:26:21.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:26:21.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:26:21.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78178.274607s, valid=False
2026-06-03T18:26:21.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:26:21.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:26:21.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:26:21.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:26:21.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:26:21.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:26:21.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:26:21.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:26:21.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:26:21.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:26:21.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:26:21.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:26:21.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:26:21.589 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:26:21.797 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:26:22.140 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:26:22.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:26:22.243 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:26:22.243 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:26:22.431 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:26:22.431 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:26:52.441 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:26:52.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:26:52.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:26:52.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:26:52.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:26:52.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:26:52.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:26:52.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:26:52.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:26:52.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:26:52.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:26:52.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:26:52.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:26:55.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:26:55.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:26:55.817 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:26:55.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:26:55.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:26:55.837 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:26:55.837 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:26:55.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:26:55.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:26:55.837 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:26:55.837 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:26:55.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:26:55.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:26:55.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:26:56.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:26:56.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:26:56.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:26:56.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:26:56.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:26:56.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:26:56.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:26:56.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:26:56.186 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:26:56.259 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:26:36
2026-06-03T18:26:56.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86734, datetime.datetime(2026, 6, 3, 18, 26, 36), datetime.datetime(2026, 6, 3, 18, 26, 35), 'salt', 4.86, 100.09, None, 38.11, 134.61, -0.02, 820.75, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:26:56.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:26:56.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:26:56.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:26:35, diff=21.266989s, valid=True
2026-06-03T18:26:56.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:26:56.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:26:56.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:27:12, diff=-15.72953s, valid=True
2026-06-03T18:26:56.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:26:56.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:26:56.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:26:28, diff=28.278739s, valid=True
2026-06-03T18:26:56.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:26:56.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:26:56.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:26:56.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:26:56.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:26:56.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:26:56.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:27:12, diff=-15.717433s, valid=True
2026-06-03T18:26:56.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:26:56.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:26:56.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:26:56.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78213.283399s, valid=False
2026-06-03T18:26:56.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:26:56.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:26:56.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:26:56.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:26:56.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:26:56.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:26:56.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:26:56.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:26:56.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:26:56.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:26:56.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:26:56.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:26:56.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:26:56.605 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:26:56.869 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:26:57.208 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:26:57.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:26:57.312 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:26:57.312 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:26:57.520 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:26:57.520 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:27:27.550 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:27:27.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:27:27.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:27:27.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:27:27.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:27:28.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:27:28.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:27:28.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:27:28.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:27:28.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:27:28.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:27:28.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:27:28.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:27:31.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:27:31.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:27:31.105 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:27:31.106 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:27:31.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:27:31.128 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:27:31.129 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:27:31.129 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:27:31.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:27:31.130 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:27:31.130 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:27:31.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:27:31.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:27:31.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:27:31.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:27:31.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:27:31.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:27:31.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:27:31.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:27:31.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:27:31.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:27:31.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:27:31.419 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:27:31.490 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:27:06
2026-06-03T18:27:31.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86735, datetime.datetime(2026, 6, 3, 18, 27, 6), datetime.datetime(2026, 6, 3, 18, 27, 5), 'salt', 4.86, 100.09, None, 41.25, 135.06, -0.02, 820.69, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:27:31.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:27:31.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:27:31.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:27:05, diff=26.497652s, valid=True
2026-06-03T18:27:31.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:27:31.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:27:31.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:27:12, diff=19.500919s, valid=True
2026-06-03T18:27:31.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:27:31.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:27:31.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:26:58, diff=33.508521s, valid=True
2026-06-03T18:27:31.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:27:31.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:27:31.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:27:31.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:27:31.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:27:31.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:27:31.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:27:12, diff=19.511968s, valid=True
2026-06-03T18:27:31.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:27:31.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:27:31.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:27:31.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78248.512723s, valid=False
2026-06-03T18:27:31.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:27:31.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:27:31.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:27:31.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:27:31.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:27:31.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:27:31.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:27:31.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:27:31.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:27:31.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:27:31.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:27:31.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:27:31.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:27:31.834 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:27:32.042 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:27:32.385 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:27:32.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:27:32.489 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:27:32.489 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:27:32.748 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:27:32.749 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:28:02.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:28:02.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:28:02.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:28:03.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:28:03.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:28:03.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:28:03.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:28:03.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:28:03.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:28:03.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:28:03.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:28:03.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:28:03.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:28:06.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:28:06.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:28:06.392 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:28:06.393 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:28:06.402 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:28:06.415 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:28:06.415 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:28:06.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:28:06.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:28:06.417 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:28:06.417 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:28:06.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:28:06.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:28:06.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:28:06.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:28:06.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:28:06.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:28:06.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:28:06.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:28:06.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:28:06.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:28:06.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:28:06.763 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:28:06.844 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:28:06
2026-06-03T18:28:06.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86737, datetime.datetime(2026, 6, 3, 18, 28, 6), datetime.datetime(2026, 6, 3, 18, 28, 6), 'salt', 4.83, 100.09, None, 39.45, 136.37, -0.01, 820.63, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:28:06.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:28:06.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:28:06.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:28:06, diff=0.850988s, valid=True
2026-06-03T18:28:06.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:28:06.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:28:06.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:28:12, diff=-5.145874s, valid=True
2026-06-03T18:28:06.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:28:06.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:28:06.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:28:00, diff=6.86148s, valid=True
2026-06-03T18:28:06.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:28:06.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:28:06.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:28:06.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:28:06.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:28:06.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:28:06.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:28:12, diff=-5.135133s, valid=True
2026-06-03T18:28:06.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:28:06.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:28:06.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:28:06.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78283.865594s, valid=False
2026-06-03T18:28:06.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:28:06.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:28:06.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:28:06.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:28:06.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:28:06.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:28:06.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:28:06.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:28:06.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:28:07.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:28:07.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:28:07.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:28:07.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:28:07.258 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:28:07.462 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:28:07.802 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:28:07.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:28:07.905 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:28:07.905 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:28:08.141 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:28:08.141 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:28:38.166 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:28:38.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:28:38.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:28:38.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:28:38.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:28:38.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:28:38.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:28:38.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:28:38.587 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:28:38.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:28:38.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:28:38.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:28:38.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:28:41.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:28:41.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:28:41.505 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:28:41.506 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:28:41.514 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:28:41.527 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:28:41.528 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:28:41.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:28:41.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:28:41.529 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:28:41.529 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:28:41.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:28:41.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:28:41.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:28:41.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:28:41.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:28:41.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:28:41.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:28:41.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:28:41.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:28:41.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:28:41.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:28:41.858 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:28:41.927 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:28:37
2026-06-03T18:28:41.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86738, datetime.datetime(2026, 6, 3, 18, 28, 37), datetime.datetime(2026, 6, 3, 18, 28, 36), 'salt', 4.89, 100.13, None, 31.76, 135.15, -0.02, 820.75, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:28:41.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:28:41.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:28:41.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:28:36, diff=5.934308s, valid=True
2026-06-03T18:28:41.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:28:41.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:28:41.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:29:12, diff=-30.062212s, valid=True
2026-06-03T18:28:41.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:28:41.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:28:41.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:28:32, diff=9.94612s, valid=True
2026-06-03T18:28:41.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:28:41.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:28:41.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:28:41.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:28:41.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:28:41.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:28:41.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:29:12, diff=-30.050156s, valid=True
2026-06-03T18:28:41.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:28:41.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:28:41.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:28:41.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78318.950654s, valid=False
2026-06-03T18:28:41.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:28:41.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:28:41.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:28:41.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:28:41.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:28:42.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:28:42.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:28:42.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:28:42.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:28:42.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:28:42.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:28:42.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:28:42.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:28:42.272 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:28:42.479 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:28:42.820 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:28:42.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:28:42.924 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:28:42.924 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:28:43.143 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:28:43.143 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:29:13.173 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:29:13.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:29:13.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:29:13.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:29:13.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:29:13.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:29:13.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:29:13.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:29:13.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:29:13.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:29:13.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:29:13.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:29:13.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:29:16.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:29:16.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:29:16.879 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:29:16.879 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:29:16.889 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:29:16.901 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:29:16.902 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:29:16.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:29:16.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:29:16.903 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:29:16.903 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:29:16.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:29:17.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:29:17.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:29:17.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:29:17.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:29:17.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:29:17.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:29:17.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:29:17.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:29:17.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:29:17.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:29:17.244 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:29:17.315 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:29:07
2026-06-03T18:29:17.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86739, datetime.datetime(2026, 6, 3, 18, 29, 7), datetime.datetime(2026, 6, 3, 18, 29, 6), 'salt', 4.99, 100.13, None, 41.46, 135.74, -0.02, 820.81, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:29:17.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:29:17.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:29:17.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:29:06, diff=11.323159s, valid=True
2026-06-03T18:29:17.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:29:17.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:29:17.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:29:12, diff=5.326663s, valid=True
2026-06-03T18:29:17.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:29:17.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:29:17.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:29:03, diff=14.334856s, valid=True
2026-06-03T18:29:17.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:29:17.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:29:17.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:29:17.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:29:17.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:29:17.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:29:17.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:29:12, diff=5.33852s, valid=True
2026-06-03T18:29:17.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:29:17.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:29:17.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:29:17.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78354.339336s, valid=False
2026-06-03T18:29:17.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:29:17.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:29:17.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:29:17.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:29:17.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:29:17.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:29:17.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:29:17.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:29:17.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:29:17.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:29:17.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:29:17.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:29:17.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:29:17.731 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:29:17.935 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:29:18.278 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:29:18.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:29:18.384 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:29:18.385 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:29:18.472 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:29:18.473 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:29:48.493 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:29:48.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:29:48.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:29:48.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:29:48.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:29:48.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:29:48.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:29:48.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:29:48.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:29:48.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:29:48.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:29:48.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:29:48.882 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:29:51.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:29:51.778 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:29:51.779 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:29:51.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:29:51.788 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:29:51.801 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:29:51.801 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:29:51.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:29:51.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:29:51.802 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:29:51.803 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:29:51.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:29:51.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:29:51.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:29:52.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:29:52.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:29:52.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:29:52.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:29:52.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:29:52.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:29:52.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:29:52.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:29:52.136 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:29:52.239 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:29:37
2026-06-03T18:29:52.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86740, datetime.datetime(2026, 6, 3, 18, 29, 37), datetime.datetime(2026, 6, 3, 18, 29, 36), 'salt', 4.99, 100.09, None, 37.33, 135.36, -0.02, 820.94, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:29:52.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:29:52.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:29:52.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:29:36, diff=16.247214s, valid=True
2026-06-03T18:29:52.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:29:52.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:29:52.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:30:12, diff=-19.749068s, valid=True
2026-06-03T18:29:52.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:29:52.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:29:52.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:29:35, diff=17.259379s, valid=True
2026-06-03T18:29:52.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:29:52.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:29:52.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:29:52.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:29:52.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:29:52.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:29:52.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:30:12, diff=-19.736881s, valid=True
2026-06-03T18:29:52.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:29:52.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:29:52.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:29:52.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78389.263927s, valid=False
2026-06-03T18:29:52.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:29:52.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:29:52.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:29:52.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:29:52.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:29:52.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:29:52.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:29:52.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:29:52.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:29:52.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:29:52.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:29:52.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:29:52.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:29:52.585 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:29:52.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:29:53.130 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:29:53.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:29:53.232 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:29:53.232 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:29:53.443 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:29:53.443 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:30:23.455 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:30:23.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:30:23.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:30:23.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:30:23.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:30:23.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:30:23.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:30:23.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:30:23.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:30:23.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:30:23.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:30:23.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:30:23.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:30:27.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:30:27.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:30:27.754 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:30:27.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:30:27.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:30:27.777 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:30:27.778 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:30:27.778 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:30:27.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:30:27.779 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:30:27.779 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:30:27.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:30:27.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:30:27.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:30:28.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:30:28.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:30:28.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:30:28.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:30:28.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:30:28.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:30:28.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:30:28.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:30:28.114 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:30:28.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:30:07
2026-06-03T18:30:28.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86741, datetime.datetime(2026, 6, 3, 18, 30, 7), datetime.datetime(2026, 6, 3, 18, 30, 7), 'salt', 4.89, 100.06, None, 45.09, 139.66, -0.02, 820.75, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T18:30:28.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:30:28.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:30:28.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:30:07, diff=21.195606s, valid=True
2026-06-03T18:30:28.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:30:28.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:30:28.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:30:12, diff=16.199141s, valid=True
2026-06-03T18:30:28.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:30:28.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:30:28.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:30:06, diff=22.207314s, valid=True
2026-06-03T18:30:28.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:30:28.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:30:28.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:30:28.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:30:28.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:30:28.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:30:28.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:30:12, diff=16.211003s, valid=True
2026-06-03T18:30:28.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:30:28.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:30:28.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:30:28.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78425.211805s, valid=False
2026-06-03T18:30:28.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:30:28.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:30:28.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:30:28.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:30:28.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:30:28.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:30:28.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:30:28.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:30:28.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:30:28.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:30:28.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:30:28.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:30:28.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:30:28.600 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:30:28.809 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:30:29.151 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:30:29.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:30:29.254 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:30:29.254 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:30:29.439 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:30:29.439 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:30:59.470 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:30:59.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:30:59.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:30:59.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:30:59.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:31:00.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:31:00.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:31:00.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:31:00.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:31:00.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:31:00.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:31:00.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:31:00.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:31:03.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:31:03.282 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:31:03.283 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:31:03.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:31:03.294 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:31:03.307 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:31:03.308 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:31:03.308 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:31:03.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:31:03.309 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:31:03.309 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:31:03.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:31:03.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:31:03.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:31:03.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:31:03.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:31:03.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:31:03.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:31:03.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:31:03.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:31:03.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:31:03.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:31:03.643 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:31:03.715 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:30:38
2026-06-03T18:31:03.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86742, datetime.datetime(2026, 6, 3, 18, 30, 38), datetime.datetime(2026, 6, 3, 18, 30, 37), 'salt', 4.73, 100.03, None, 42.2, 129.1, 0.0, 820.69, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:31:03.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:31:03.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:31:03.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:30:37, diff=26.723345s, valid=True
2026-06-03T18:31:03.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:31:03.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:31:03.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:31:12, diff=-8.273123s, valid=True
2026-06-03T18:31:03.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:31:03.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:31:03.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:30:37, diff=26.735145s, valid=True
2026-06-03T18:31:03.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:31:03.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:31:03.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:31:03.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:31:03.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:31:03.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:31:03.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:31:12, diff=-8.261112s, valid=True
2026-06-03T18:31:03.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:31:03.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:31:03.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:31:03.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78460.739704s, valid=False
2026-06-03T18:31:03.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:31:03.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:31:03.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:31:03.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:31:03.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:31:03.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:31:03.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:31:03.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:31:03.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:31:03.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:31:03.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:31:03.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:31:04.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:31:04.060 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:31:04.266 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:31:04.609 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:31:04.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:31:04.713 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:31:04.713 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:31:04.969 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:31:04.969 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:31:34.993 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:31:34.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:31:34.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:31:35.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:31:35.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:31:35.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:31:35.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:31:35.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:31:35.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:31:35.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:31:35.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:31:35.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:31:35.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:31:38.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:31:38.813 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:31:38.814 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:31:38.814 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:31:38.824 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:31:38.837 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:31:38.837 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:31:38.838 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:31:38.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:31:38.839 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:31:38.839 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:31:38.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:31:38.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:31:38.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:31:39.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:31:39.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:31:39.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:31:39.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:31:39.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:31:39.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:31:39.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:31:39.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:31:39.165 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:31:39.236 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:31:38
2026-06-03T18:31:39.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86744, datetime.datetime(2026, 6, 3, 18, 31, 38), datetime.datetime(2026, 6, 3, 18, 31, 37), 'salt', 4.86, 100.09, None, 39.02, 136.16, -0.02, 820.87, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:31:39.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:31:39.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:31:39.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:31:37, diff=2.244097s, valid=True
2026-06-03T18:31:39.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:31:39.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:31:39.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:32:12, diff=-32.752495s, valid=True
2026-06-03T18:31:39.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:31:39.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:31:39.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:31:30, diff=9.255441s, valid=True
2026-06-03T18:31:39.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:31:39.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:31:39.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:31:39.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:31:39.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:31:39.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:31:39.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:32:12, diff=-32.740913s, valid=True
2026-06-03T18:31:39.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:31:39.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:31:39.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:31:39.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78496.259868s, valid=False
2026-06-03T18:31:39.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:31:39.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:31:39.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:31:39.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:31:39.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:31:39.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:31:39.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:31:39.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:31:39.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:31:39.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:31:39.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:31:39.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:31:39.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:31:39.584 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:31:39.795 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:31:40.175 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:31:40.284 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:31:40.284 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:31:40.284 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:31:40.467 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:31:40.467 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:32:10.497 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:32:10.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:32:10.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:32:10.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:32:10.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:32:10.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:32:10.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:32:10.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:32:10.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:32:10.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:32:10.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:32:10.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:32:10.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:32:13.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:32:13.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:32:13.870 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:32:13.870 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:32:13.880 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:32:13.893 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:32:13.893 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:32:13.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:32:13.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:32:13.895 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:32:13.895 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:32:13.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:32:14.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:32:14.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:32:14.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:32:14.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:32:14.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:32:14.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:32:14.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:32:14.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:32:14.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:32:14.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:32:14.233 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:32:14.304 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:32:08
2026-06-03T18:32:14.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86745, datetime.datetime(2026, 6, 3, 18, 32, 8), datetime.datetime(2026, 6, 3, 18, 32, 8), 'salt', 4.89, 100.06, None, 43.12, 148.21, -0.02, 820.75, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:32:14.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:32:14.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:32:14.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:32:08, diff=6.312086s, valid=True
2026-06-03T18:32:14.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:32:14.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:32:14.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:32:12, diff=2.315597s, valid=True
2026-06-03T18:32:14.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:32:14.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:32:14.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:32:01, diff=13.323857s, valid=True
2026-06-03T18:32:14.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:32:14.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:32:14.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:32:14.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:32:14.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:32:14.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:32:14.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:32:12, diff=2.327607s, valid=True
2026-06-03T18:32:14.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:32:14.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:32:14.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:32:14.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78531.32844s, valid=False
2026-06-03T18:32:14.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:32:14.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:32:14.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:32:14.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:32:14.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:32:14.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:32:14.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:32:14.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:32:14.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:32:14.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:32:14.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:32:14.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:32:14.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:32:14.650 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:32:14.855 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:32:15.254 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:32:15.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:32:15.358 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:32:15.358 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:32:15.548 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:32:15.548 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:32:45.578 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:32:45.579 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:32:45.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:32:45.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:32:45.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:32:46.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:32:46.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:32:46.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:32:46.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:32:46.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:32:46.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:32:46.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:32:46.221 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:32:49.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:32:49.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:32:49.270 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:32:49.270 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:32:49.279 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:32:49.294 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:32:49.295 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:32:49.295 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:32:49.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:32:49.296 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:32:49.296 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:32:49.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:32:49.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:32:49.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:32:49.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:32:49.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:32:49.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:32:49.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:32:49.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:32:49.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:32:49.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:32:49.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:32:49.627 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:32:49.699 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:32:39
2026-06-03T18:32:49.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86746, datetime.datetime(2026, 6, 3, 18, 32, 39), datetime.datetime(2026, 6, 3, 18, 32, 38), 'salt', 4.89, 100.13, None, 36.24, 136.87, -0.03, 821.06, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:32:49.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:32:49.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:32:49.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:32:38, diff=11.707167s, valid=True
2026-06-03T18:32:49.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:32:49.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:32:49.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:33:12, diff=-22.289273s, valid=True
2026-06-03T18:32:49.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:32:49.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:32:49.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:32:33, diff=16.719022s, valid=True
2026-06-03T18:32:49.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:32:49.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:32:49.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:32:49.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:32:49.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:32:49.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:32:49.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:33:12, diff=-22.277174s, valid=True
2026-06-03T18:32:49.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:32:49.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:32:49.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:32:49.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78566.723639s, valid=False
2026-06-03T18:32:49.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:32:49.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:32:49.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:32:49.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:32:49.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:32:49.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:32:49.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:32:49.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:32:49.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:32:49.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:32:49.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:32:49.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:32:50.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:32:50.060 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:32:50.270 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:32:50.611 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:32:50.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:32:50.714 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:32:50.714 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:32:50.928 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:32:50.928 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:33:20.958 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:33:20.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:33:20.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:33:21.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:33:21.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:33:21.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:33:21.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:33:21.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:33:21.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:33:21.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:33:21.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:33:21.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:33:21.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:33:24.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:33:24.381 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:33:24.382 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:33:24.382 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:33:24.394 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:33:24.411 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:33:24.412 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:33:24.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:33:24.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:33:24.413 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:33:24.413 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:33:24.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:33:24.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:33:24.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:33:24.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:33:24.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:33:24.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:33:24.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:33:24.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:33:24.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:33:24.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:33:24.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:33:24.754 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:33:24.825 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:33:09
2026-06-03T18:33:24.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86747, datetime.datetime(2026, 6, 3, 18, 33, 9), datetime.datetime(2026, 6, 3, 18, 33, 8), 'salt', 4.76, 100.03, None, 34.37, 137.67, -0.01, 821.0, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:33:24.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:33:24.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:33:24.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:33:08, diff=16.831466s, valid=True
2026-06-03T18:33:24.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:33:24.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:33:24.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:33:12, diff=12.834285s, valid=True
2026-06-03T18:33:24.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:33:24.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:33:24.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:33:04, diff=20.840813s, valid=True
2026-06-03T18:33:24.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:33:24.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:33:24.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:33:24.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:33:24.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:33:24.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:33:24.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:33:12, diff=12.843798s, valid=True
2026-06-03T18:33:24.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:33:24.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:33:24.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:33:24.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78601.844442s, valid=False
2026-06-03T18:33:24.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:33:24.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:33:24.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:33:24.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:33:24.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:33:24.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:33:24.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:33:24.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:33:24.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:33:24.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:33:25.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:33:25.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:33:25.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:33:25.237 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:33:25.441 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:33:25.787 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:33:25.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:33:25.889 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:33:25.889 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:33:26.066 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:33:26.066 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:33:56.069 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:33:56.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:33:56.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:33:56.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:33:56.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:33:56.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:33:56.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:33:56.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:33:56.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:33:56.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:33:56.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:33:56.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:33:56.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:33:59.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:33:59.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:33:59.439 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:33:59.439 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:33:59.450 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:33:59.462 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:33:59.463 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:33:59.463 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:33:59.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:33:59.464 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:33:59.464 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:33:59.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:33:59.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:33:59.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:33:59.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:33:59.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:33:59.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:33:59.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:33:59.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:33:59.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:33:59.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:33:59.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:33:59.791 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:33:59.864 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:33:39
2026-06-03T18:33:59.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86748, datetime.datetime(2026, 6, 3, 18, 33, 39), datetime.datetime(2026, 6, 3, 18, 33, 38), 'salt', 4.79, 100.09, None, 36.69, 130.34, -0.02, 820.81, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:33:59.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:33:59.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:33:59.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:33:38, diff=21.871044s, valid=True
2026-06-03T18:33:59.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:33:59.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:33:59.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:34:12, diff=-12.125396s, valid=True
2026-06-03T18:33:59.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:33:59.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:33:59.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:33:35, diff=24.890025s, valid=True
2026-06-03T18:33:59.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:33:59.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:33:59.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:33:59.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:33:59.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:33:59.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:33:59.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:34:12, diff=-12.106001s, valid=True
2026-06-03T18:33:59.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:33:59.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:33:59.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:33:59.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78636.894781s, valid=False
2026-06-03T18:33:59.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:33:59.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:33:59.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:33:59.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:33:59.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:33:59.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:33:59.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:33:59.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:33:59.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:34:00.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:34:00.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:34:00.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:34:00.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:34:00.235 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:34:00.439 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:34:00.779 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:34:00.881 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:34:00.881 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:34:00.881 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:34:01.059 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:34:01.059 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:34:31.089 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:34:31.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:34:31.090 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:34:31.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:34:31.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:34:31.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:34:31.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:34:31.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:34:31.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:34:31.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:34:31.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:34:31.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:34:31.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:34:34.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:34:34.633 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:34:34.633 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:34:34.634 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:34:34.644 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:34:34.656 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:34:34.657 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:34:34.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:34:34.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:34:34.658 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:34:34.658 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:34:34.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:34:34.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:34:34.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:34:34.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:34:34.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:34:34.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:34:34.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:34:34.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:34:34.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:34:34.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:34:34.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:34:34.989 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:34:35.061 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:34:09
2026-06-03T18:34:35.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86749, datetime.datetime(2026, 6, 3, 18, 34, 9), datetime.datetime(2026, 6, 3, 18, 34, 9), 'salt', 4.89, 100.29, None, 43.12, 129.0, -0.05, 820.88, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:34:35.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:34:35.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:34:35.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:34:09, diff=26.068474s, valid=True
2026-06-03T18:34:35.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:34:35.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:34:35.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:34:12, diff=23.071981s, valid=True
2026-06-03T18:34:35.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:34:35.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:34:35.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:34:07, diff=28.080251s, valid=True
2026-06-03T18:34:35.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:34:35.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:34:35.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:34:35.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:34:35.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:34:35.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:34:35.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:34:12, diff=23.083964s, valid=True
2026-06-03T18:34:35.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:34:35.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:34:35.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:34:35.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78672.084774s, valid=False
2026-06-03T18:34:35.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:34:35.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:34:35.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:34:35.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:34:35.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:34:35.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:34:35.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:34:35.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:34:35.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:34:35.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:34:35.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:34:35.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:34:35.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:34:35.470 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:34:35.675 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:34:36.016 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:34:36.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:34:36.118 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:34:36.118 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:34:36.339 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:34:36.339 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:35:06.369 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:35:06.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:35:06.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:35:06.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:35:06.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:35:06.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:35:06.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:35:06.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:35:06.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:35:06.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:35:06.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:35:06.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:35:06.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:35:09.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:35:09.792 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:35:09.792 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:35:09.793 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:35:09.803 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:35:09.816 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:35:09.817 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:35:09.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:35:09.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:35:09.818 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:35:09.818 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:35:09.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:35:09.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T18:35:09.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:35:09.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:35:09.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:35:10.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:35:10.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:35:10.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:35:10.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:35:10.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:35:10.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:35:10.082 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:35:10.151 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:34:40
2026-06-03T18:35:10.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86750, datetime.datetime(2026, 6, 3, 18, 34, 40), datetime.datetime(2026, 6, 3, 18, 34, 39), 'salt', 4.79, 100.06, None, 47.91, 132.64, -0.02, 820.81, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T18:35:10.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:35:10.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T18:35:10.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:34:39, diff=31.158118s, valid=True
2026-06-03T18:35:10.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:35:10.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:35:10.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:35:12, diff=-1.838726s, valid=True
2026-06-03T18:35:10.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:35:10.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:35:10.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:35:02, diff=8.168347s, valid=True
2026-06-03T18:35:10.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:35:10.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:35:10.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:35:10.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:35:10.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:35:10.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:35:10.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:35:12, diff=-1.828635s, valid=True
2026-06-03T18:35:10.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:35:10.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:35:10.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:35:10.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78707.172018s, valid=False
2026-06-03T18:35:10.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:35:10.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:35:10.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:35:10.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:35:10.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:35:10.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:35:10.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:35:10.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:35:10.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:35:10.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:35:10.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:35:10.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:35:10.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:35:10.489 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:35:10.712 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:35:11.063 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:35:11.170 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:35:11.170 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:35:11.170 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:35:11.340 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:35:11.340 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:35:41.361 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:35:41.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:35:41.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:35:41.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:35:41.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:35:41.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:35:41.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:35:41.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:35:41.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:35:41.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:35:41.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:35:41.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:35:41.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:35:44.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:35:44.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:35:44.932 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:35:44.933 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:35:44.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:35:44.955 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:35:44.955 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:35:44.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:35:44.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:35:44.957 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:35:44.957 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:35:44.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:35:45.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:35:45.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:35:45.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:35:45.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:35:45.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:35:45.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:35:45.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:35:45.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:35:45.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:35:45.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:35:45.287 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:35:45.361 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:35:40
2026-06-03T18:35:45.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86752, datetime.datetime(2026, 6, 3, 18, 35, 40), datetime.datetime(2026, 6, 3, 18, 35, 39), 'salt', 4.83, 100.1, None, 37.58, 131.52, -0.01, 821.0, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:35:45.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:35:45.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:35:45.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:35:39, diff=6.368519s, valid=True
2026-06-03T18:35:45.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:35:45.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:35:45.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:36:12, diff=-26.628003s, valid=True
2026-06-03T18:35:45.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:35:45.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:35:45.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:35:33, diff=12.380229s, valid=True
2026-06-03T18:35:45.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:35:45.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:35:45.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:35:45.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:35:45.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:35:45.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:35:45.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:36:12, diff=-26.616054s, valid=True
2026-06-03T18:35:45.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:35:45.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:35:45.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:35:45.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78742.384778s, valid=False
2026-06-03T18:35:45.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:35:45.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:35:45.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:35:45.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:35:45.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:35:45.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:35:45.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:35:45.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:35:45.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:35:45.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:35:45.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:35:45.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:35:45.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:35:45.772 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:35:45.981 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:35:46.324 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:35:46.428 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:35:46.428 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:35:46.428 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:35:46.608 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:35:46.608 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:36:16.637 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:36:16.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:36:16.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:36:17.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:36:17.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:36:17.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:36:17.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:36:17.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:36:17.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:36:17.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:36:17.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:36:17.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:36:17.437 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:36:20.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:36:20.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:36:20.907 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:36:20.907 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:36:20.918 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:36:20.930 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:36:20.931 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:36:20.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:36:20.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:36:20.932 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:36:20.932 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:36:20.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:36:21.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:36:21.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:36:21.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:36:21.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:36:21.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:36:21.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:36:21.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:36:21.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:36:21.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:36:21.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:36:21.275 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:36:21.349 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:36:10
2026-06-03T18:36:21.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86753, datetime.datetime(2026, 6, 3, 18, 36, 10), datetime.datetime(2026, 6, 3, 18, 36, 10), 'salt', 4.79, 100.1, None, 42.9, 139.45, -0.02, 820.94, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:36:21.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:36:21.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:36:21.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:36:10, diff=11.357071s, valid=True
2026-06-03T18:36:21.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:36:21.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:36:21.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:36:12, diff=9.360509s, valid=True
2026-06-03T18:36:21.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:36:21.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:36:21.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:36:03, diff=18.36873s, valid=True
2026-06-03T18:36:21.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:36:21.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:36:21.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:36:21.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:36:21.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:36:21.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:36:21.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:36:12, diff=9.372451s, valid=True
2026-06-03T18:36:21.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:36:21.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:36:21.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:36:21.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78778.373277s, valid=False
2026-06-03T18:36:21.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:36:21.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:36:21.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:36:21.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:36:21.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:36:21.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:36:21.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:36:21.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:36:21.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:36:21.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:36:21.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:36:21.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:36:21.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:36:21.695 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:36:21.903 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:36:22.246 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:36:22.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:36:22.350 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:36:22.350 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:36:22.521 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:36:22.521 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:36:52.550 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:36:52.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:36:52.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:36:52.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:36:52.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:36:53.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:36:53.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:36:53.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:36:53.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:36:53.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:36:53.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:36:53.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:36:53.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:36:55.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:36:55.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:36:55.752 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:36:55.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:36:55.763 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:36:55.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:36:55.777 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:36:55.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:36:55.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:36:55.778 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:36:55.778 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:36:55.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:36:55.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:36:55.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:36:56.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:36:56.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:36:56.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:36:56.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:36:56.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:36:56.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:36:56.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:36:56.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:36:56.117 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:36:56.189 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:36:41
2026-06-03T18:36:56.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86754, datetime.datetime(2026, 6, 3, 18, 36, 41), datetime.datetime(2026, 6, 3, 18, 36, 40), 'salt', 4.79, 100.1, None, 37.47, 160.02, -0.02, 821.06, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:36:56.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:36:56.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:36:56.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:36:40, diff=16.197358s, valid=True
2026-06-03T18:36:56.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:36:56.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:36:56.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:37:12, diff=-15.799102s, valid=True
2026-06-03T18:36:56.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:36:56.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:36:56.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:36:34, diff=22.209028s, valid=True
2026-06-03T18:36:56.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:36:56.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:36:56.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:36:56.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:36:56.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:36:56.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:36:56.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:37:12, diff=-15.787281s, valid=True
2026-06-03T18:36:56.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:36:56.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:36:56.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:36:56.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78813.213525s, valid=False
2026-06-03T18:36:56.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:36:56.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:36:56.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:36:56.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:36:56.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:36:56.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:36:56.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:36:56.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:36:56.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:36:56.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:36:56.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:36:56.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:36:56.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:36:56.539 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:36:56.748 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:36:57.091 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:36:57.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:36:57.193 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:36:57.193 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:36:58.284 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:36:58.285 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:37:28.315 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:37:28.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:37:28.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:37:28.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:37:28.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:37:28.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:37:28.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:37:28.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:37:28.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:37:28.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:37:28.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:37:28.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:37:28.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:37:31.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:37:31.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:37:31.621 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:37:31.621 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:37:31.631 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:37:31.645 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:37:31.645 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:37:31.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:37:31.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:37:31.646 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:37:31.647 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:37:31.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:37:31.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:37:31.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:37:31.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:37:31.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:37:31.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:37:31.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:37:31.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:37:31.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:37:32.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:37:32.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:37:32.004 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:37:32.075 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:37:11
2026-06-03T18:37:32.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86755, datetime.datetime(2026, 6, 3, 18, 37, 11), datetime.datetime(2026, 6, 3, 18, 37, 10), 'salt', 4.83, 100.1, None, 28.9, 134.45, -0.01, 820.94, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:37:32.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:37:32.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:37:32.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:37:10, diff=22.083713s, valid=True
2026-06-03T18:37:32.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:37:32.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:37:32.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:37:12, diff=20.087217s, valid=True
2026-06-03T18:37:32.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:37:32.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:37:32.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:37:05, diff=27.095355s, valid=True
2026-06-03T18:37:32.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:37:32.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:37:32.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:37:32.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:37:32.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:37:32.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:37:32.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:37:12, diff=20.099128s, valid=True
2026-06-03T18:37:32.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:37:32.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:37:32.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:37:32.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78849.099958s, valid=False
2026-06-03T18:37:32.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:37:32.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:37:32.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:37:32.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:37:32.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:37:32.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:37:32.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:37:32.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:37:32.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:37:32.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:37:32.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:37:32.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:37:32.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:37:32.423 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:37:32.622 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:37:33.015 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:37:33.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:37:33.119 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:37:33.119 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:37:33.313 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:37:33.314 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:38:03.315 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:38:03.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:38:03.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:38:03.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:38:03.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:38:03.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:38:03.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:38:03.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:38:03.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:38:03.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:38:03.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:38:03.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:38:03.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:38:06.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:38:06.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:38:06.562 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:38:06.562 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:38:06.571 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:38:06.584 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:38:06.585 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:38:06.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:38:06.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:38:06.586 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:38:06.586 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:38:06.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:38:06.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:38:06.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:38:06.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:38:06.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:38:06.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:38:06.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:38:06.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:38:06.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:38:06.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:38:06.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:38:06.951 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:38:07.031 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:37:41
2026-06-03T18:38:07.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86756, datetime.datetime(2026, 6, 3, 18, 37, 41), datetime.datetime(2026, 6, 3, 18, 37, 40), 'salt', 4.76, 100.06, None, 36.31, 129.69, -0.01, 821.0, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:38:07.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:38:07.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:38:07.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:37:40, diff=27.039635s, valid=True
2026-06-03T18:38:07.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:38:07.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:38:07.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:38:12, diff=-4.956704s, valid=True
2026-06-03T18:38:07.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:38:07.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:38:07.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:37:36, diff=31.051923s, valid=True
2026-06-03T18:38:07.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:38:07.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:38:07.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:38:07.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:38:07.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:38:07.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:38:07.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:38:12, diff=-4.944255s, valid=True
2026-06-03T18:38:07.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:38:07.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:38:07.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:38:07.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78884.056565s, valid=False
2026-06-03T18:38:07.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:38:07.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:38:07.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:38:07.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:38:07.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:38:07.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:38:07.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:38:07.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:38:07.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:38:07.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:38:07.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:38:07.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:38:07.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:38:07.379 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:38:07.590 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:38:07.924 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:38:08.026 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:38:08.026 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:38:08.026 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:38:08.213 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:38:08.213 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:38:38.230 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:38:38.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:38:38.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:38:38.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:38:38.618 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:38:38.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:38:38.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:38:38.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:38:38.860 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:38:38.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:38:38.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:38:38.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:38:38.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:38:41.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:38:41.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:38:41.556 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:38:41.557 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:38:41.566 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:38:41.579 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:38:41.580 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:38:41.580 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:38:41.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:38:41.581 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:38:41.582 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:38:41.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:38:41.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:38:41.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:38:41.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:38:41.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:38:41.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:38:41.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:38:41.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:38:41.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:38:41.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:38:41.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:38:41.902 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:38:41.970 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:38:11
2026-06-03T18:38:41.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86757, datetime.datetime(2026, 6, 3, 18, 38, 11), datetime.datetime(2026, 6, 3, 18, 38, 11), 'salt', 4.69, 99.96, None, 44.56, 133.98, 0.0, 821.06, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:38:41.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:38:41.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:38:41.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:38:41, diff=0.977567s, valid=True
2026-06-03T18:38:41.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:38:41.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:38:41.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:39:12, diff=-30.019122s, valid=True
2026-06-03T18:38:41.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:38:41.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:38:41.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:38:39, diff=2.988587s, valid=True
2026-06-03T18:38:41.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:38:41.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:38:41.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:38:41.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:38:41.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:38:41.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:38:41.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:39:12, diff=-30.00797s, valid=True
2026-06-03T18:38:41.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:38:41.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:38:41.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:38:41.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78918.992785s, valid=False
2026-06-03T18:38:41.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:38:41.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:38:41.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:38:41.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:38:41.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:38:42.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:38:42.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:38:42.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:38:42.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:38:42.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:38:42.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:38:42.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:38:42.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:38:42.312 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:38:42.588 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:38:42.923 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:38:43.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:38:43.023 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:38:43.023 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:38:43.110 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:38:43.110 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:39:13.140 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:39:13.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:39:13.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:39:13.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:39:13.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:39:13.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:39:13.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:39:13.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:39:13.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:39:13.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:39:13.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:39:13.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:39:13.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:39:16.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:39:16.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:39:16.208 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:39:16.208 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:39:16.217 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:39:16.229 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:39:16.229 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:39:16.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:39:16.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:39:16.230 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:39:16.230 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:39:16.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:39:16.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:39:16.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:39:16.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:39:16.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:39:16.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:39:16.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:39:16.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:39:16.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:39:16.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:39:16.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:39:16.536 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:39:16.631 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:39:12
2026-06-03T18:39:16.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86759, datetime.datetime(2026, 6, 3, 18, 39, 12), datetime.datetime(2026, 6, 3, 18, 39, 11), 'salt', 4.73, 100.06, None, 34.93, 124.78, -0.01, 821.06, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:39:16.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:39:16.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:39:16.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:39:11, diff=5.639167s, valid=True
2026-06-03T18:39:16.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:39:16.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:39:16.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:39:12, diff=4.642694s, valid=True
2026-06-03T18:39:16.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:39:16.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:39:16.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:39:11, diff=5.650794s, valid=True
2026-06-03T18:39:16.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:39:16.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:39:16.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:39:16.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:39:16.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:39:16.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:39:16.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:39:12, diff=4.65453s, valid=True
2026-06-03T18:39:16.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:39:16.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:39:16.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:39:16.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78953.655339s, valid=False
2026-06-03T18:39:16.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:39:16.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:39:16.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:39:16.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:39:16.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:39:16.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:39:16.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:39:16.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:39:16.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:39:16.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:39:16.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:39:16.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:39:16.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:39:16.978 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:39:17.175 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:39:17.512 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:39:17.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:39:17.612 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:39:17.613 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:39:17.809 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:39:17.810 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:39:47.819 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:39:47.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:39:47.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:39:48.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:39:48.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:39:48.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:39:48.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:39:48.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:39:48.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:39:48.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:39:48.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:39:48.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:39:48.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:39:51.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:39:51.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:39:51.033 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:39:51.034 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:39:51.043 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:39:51.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:39:51.056 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:39:51.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:39:51.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:39:51.057 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:39:51.058 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:39:51.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:39:51.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:39:51.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:39:51.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:39:51.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:39:51.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:39:51.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:39:51.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:39:51.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:39:51.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:39:51.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:39:51.415 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:39:51.487 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:39:42
2026-06-03T18:39:51.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86760, datetime.datetime(2026, 6, 3, 18, 39, 42), datetime.datetime(2026, 6, 3, 18, 39, 41), 'salt', 4.83, 100.13, None, 37.29, 125.72, -0.02, 821.12, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:39:51.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:39:51.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:39:51.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:39:41, diff=10.495069s, valid=True
2026-06-03T18:39:51.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:39:51.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:39:51.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:40:12, diff=-20.501458s, valid=True
2026-06-03T18:39:51.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:39:51.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:39:51.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:39:35, diff=16.506749s, valid=True
2026-06-03T18:39:51.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:39:51.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:39:51.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:39:51.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:39:51.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:39:51.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:39:51.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:40:12, diff=-20.489556s, valid=True
2026-06-03T18:39:51.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:39:51.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:39:51.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:39:51.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=78988.511258s, valid=False
2026-06-03T18:39:51.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:39:51.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:39:51.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:39:51.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:39:51.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:39:51.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:39:51.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:39:51.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:39:51.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:39:51.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:39:51.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:39:51.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:39:51.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:39:51.901 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:39:52.098 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:39:52.430 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:39:52.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:39:52.531 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:39:52.531 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:39:52.718 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:39:52.719 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:40:22.722 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:40:22.722 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:40:22.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:40:23.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:40:23.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:40:23.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:40:23.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:40:23.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:40:23.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:40:23.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:40:23.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:40:23.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:40:23.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:40:25.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:40:25.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:40:25.989 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:40:25.990 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:40:25.999 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:40:26.012 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:40:26.013 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:40:26.013 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:40:26.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:40:26.014 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:40:26.014 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:40:26.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:40:26.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:40:26.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:40:26.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:40:26.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:40:26.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:40:26.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:40:26.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T18:40:26.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:40:26.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:40:26.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:40:26.349 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:40:26.430 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:40:12
2026-06-03T18:40:26.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86761, datetime.datetime(2026, 6, 3, 18, 40, 12), datetime.datetime(2026, 6, 3, 18, 40, 12), 'salt', 4.83, 100.13, None, 36.24, 151.05, -0.02, 821.06, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:40:26.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:40:26.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:40:26.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:40:12, diff=14.437313s, valid=True
2026-06-03T18:40:26.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:40:26.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:40:26.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:40:12, diff=14.440196s, valid=True
2026-06-03T18:40:26.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:40:26.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:40:26.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:40:12, diff=14.446814s, valid=True
2026-06-03T18:40:26.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:40:26.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:40:26.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:40:26.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:40:26.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:40:26.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T18:40:26.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:40:12, diff=14.449754s, valid=True
2026-06-03T18:40:26.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:40:26.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:40:26.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:40:26.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79023.450395s, valid=False
2026-06-03T18:40:26.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:40:26.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:40:26.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:40:26.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:40:26.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:40:26.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:40:26.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:40:26.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:40:26.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:40:26.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:40:26.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:40:26.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:40:26.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:40:26.764 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:40:26.961 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:40:27.293 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:40:27.393 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:40:27.393 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:40:27.393 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:40:27.577 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:40:27.577 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:40:57.604 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:40:57.605 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:40:57.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:40:57.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:40:57.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:40:58.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:40:58.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:40:58.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:40:58.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:40:58.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:40:58.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:40:58.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:40:58.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:41:00.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:41:00.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:41:00.745 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:41:00.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:41:00.756 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:41:00.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:41:00.770 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:41:00.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:41:00.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:41:00.771 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:41:00.771 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:41:00.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:41:00.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:41:00.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:41:01.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:41:01.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:41:01.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:41:01.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:41:01.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:41:01.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:41:01.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:41:01.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:41:01.110 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:41:01.181 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:40:43
2026-06-03T18:41:01.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86762, datetime.datetime(2026, 6, 3, 18, 40, 43), datetime.datetime(2026, 6, 3, 18, 40, 42), 'salt', 4.66, 100.03, None, 35.71, 130.6, -0.01, 821.06, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:41:01.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:41:01.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:41:01.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:40:42, diff=19.189169s, valid=True
2026-06-03T18:41:01.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:41:01.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:41:01.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:41:12, diff=-10.807333s, valid=True
2026-06-03T18:41:01.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:41:01.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:41:01.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:40:36, diff=25.200918s, valid=True
2026-06-03T18:41:01.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:41:01.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:41:01.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:41:01.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:41:01.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:41:01.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:41:01.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:41:12, diff=-10.795347s, valid=True
2026-06-03T18:41:01.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:41:01.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:41:01.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:41:01.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79058.205451s, valid=False
2026-06-03T18:41:01.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:41:01.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:41:01.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:41:01.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:41:01.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:41:01.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:41:01.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:41:01.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:41:01.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:41:01.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:41:01.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:41:01.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:41:01.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:41:01.595 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:41:01.811 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:41:02.167 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:41:02.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:41:02.268 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:41:02.268 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:41:02.452 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:41:02.452 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:41:32.477 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:41:32.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:41:32.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:41:32.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:41:32.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:41:32.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:41:32.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:41:32.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:41:32.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:41:32.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:41:32.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:41:32.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:41:32.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:41:35.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:41:35.510 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:41:35.510 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:41:35.510 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:41:35.519 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:41:35.532 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:41:35.533 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:41:35.533 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:41:35.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:41:35.534 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:41:35.534 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:41:35.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:41:35.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:41:35.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:41:35.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:41:35.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:41:35.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:41:35.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:41:35.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T18:41:35.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:41:35.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:41:35.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:41:35.859 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:41:35.930 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:41:13
2026-06-03T18:41:35.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86763, datetime.datetime(2026, 6, 3, 18, 41, 13), datetime.datetime(2026, 6, 3, 18, 41, 12), 'salt', 4.79, 100.1, None, 41.42, 130.04, -0.02, 821.12, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:41:35.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:41:35.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:41:35.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:41:12, diff=23.937903s, valid=True
2026-06-03T18:41:35.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:41:35.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:41:35.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:41:12, diff=23.941426s, valid=True
2026-06-03T18:41:35.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:41:35.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:41:35.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:41:06, diff=29.949613s, valid=True
2026-06-03T18:41:35.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:41:35.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:41:35.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:41:35.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:41:35.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:41:35.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T18:41:35.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:41:12, diff=23.953385s, valid=True
2026-06-03T18:41:35.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:41:35.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:41:35.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:41:35.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79092.954229s, valid=False
2026-06-03T18:41:35.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:41:35.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:41:35.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:41:35.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:41:35.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:41:36.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:41:36.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:41:36.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:41:36.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:41:36.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:41:36.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:41:36.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:41:36.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:41:36.275 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:41:36.471 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:41:36.803 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:41:36.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:41:36.903 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:41:36.903 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:41:37.059 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:41:37.059 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:42:07.062 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:42:07.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:42:07.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:42:07.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:42:07.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:42:07.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:42:07.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:42:07.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:42:07.768 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:42:07.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:42:07.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:42:07.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:42:07.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:42:10.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:42:10.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:42:10.565 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:42:10.566 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:42:10.580 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:42:10.602 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:42:10.602 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:42:10.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:42:10.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:42:10.603 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:42:10.604 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:42:10.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:42:10.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:42:10.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:42:10.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:42:10.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:42:10.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T18:42:10.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:42:10.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T18:42:10.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:42:10.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:42:10.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:42:10.936 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:42:11.007 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:41:43
2026-06-03T18:42:11.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86764, datetime.datetime(2026, 6, 3, 18, 41, 43), datetime.datetime(2026, 6, 3, 18, 41, 42), 'salt', 4.73, 100.13, None, 34.05, 144.03, -0.02, 821.06, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:42:11.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:42:11.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:42:11.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:41:42, diff=29.013147s, valid=True
2026-06-03T18:42:11.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:42:11.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T18:42:11.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:42:12, diff=-0.983987s, valid=True
2026-06-03T18:42:11.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:42:11.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:42:11.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:41:36, diff=35.022617s, valid=True
2026-06-03T18:42:11.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:42:11.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:42:11.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:42:11.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:42:11.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:42:11.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T18:42:11.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:42:12, diff=-0.974353s, valid=True
2026-06-03T18:42:11.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:42:11.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:42:11.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:42:11.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79128.026295s, valid=False
2026-06-03T18:42:11.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:42:11.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:42:11.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:42:11.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:42:11.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:42:11.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:42:11.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:42:11.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:42:11.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:42:11.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:42:11.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:42:11.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:42:11.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:42:11.418 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:42:11.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:42:11.949 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:42:12.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:42:12.054 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:42:12.054 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:42:12.244 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:42:12.245 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:42:42.253 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:42:42.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:42:42.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:42:42.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:42:42.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:42:42.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:42:42.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:42:42.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:42:42.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:42:42.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:42:42.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:42:42.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:42:42.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:42:45.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:42:45.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:42:45.677 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:42:45.677 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:42:45.686 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:42:45.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:42:45.699 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:42:45.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:42:45.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:42:45.700 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:42:45.701 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:42:45.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:42:45.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:42:45.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:42:45.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:42:45.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:42:45.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T18:42:45.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:42:46.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T18:42:46.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:42:46.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:42:46.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:42:46.043 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:42:46.115 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:42:44
2026-06-03T18:42:46.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86766, datetime.datetime(2026, 6, 3, 18, 42, 44), datetime.datetime(2026, 6, 3, 18, 42, 43), 'salt', 4.73, 100.1, None, 28.97, 141.0, -0.01, 821.0, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:42:46.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:42:46.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:42:46.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:42:43, diff=3.123213s, valid=True
2026-06-03T18:42:46.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:42:46.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T18:42:46.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:43:12, diff=-25.873276s, valid=True
2026-06-03T18:42:46.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:42:46.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:42:46.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:42:39, diff=7.134945s, valid=True
2026-06-03T18:42:46.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:42:46.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:42:46.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:42:46.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:42:46.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:42:46.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T18:42:46.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:43:12, diff=-25.861281s, valid=True
2026-06-03T18:42:46.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:42:46.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:42:46.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:42:46.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79163.139525s, valid=False
2026-06-03T18:42:46.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:42:46.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:42:46.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:42:46.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:42:46.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:42:46.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:42:46.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:42:46.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:42:46.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:42:46.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:42:46.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:42:46.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:42:46.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:42:46.460 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:42:46.660 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:42:46.993 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:42:47.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:42:47.093 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:42:47.093 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:42:47.310 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:42:47.310 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:43:17.317 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:43:17.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:43:17.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:43:17.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:43:17.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:43:17.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:43:17.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:43:17.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:43:17.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:43:17.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:43:17.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:43:18.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:43:18.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:43:20.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:43:20.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:43:20.655 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:43:20.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:43:20.665 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:43:20.677 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:43:20.677 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:43:20.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:43:20.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:43:20.677 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:43:20.677 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:43:20.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:43:20.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:43:20.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:43:20.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:43:20.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:43:20.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T18:43:20.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:43:20.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T18:43:20.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:43:20.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:43:20.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:43:20.977 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:43:21.048 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:43:14
2026-06-03T18:43:21.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86767, datetime.datetime(2026, 6, 3, 18, 43, 14), datetime.datetime(2026, 6, 3, 18, 43, 13), 'salt', 4.76, 100.19, None, 35.21, 138.33, -0.03, 821.36, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:43:21.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:43:21.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:43:21.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:43:13, diff=8.055048s, valid=True
2026-06-03T18:43:21.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:43:21.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T18:43:21.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:43:12, diff=9.058399s, valid=True
2026-06-03T18:43:21.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:43:21.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:43:21.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:43:10, diff=11.06617s, valid=True
2026-06-03T18:43:21.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:43:21.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:43:21.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:43:21.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:43:21.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:43:21.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T18:43:21.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:43:12, diff=9.069731s, valid=True
2026-06-03T18:43:21.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:43:21.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:43:21.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:43:21.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79198.070484s, valid=False
2026-06-03T18:43:21.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:43:21.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:43:21.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:43:21.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:43:21.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:43:21.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:43:21.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:43:21.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:43:21.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:43:21.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:43:21.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:43:21.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:43:21.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:43:21.387 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:43:21.584 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:43:21.916 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:43:22.017 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:43:22.017 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:43:22.017 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:43:22.193 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:43:22.193 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:43:52.223 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:43:52.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:43:52.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:43:52.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:43:52.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:43:52.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:43:52.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:43:52.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:43:52.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:43:52.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:43:52.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:43:52.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:43:52.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:43:55.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:43:55.476 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:43:55.477 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:43:55.477 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:43:55.635 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:43:55.648 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:43:55.649 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:43:55.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:43:55.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:43:55.650 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:43:55.650 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:43:55.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:43:55.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:43:55.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:43:55.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:43:55.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:43:55.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:43:55.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:43:55.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:43:55.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:43:55.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:43:55.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:43:55.981 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:43:56.056 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:43:44
2026-06-03T18:43:56.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86768, datetime.datetime(2026, 6, 3, 18, 43, 44), datetime.datetime(2026, 6, 3, 18, 43, 44), 'salt', 4.76, 100.16, None, 43.64, 137.83, -0.03, 821.12, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:43:56.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:43:56.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:43:56.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:43:44, diff=12.063743s, valid=True
2026-06-03T18:43:56.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:43:56.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:43:56.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:44:12, diff=-15.932784s, valid=True
2026-06-03T18:43:56.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:43:56.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:43:56.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:43:42, diff=14.075426s, valid=True
2026-06-03T18:43:56.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:43:56.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:43:56.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:43:56.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:43:56.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:43:56.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:43:56.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:44:12, diff=-15.920865s, valid=True
2026-06-03T18:43:56.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:43:56.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:43:56.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:43:56.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79233.079944s, valid=False
2026-06-03T18:43:56.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:43:56.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:43:56.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:43:56.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:43:56.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:43:56.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:43:56.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:43:56.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:43:56.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:43:56.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:43:56.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:43:56.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:43:56.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:43:56.399 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:43:56.595 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:43:56.986 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:43:57.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:43:57.087 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:43:57.087 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:43:57.243 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:43:57.243 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:44:27.273 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:44:27.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:44:27.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:44:27.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:44:27.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:44:27.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:44:27.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:44:27.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:44:27.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:44:27.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:44:27.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:44:27.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:44:27.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:44:30.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:44:30.600 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:44:30.601 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:44:30.601 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:44:30.611 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:44:30.624 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:44:30.625 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:44:30.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:44:30.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:44:30.626 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:44:30.626 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:44:30.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:44:30.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:44:30.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:44:30.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:44:30.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:44:30.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:44:30.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:44:30.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:44:30.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:44:30.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:44:30.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:44:30.962 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:44:31.034 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:44:15
2026-06-03T18:44:31.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86769, datetime.datetime(2026, 6, 3, 18, 44, 15), datetime.datetime(2026, 6, 3, 18, 44, 14), 'salt', 4.73, 100.1, None, 36.73, 127.62, -0.01, 821.3, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:44:31.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:44:31.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:44:31.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:44:14, diff=17.042083s, valid=True
2026-06-03T18:44:31.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:44:31.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:44:31.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:44:12, diff=19.045452s, valid=True
2026-06-03T18:44:31.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:44:31.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:44:31.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:44:13, diff=18.053525s, valid=True
2026-06-03T18:44:31.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:44:31.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:44:31.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:44:31.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:44:31.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:44:31.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:44:31.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:44:12, diff=19.057165s, valid=True
2026-06-03T18:44:31.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:44:31.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:44:31.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:44:31.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79268.057993s, valid=False
2026-06-03T18:44:31.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:44:31.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:44:31.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:44:31.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:44:31.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:44:31.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:44:31.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:44:31.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:44:31.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:44:31.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:44:31.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:44:31.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:44:31.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:44:31.389 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:44:31.591 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:44:31.941 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:44:32.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:44:32.044 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:44:32.044 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:44:32.256 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:44:32.257 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:45:02.287 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:45:02.287 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:45:02.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:45:02.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:45:02.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:45:02.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:45:02.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:45:02.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:45:02.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:45:02.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:45:02.671 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:45:02.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:45:02.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:45:05.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:45:05.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:45:05.190 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:45:05.190 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:45:05.200 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:45:05.215 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:45:05.216 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:45:05.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:45:05.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:45:05.217 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:45:05.217 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:45:05.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:45:05.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:45:05.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:45:05.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:45:05.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:45:05.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:45:05.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:45:05.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:45:05.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:45:05.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:45:05.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:45:05.548 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:45:05.640 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:44:45
2026-06-03T18:45:05.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86770, datetime.datetime(2026, 6, 3, 18, 44, 45), datetime.datetime(2026, 6, 3, 18, 44, 44), 'salt', 4.73, 100.1, None, 36.87, 134.36, -0.01, 821.06, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:45:05.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:45:05.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:45:05.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:44:44, diff=21.647871s, valid=True
2026-06-03T18:45:05.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:45:05.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:45:05.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:45:12, diff=-6.348669s, valid=True
2026-06-03T18:45:05.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:45:05.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:45:05.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:44:37, diff=28.659416s, valid=True
2026-06-03T18:45:05.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:45:05.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:45:05.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:45:05.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:45:05.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:45:05.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:45:05.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:45:12, diff=-6.33684s, valid=True
2026-06-03T18:45:05.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:45:05.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:45:05.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:45:05.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79302.664003s, valid=False
2026-06-03T18:45:05.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:45:05.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:45:05.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:45:05.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:45:05.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:45:05.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:45:05.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:45:05.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:45:05.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:45:05.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:45:05.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:45:05.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:45:05.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:45:06.056 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:45:06.270 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:45:06.604 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:45:06.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:45:06.706 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:45:06.706 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:45:06.888 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:45:06.888 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:45:36.918 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:45:36.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:45:36.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:45:37.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:45:37.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:45:37.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:45:37.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:45:37.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:45:37.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:45:37.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:45:37.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:45:37.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:45:37.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:45:40.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:45:40.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:45:40.218 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:45:40.218 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:45:40.228 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:45:40.241 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:45:40.242 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:45:40.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:45:40.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:45:40.243 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:45:40.243 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:45:40.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:45:40.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:45:40.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:45:40.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:45:40.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:45:40.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:45:40.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:45:40.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:45:40.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:45:40.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:45:40.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:45:40.570 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:45:40.648 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:45:15
2026-06-03T18:45:40.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86771, datetime.datetime(2026, 6, 3, 18, 45, 15), datetime.datetime(2026, 6, 3, 18, 45, 14), 'salt', 4.66, 100.0, None, 41.88, 132.62, 0.0, 821.12, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:45:40.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:45:40.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:45:40.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:45:14, diff=26.655909s, valid=True
2026-06-03T18:45:40.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:45:40.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:45:40.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:45:12, diff=28.659447s, valid=True
2026-06-03T18:45:40.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:45:40.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:45:40.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:45:08, diff=32.667639s, valid=True
2026-06-03T18:45:40.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:45:40.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:45:40.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:45:40.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:45:40.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:45:40.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:45:40.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:45:12, diff=28.671399s, valid=True
2026-06-03T18:45:40.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:45:40.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:45:40.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:45:40.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79337.672222s, valid=False
2026-06-03T18:45:40.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:45:40.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:45:40.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:45:40.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:45:40.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:45:40.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:45:40.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:45:40.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:45:40.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:45:40.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:45:40.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:45:40.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:45:40.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:45:40.991 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:45:41.187 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:45:41.519 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:45:41.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:45:41.620 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:45:41.620 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:45:41.803 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:45:41.803 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:46:11.831 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:46:11.831 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:46:11.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:46:12.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:46:12.310 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:46:12.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:46:12.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:46:12.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:46:12.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:46:12.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:46:12.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:46:12.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:46:12.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:46:15.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:46:15.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:46:15.300 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:46:15.300 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:46:15.310 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:46:15.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:46:15.324 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:46:15.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:46:15.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:46:15.325 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:46:15.325 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:46:15.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:46:15.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:46:15.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:46:15.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:46:15.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:46:15.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:46:15.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:46:15.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:46:15.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:46:15.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:46:15.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:46:15.656 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:46:15.731 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:45:45
2026-06-03T18:46:15.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86772, datetime.datetime(2026, 6, 3, 18, 45, 45), datetime.datetime(2026, 6, 3, 18, 45, 45), 'salt', 4.73, 100.06, None, 41.32, 135.98, -0.01, 821.06, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:46:15.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:46:15.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:46:15.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:45:45, diff=30.738421s, valid=True
2026-06-03T18:46:15.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:46:15.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:46:15.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:46:12, diff=3.741924s, valid=True
2026-06-03T18:46:15.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:46:15.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:46:15.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:45:38, diff=37.750092s, valid=True
2026-06-03T18:46:15.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:46:15.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:46:15.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:46:15.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:46:15.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:46:15.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:46:15.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:46:12, diff=3.753834s, valid=True
2026-06-03T18:46:15.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:46:15.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:46:15.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:46:15.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79372.754646s, valid=False
2026-06-03T18:46:15.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:46:15.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:46:15.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:46:15.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:46:15.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:46:15.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:46:15.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:46:15.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:46:15.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:46:15.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:46:16.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:46:16.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:46:16.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:46:16.142 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:46:16.340 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:46:16.671 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:46:16.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:46:16.772 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:46:16.772 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:46:16.953 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:46:16.953 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:46:46.982 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:46:46.982 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:46:46.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:46:47.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:46:47.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:46:47.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:46:47.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:46:47.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:46:47.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:46:47.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:46:47.587 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:46:47.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:46:47.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:46:50.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:46:50.325 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:46:50.326 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:46:50.326 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:46:50.335 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:46:50.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:46:50.348 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:46:50.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:46:50.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:46:50.349 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:46:50.349 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:46:50.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:46:50.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:46:50.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:46:50.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:46:50.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:46:50.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:46:50.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:46:50.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:46:50.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:46:50.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:46:50.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:46:50.686 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:46:50.758 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:46:46
2026-06-03T18:46:50.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86774, datetime.datetime(2026, 6, 3, 18, 46, 46), datetime.datetime(2026, 6, 3, 18, 46, 46), 'salt', 4.73, 100.1, None, 33.87, 134.62, -0.02, 821.37, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:46:50.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:46:50.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:46:50.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:46:46, diff=4.765265s, valid=True
2026-06-03T18:46:50.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:46:50.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:46:50.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:47:12, diff=-21.231294s, valid=True
2026-06-03T18:46:50.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:46:50.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:46:50.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:46:40, diff=10.776729s, valid=True
2026-06-03T18:46:50.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:46:50.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:46:50.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:46:50.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:46:50.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:46:50.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:46:50.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:47:12, diff=-21.219584s, valid=True
2026-06-03T18:46:50.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:46:50.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:46:50.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:46:50.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79407.781232s, valid=False
2026-06-03T18:46:50.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:46:50.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:46:50.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:46:50.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:46:50.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:46:50.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:46:50.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:46:50.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:46:50.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:46:50.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:46:50.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:46:51.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:46:51.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:46:51.104 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:46:51.303 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:46:51.640 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:46:51.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:46:51.741 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:46:51.741 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:46:52.003 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:46:52.003 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:47:22.033 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:47:22.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:47:22.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:47:22.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:47:22.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:47:22.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:47:22.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:47:22.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:47:22.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:47:22.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:47:22.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:47:22.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:47:22.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:47:25.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:47:25.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:47:25.272 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:47:25.272 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:47:25.284 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:47:25.297 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:47:25.298 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:47:25.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:47:25.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:47:25.299 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:47:25.299 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:47:25.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:47:25.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:47:25.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:47:25.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:47:25.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:47:25.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:47:25.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:47:25.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:47:25.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:47:25.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:47:25.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:47:25.721 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:47:25.796 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:47:17
2026-06-03T18:47:25.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86775, datetime.datetime(2026, 6, 3, 18, 47, 17), datetime.datetime(2026, 6, 3, 18, 47, 16), 'salt', 4.66, 100.03, None, 41.53, 135.93, -0.01, 821.18, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:47:25.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:47:25.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:47:25.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:47:16, diff=9.80278s, valid=True
2026-06-03T18:47:25.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:47:25.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:47:25.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:47:12, diff=13.80565s, valid=True
2026-06-03T18:47:25.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:47:25.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:47:25.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:47:12, diff=13.812268s, valid=True
2026-06-03T18:47:25.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:47:25.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:47:25.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:47:25.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:47:25.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:47:25.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:47:25.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:47:12, diff=13.815308s, valid=True
2026-06-03T18:47:25.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:47:25.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:47:25.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:47:25.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79442.815971s, valid=False
2026-06-03T18:47:25.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:47:25.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:47:25.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:47:25.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:47:25.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:47:25.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:47:25.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:47:25.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:47:25.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:47:25.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:47:26.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:47:26.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:47:26.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:47:26.139 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:47:26.353 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:47:26.735 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:47:26.838 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:47:26.838 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:47:26.838 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:47:26.995 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:47:26.995 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:47:57.020 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:47:57.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:47:57.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:47:57.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:47:57.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:47:57.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:47:57.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:47:57.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:47:57.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:47:57.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:47:57.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:47:57.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:47:57.666 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:48:00.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:48:00.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:48:00.976 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:48:00.976 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:48:00.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:48:00.999 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:48:01.000 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:48:01.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:48:01.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:48:01.001 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:48:01.002 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:48:01.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:48:01.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:48:01.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:48:01.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:48:01.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:48:01.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:48:01.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:48:01.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:48:01.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:48:01.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:48:01.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:48:01.343 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:48:01.426 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:47:47
2026-06-03T18:48:01.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86776, datetime.datetime(2026, 6, 3, 18, 47, 47), datetime.datetime(2026, 6, 3, 18, 47, 46), 'salt', 4.73, 100.1, None, 42.69, 135.16, -0.02, 821.24, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:48:01.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:48:01.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:48:01.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:47:46, diff=15.432754s, valid=True
2026-06-03T18:48:01.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:48:01.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:48:01.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:48:12, diff=-10.564101s, valid=True
2026-06-03T18:48:01.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:48:01.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:48:01.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:47:43, diff=18.443331s, valid=True
2026-06-03T18:48:01.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:48:01.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:48:01.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:48:01.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:48:01.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:48:01.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:48:01.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:48:12, diff=-10.553328s, valid=True
2026-06-03T18:48:01.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:48:01.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:48:01.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:48:01.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79478.447398s, valid=False
2026-06-03T18:48:01.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:48:01.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:48:01.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:48:01.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:48:01.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:48:01.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:48:01.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:48:01.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:48:01.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:48:01.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:48:01.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:48:01.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:48:01.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:48:01.766 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:48:01.963 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:48:02.299 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:48:02.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:48:02.400 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:48:02.400 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:48:02.582 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:48:02.582 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:48:32.607 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:48:32.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:48:32.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:48:33.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:48:33.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:48:33.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:48:33.429 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:48:33.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:48:33.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:48:33.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:48:33.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:48:33.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:48:33.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:48:36.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:48:36.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:48:36.160 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:48:36.160 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:48:36.170 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:48:36.183 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:48:36.184 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:48:36.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:48:36.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:48:36.185 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:48:36.185 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:48:36.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:48:36.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:48:36.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:48:36.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:48:36.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:48:36.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:48:36.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:48:36.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:48:36.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:48:36.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:48:36.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:48:36.517 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:48:36.590 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:48:17
2026-06-03T18:48:36.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86777, datetime.datetime(2026, 6, 3, 18, 48, 17), datetime.datetime(2026, 6, 3, 18, 48, 16), 'salt', 4.73, 100.16, None, 36.94, 134.99, -0.03, 821.25, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:48:36.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:48:36.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:48:36.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:48:16, diff=20.598068s, valid=True
2026-06-03T18:48:36.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:48:36.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:48:36.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:48:12, diff=24.601577s, valid=True
2026-06-03T18:48:36.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:48:36.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:48:36.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:48:14, diff=22.609608s, valid=True
2026-06-03T18:48:36.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:48:36.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:48:36.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:48:36.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:48:36.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:48:36.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:48:36.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:48:12, diff=24.613331s, valid=True
2026-06-03T18:48:36.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:48:36.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:48:36.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:48:36.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79513.614176s, valid=False
2026-06-03T18:48:36.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:48:36.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:48:36.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:48:36.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:48:36.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:48:36.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:48:36.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:48:36.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:48:36.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:48:36.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:48:36.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:48:36.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:48:36.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:48:36.933 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:48:37.131 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:48:37.469 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:48:37.571 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:48:37.571 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:48:37.571 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:48:37.822 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:48:37.822 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:49:07.831 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:49:07.831 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:49:07.831 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:49:07.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:49:07.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:49:08.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:49:08.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:49:08.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:49:08.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:49:08.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:49:08.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:49:08.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:49:08.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:49:10.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:49:10.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:49:10.955 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:49:10.955 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:49:10.965 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:49:10.977 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:49:10.977 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:49:10.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:49:10.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:49:10.978 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:49:10.978 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:49:10.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:49:11.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:49:11.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:49:11.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:49:11.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:49:11.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:49:11.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:49:11.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:49:11.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:49:11.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:49:11.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:49:11.269 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:49:11.340 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:48:47
2026-06-03T18:49:11.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86778, datetime.datetime(2026, 6, 3, 18, 48, 47), datetime.datetime(2026, 6, 3, 18, 48, 47), 'salt', 4.73, 100.13, None, 40.33, 144.06, -0.02, 821.43, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:49:11.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:49:11.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:49:11.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:48:47, diff=24.348638s, valid=True
2026-06-03T18:49:11.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:49:11.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:49:11.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:49:12, diff=-0.647742s, valid=True
2026-06-03T18:49:11.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:49:11.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:49:11.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:48:46, diff=25.361341s, valid=True
2026-06-03T18:49:11.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:49:11.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:49:11.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:49:11.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:49:11.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:49:11.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:49:11.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:49:12, diff=-0.635006s, valid=True
2026-06-03T18:49:11.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:49:11.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:49:11.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:49:11.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79548.365817s, valid=False
2026-06-03T18:49:11.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:49:11.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:49:11.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:49:11.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:49:11.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:49:11.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:49:11.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:49:11.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:49:11.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:49:11.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:49:11.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:49:11.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:49:11.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:49:11.700 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:49:11.898 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:49:12.230 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:49:12.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:49:12.389 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:49:12.389 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:49:12.563 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:49:12.563 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:49:42.593 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:49:42.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:49:42.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:49:42.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:49:42.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:49:42.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:49:42.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:49:42.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:49:42.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:49:43.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:49:43.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:49:43.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:49:43.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:49:45.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:49:45.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:49:45.706 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:49:45.706 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:49:45.716 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:49:45.729 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:49:45.729 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:49:45.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:49:45.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:49:45.730 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:49:45.731 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:49:45.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:49:45.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:49:45.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:49:45.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:49:45.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:49:46.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:49:46.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:49:46.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:49:46.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:49:46.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:49:46.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:49:46.059 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:49:46.149 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:49:18
2026-06-03T18:49:46.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86779, datetime.datetime(2026, 6, 3, 18, 49, 18), datetime.datetime(2026, 6, 3, 18, 49, 17), 'salt', 4.66, 100.0, None, 40.15, 139.36, -0.01, 821.18, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:49:46.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:49:46.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:49:46.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:49:17, diff=29.155539s, valid=True
2026-06-03T18:49:46.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:49:46.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:49:46.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:49:12, diff=34.15842s, valid=True
2026-06-03T18:49:46.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:49:46.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:49:46.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:49:17, diff=29.16503s, valid=True
2026-06-03T18:49:46.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:49:46.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:49:46.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:49:46.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:49:46.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:49:46.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:49:46.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:49:12, diff=34.168068s, valid=True
2026-06-03T18:49:46.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:49:46.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:49:46.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:49:46.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79583.168722s, valid=False
2026-06-03T18:49:46.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:49:46.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:49:46.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:49:46.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:49:46.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:49:46.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:49:46.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:49:46.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:49:46.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:49:46.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:49:46.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:49:46.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:49:46.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:49:46.482 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:49:46.702 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:49:47.037 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:49:47.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:49:47.138 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:49:47.138 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:49:47.291 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:49:47.291 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:50:17.321 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:50:17.322 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:50:17.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:50:17.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:50:17.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:50:17.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:50:17.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:50:17.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:50:17.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:50:17.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:50:17.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:50:17.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:50:17.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:50:20.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:50:20.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:50:20.388 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:50:20.388 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:50:20.401 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:50:20.413 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:50:20.414 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:50:20.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:50:20.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:50:20.415 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:50:20.415 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:50:20.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:50:20.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:50:20.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:50:20.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:50:20.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:50:20.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:50:20.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:50:20.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:50:20.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:50:20.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:50:20.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:50:20.741 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:50:20.813 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:50:18
2026-06-03T18:50:20.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86781, datetime.datetime(2026, 6, 3, 18, 50, 18), datetime.datetime(2026, 6, 3, 18, 50, 17), 'salt', 4.7, 100.06, None, 41.07, 137.48, -0.01, 821.19, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:50:20.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:50:20.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:50:20.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:50:17, diff=3.82078s, valid=True
2026-06-03T18:50:20.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:50:20.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:50:20.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:50:12, diff=8.824136s, valid=True
2026-06-03T18:50:20.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:50:20.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:50:20.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:50:10, diff=10.832034s, valid=True
2026-06-03T18:50:20.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:50:20.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:50:20.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:50:20.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:50:20.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:50:20.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:50:20.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:50:12, diff=8.835641s, valid=True
2026-06-03T18:50:20.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:50:20.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:50:20.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:50:20.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79617.836419s, valid=False
2026-06-03T18:50:20.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:50:20.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:50:20.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:50:20.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:50:20.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:50:20.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:50:20.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:50:20.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:50:20.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:50:20.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:50:21.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:50:21.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:50:21.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:50:21.155 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:50:21.437 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:50:21.780 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:50:21.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:50:21.884 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:50:21.884 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:50:22.068 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:50:22.069 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:50:52.099 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:50:52.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:50:52.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:50:52.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:50:52.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:50:52.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:50:52.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:50:52.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:50:52.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:50:52.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:50:52.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:50:52.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:50:52.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:50:55.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:50:55.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:50:55.569 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:50:55.570 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:50:55.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:50:55.593 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:50:55.594 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:50:55.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:50:55.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:50:55.595 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:50:55.595 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:50:55.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:50:55.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:50:55.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:50:55.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:50:55.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:50:55.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:50:55.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:50:55.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:50:55.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:50:55.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:50:55.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:50:55.930 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:50:56.002 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:50:48
2026-06-03T18:50:56.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86782, datetime.datetime(2026, 6, 3, 18, 50, 48), datetime.datetime(2026, 6, 3, 18, 50, 48), 'salt', 4.63, 100.1, None, 43.68, 135.23, -0.02, 821.06, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:50:56.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:50:56.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:50:56.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:50:48, diff=8.010215s, valid=True
2026-06-03T18:50:56.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:50:56.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:50:56.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:51:12, diff=-15.986289s, valid=True
2026-06-03T18:50:56.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:50:56.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:50:56.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:50:42, diff=14.02184s, valid=True
2026-06-03T18:50:56.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:50:56.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:50:56.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:50:56.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:50:56.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:50:56.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:50:56.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:51:12, diff=-15.974429s, valid=True
2026-06-03T18:50:56.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:50:56.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:50:56.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:50:56.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79653.026386s, valid=False
2026-06-03T18:50:56.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:50:56.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:50:56.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:50:56.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:50:56.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:50:56.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:50:56.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:50:56.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:50:56.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:50:56.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:50:56.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:50:56.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:50:56.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:50:56.353 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:50:56.561 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:50:56.905 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:50:57.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:50:57.009 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:50:57.009 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:50:57.163 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:50:57.163 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:51:27.172 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:51:27.172 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:51:27.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:51:27.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:51:27.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:51:27.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:51:27.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:51:27.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:51:27.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:51:27.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:51:27.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:51:27.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:51:27.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:51:30.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:51:30.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:51:30.279 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:51:30.280 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:51:30.290 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:51:30.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:51:30.303 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:51:30.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:51:30.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:51:30.304 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:51:30.304 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:51:30.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:51:30.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:51:30.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:51:30.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:51:30.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:51:30.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:51:30.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:51:30.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:51:30.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:51:30.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:51:30.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:51:30.653 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:51:30.738 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:51:19
2026-06-03T18:51:30.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86783, datetime.datetime(2026, 6, 3, 18, 51, 19), datetime.datetime(2026, 6, 3, 18, 51, 18), 'salt', 4.6, 100.1, None, 42.8, 128.58, -0.01, 821.19, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:51:30.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:51:30.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:51:30.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:51:18, diff=12.745848s, valid=True
2026-06-03T18:51:30.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:51:30.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:51:30.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:51:12, diff=18.749525s, valid=True
2026-06-03T18:51:30.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:51:30.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:51:30.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:51:14, diff=16.757939s, valid=True
2026-06-03T18:51:30.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:51:30.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:51:30.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:51:30.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:51:30.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:51:30.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:51:30.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:51:12, diff=18.761788s, valid=True
2026-06-03T18:51:30.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:51:30.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:51:30.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:51:30.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79687.762643s, valid=False
2026-06-03T18:51:30.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:51:30.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:51:30.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:51:30.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:51:30.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:51:30.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:51:30.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:51:30.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:51:30.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:51:30.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:51:30.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:51:30.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:51:31.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:51:31.153 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:51:31.361 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:51:31.705 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:51:31.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:51:31.810 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:51:31.810 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:51:32.040 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:51:32.040 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:52:02.063 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:52:02.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:52:02.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:52:02.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:52:02.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:52:02.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:52:02.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:52:02.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:52:02.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:52:02.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:52:02.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:52:02.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:52:02.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:52:05.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:52:05.098 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:52:05.099 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:52:05.099 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:52:05.109 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:52:05.122 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:52:05.122 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:52:05.123 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:52:05.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:52:05.124 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:52:05.124 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:52:05.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:52:05.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:52:05.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:52:05.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:52:05.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:52:05.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:52:05.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:52:05.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:52:05.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:52:05.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:52:05.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:52:05.459 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:52:05.529 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:51:49
2026-06-03T18:52:05.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86784, datetime.datetime(2026, 6, 3, 18, 51, 49), datetime.datetime(2026, 6, 3, 18, 51, 48), 'salt', 4.6, 100.1, None, 32.96, 134.9, -0.01, 821.19, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:52:05.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:52:05.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:52:05.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:51:48, diff=17.536774s, valid=True
2026-06-03T18:52:05.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:52:05.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:52:05.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:52:12, diff=-6.459819s, valid=True
2026-06-03T18:52:05.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:52:05.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:52:05.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:51:45, diff=20.548157s, valid=True
2026-06-03T18:52:05.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:52:05.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:52:05.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:52:05.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:52:05.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:52:05.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:52:05.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:52:12, diff=-6.448165s, valid=True
2026-06-03T18:52:05.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:52:05.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:52:05.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:52:05.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79722.552636s, valid=False
2026-06-03T18:52:05.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:52:05.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:52:05.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:52:05.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:52:05.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:52:05.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:52:05.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:52:05.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:52:05.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:52:05.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:52:05.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:52:05.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:52:05.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:52:05.874 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:52:06.082 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:52:06.423 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:52:06.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:52:06.527 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:52:06.527 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:52:06.711 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:52:06.711 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:52:36.741 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:52:36.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:52:36.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:52:36.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:52:36.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:52:37.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:52:37.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:52:37.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:52:37.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:52:37.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:52:37.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:52:37.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:52:37.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:52:39.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:52:39.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:52:39.890 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:52:39.890 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:52:39.898 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:52:39.910 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:52:39.910 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:52:39.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:52:39.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:52:39.911 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:52:39.911 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:52:39.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:52:40.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:52:40.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:52:40.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:52:40.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:52:40.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:52:40.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:52:40.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:52:40.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:52:40.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:52:40.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:52:40.215 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:52:40.290 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:52:19
2026-06-03T18:52:40.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86785, datetime.datetime(2026, 6, 3, 18, 52, 19), datetime.datetime(2026, 6, 3, 18, 52, 18), 'salt', 4.56, 100.06, None, 38.35, 135.51, -0.02, 821.19, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:52:40.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:52:40.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:52:40.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:52:18, diff=22.297329s, valid=True
2026-06-03T18:52:40.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:52:40.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:52:40.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:52:12, diff=28.300586s, valid=True
2026-06-03T18:52:40.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:52:40.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:52:40.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:52:16, diff=24.308231s, valid=True
2026-06-03T18:52:40.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:52:40.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:52:40.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:52:40.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:52:40.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:52:40.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:52:40.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:52:12, diff=28.311864s, valid=True
2026-06-03T18:52:40.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:52:40.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:52:40.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:52:40.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79757.312633s, valid=False
2026-06-03T18:52:40.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:52:40.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:52:40.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:52:40.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:52:40.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:52:40.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:52:40.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:52:40.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:52:40.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:52:40.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:52:40.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:52:40.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:52:40.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:52:40.698 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:52:40.905 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:52:41.246 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:52:41.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:52:41.349 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:52:41.349 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:52:41.439 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:52:41.440 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:53:11.470 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:53:11.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:53:11.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:53:11.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:53:11.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:53:12.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:53:12.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:53:12.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:53:12.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:53:12.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:53:12.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:53:12.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:53:12.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:53:14.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:53:14.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:53:14.955 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:53:14.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:53:14.966 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:53:14.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:53:14.980 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:53:14.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:53:14.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:53:14.981 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:53:14.981 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:53:14.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:53:15.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:53:15.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:53:15.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:53:15.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:53:15.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:53:15.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:53:15.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:53:15.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:53:15.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:53:15.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:53:15.314 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:53:15.434 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:52:49
2026-06-03T18:53:15.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86786, datetime.datetime(2026, 6, 3, 18, 52, 49), datetime.datetime(2026, 6, 3, 18, 52, 49), 'salt', 4.66, 100.16, None, 43.75, 133.42, -0.03, 821.19, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:53:15.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:53:15.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:53:15.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:52:49, diff=26.441563s, valid=True
2026-06-03T18:53:15.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:53:15.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:53:15.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:53:12, diff=3.445076s, valid=True
2026-06-03T18:53:15.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:53:15.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:53:15.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:52:48, diff=27.453329s, valid=True
2026-06-03T18:53:15.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:53:15.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:53:15.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:53:15.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:53:15.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:53:15.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:53:15.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:53:12, diff=3.457072s, valid=True
2026-06-03T18:53:15.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:53:15.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:53:15.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:53:15.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79792.457889s, valid=False
2026-06-03T18:53:15.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:53:15.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:53:15.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:53:15.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:53:15.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:53:15.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:53:15.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:53:15.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:53:15.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:53:15.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:53:15.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:53:15.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:53:15.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:53:15.779 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:53:15.987 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:53:16.330 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:53:16.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:53:16.432 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:53:16.432 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:53:16.620 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:53:16.620 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:53:46.649 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:53:46.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:53:46.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:53:46.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:53:46.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:53:47.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:53:47.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:53:47.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:53:47.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:53:47.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:53:47.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:53:47.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:53:47.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:53:49.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:53:49.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:53:49.931 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:53:49.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:53:49.939 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:53:49.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:53:49.951 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:53:49.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:53:49.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:53:49.951 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:53:49.951 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:53:49.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:53:50.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:53:50.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:53:50.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:53:50.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:53:50.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:53:50.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:53:50.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:53:50.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:53:50.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:53:50.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:53:50.329 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:53:50.409 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:53:20
2026-06-03T18:53:50.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86787, datetime.datetime(2026, 6, 3, 18, 53, 20), datetime.datetime(2026, 6, 3, 18, 53, 19), 'salt', 4.6, 100.1, None, 44.77, 127.9, -0.01, 821.25, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:53:50.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:53:50.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:53:50.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:53:49, diff=1.415565s, valid=True
2026-06-03T18:53:50.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:53:50.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:53:50.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:54:12, diff=-21.58155s, valid=True
2026-06-03T18:53:50.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:53:50.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:53:50.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:53:42, diff=8.425038s, valid=True
2026-06-03T18:53:50.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:53:50.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:53:50.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:53:50.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:53:50.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:53:50.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:53:50.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:54:12, diff=-21.571954s, valid=True
2026-06-03T18:53:50.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:53:50.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:53:50.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:53:50.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79827.428693s, valid=False
2026-06-03T18:53:50.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:53:50.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:53:50.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:53:50.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:53:50.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:53:50.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:53:50.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:53:50.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:53:50.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:53:50.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:53:50.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:53:50.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:53:50.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:53:50.742 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:53:50.947 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:53:51.287 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:53:51.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:53:51.390 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:53:51.390 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:53:51.479 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:53:51.479 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:54:21.495 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:54:21.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:54:21.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:54:21.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:54:21.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:54:22.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:54:22.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:54:22.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:54:22.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:54:22.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:54:22.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:54:22.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:54:22.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:54:24.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:54:24.757 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:54:24.757 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:54:24.757 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:54:24.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:54:24.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:54:24.779 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:54:24.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:54:24.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:54:24.780 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:54:24.780 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:54:24.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:54:24.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:54:24.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:54:25.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:54:25.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:54:25.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:54:25.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:54:25.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:54:25.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:54:25.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:54:25.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:54:25.128 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:54:25.207 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:54:20
2026-06-03T18:54:25.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86789, datetime.datetime(2026, 6, 3, 18, 54, 20), datetime.datetime(2026, 6, 3, 18, 54, 19), 'salt', 4.63, 100.13, None, 40.15, 137.48, -0.02, 821.25, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:54:25.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:54:25.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:54:25.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:54:19, diff=6.214799s, valid=True
2026-06-03T18:54:25.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:54:25.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:54:25.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:54:12, diff=13.218351s, valid=True
2026-06-03T18:54:25.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:54:25.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:54:25.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:54:12, diff=13.226328s, valid=True
2026-06-03T18:54:25.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:54:25.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:54:25.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:54:25.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:54:25.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:54:25.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:54:25.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:54:12, diff=13.229953s, valid=True
2026-06-03T18:54:25.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:54:25.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:54:25.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:54:25.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79862.23073s, valid=False
2026-06-03T18:54:25.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:54:25.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:54:25.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:54:25.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:54:25.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:54:25.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:54:25.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:54:25.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:54:25.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:54:25.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:54:25.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:54:25.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:54:25.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:54:25.549 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:54:25.755 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:54:26.095 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:54:26.197 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:54:26.197 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:54:26.197 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:54:26.432 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:54:26.432 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:54:56.452 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:54:56.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:54:56.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:54:56.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:54:56.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:54:57.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:54:57.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:54:57.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:54:57.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:54:57.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:54:57.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:54:57.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:54:57.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:54:59.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:54:59.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:54:59.943 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:54:59.943 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:54:59.954 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:54:59.966 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:54:59.966 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:54:59.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:54:59.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:54:59.966 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:54:59.966 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:54:59.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:55:00.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:55:00.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:55:00.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:55:00.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:55:00.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:55:00.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:55:00.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:55:00.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:55:00.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:55:00.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:55:00.254 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:55:00.330 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:54:50
2026-06-03T18:55:00.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86790, datetime.datetime(2026, 6, 3, 18, 54, 50), datetime.datetime(2026, 6, 3, 18, 54, 50), 'salt', 4.6, 100.1, None, 36.13, 127.2, -0.01, 821.31, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:55:00.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:55:00.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:55:00.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:54:50, diff=10.337652s, valid=True
2026-06-03T18:55:00.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:55:00.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:55:00.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:55:12, diff=-11.659199s, valid=True
2026-06-03T18:55:00.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:55:00.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:55:00.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:54:43, diff=17.348278s, valid=True
2026-06-03T18:55:00.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:55:00.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:55:00.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:55:00.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:55:00.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:55:00.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:55:00.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:55:12, diff=-11.64836s, valid=True
2026-06-03T18:55:00.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:55:00.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:55:00.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:55:00.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79897.352355s, valid=False
2026-06-03T18:55:00.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:55:00.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:55:00.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:55:00.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:55:00.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:55:00.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:55:00.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:55:00.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:55:00.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:55:00.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:55:00.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:55:00.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:55:00.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:55:00.668 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:55:00.875 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:55:01.247 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:55:01.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:55:01.349 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:55:01.349 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:55:01.441 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:55:01.441 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:55:31.461 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:55:31.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:55:31.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:55:31.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:55:31.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:55:31.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:55:31.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:55:31.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:55:31.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:55:31.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:55:31.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:55:31.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:55:31.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:55:34.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:55:34.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:55:34.633 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:55:34.633 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:55:34.644 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:55:34.656 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:55:34.657 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:55:34.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:55:34.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:55:34.658 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:55:34.658 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:55:34.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:55:34.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:55:34.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:55:34.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:55:34.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:55:34.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:55:34.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:55:34.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:55:34.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:55:34.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:55:34.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:55:34.990 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:55:35.062 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:55:21
2026-06-03T18:55:35.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86791, datetime.datetime(2026, 6, 3, 18, 55, 21), datetime.datetime(2026, 6, 3, 18, 55, 20), 'salt', 4.63, 100.16, None, 33.8, 113.65, -0.03, 821.37, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:55:35.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:55:35.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:55:35.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:55:20, diff=15.070061s, valid=True
2026-06-03T18:55:35.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:55:35.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:55:35.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:55:12, diff=23.073572s, valid=True
2026-06-03T18:55:35.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:55:35.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:55:35.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:55:15, diff=20.081856s, valid=True
2026-06-03T18:55:35.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:55:35.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:55:35.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:55:35.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:55:35.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:55:35.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:55:35.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:55:12, diff=23.085827s, valid=True
2026-06-03T18:55:35.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:55:35.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:55:35.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:55:35.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79932.086768s, valid=False
2026-06-03T18:55:35.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:55:35.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:55:35.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:55:35.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:55:35.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:55:35.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:55:35.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:55:35.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:55:35.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:55:35.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:55:35.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:55:35.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:55:35.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:55:35.414 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:55:35.623 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:55:36.024 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:55:36.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:55:36.126 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:55:36.126 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:55:36.316 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:55:36.317 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:56:06.346 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:56:06.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:56:06.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:56:06.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:56:06.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:56:06.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:56:06.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:56:06.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:56:06.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:56:06.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:56:06.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:56:06.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:56:06.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:56:09.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:56:09.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:56:09.621 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:56:09.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:56:09.633 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:56:09.646 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:56:09.646 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:56:09.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:56:09.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:56:09.648 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:56:09.648 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:56:09.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:56:09.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:56:09.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:56:09.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:56:09.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:56:09.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:56:09.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:56:09.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:56:09.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:56:09.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:56:09.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:56:09.980 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:56:10.056 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:55:51
2026-06-03T18:56:10.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86792, datetime.datetime(2026, 6, 3, 18, 55, 51), datetime.datetime(2026, 6, 3, 18, 55, 50), 'salt', 4.6, 100.13, None, 30.13, 130.67, -0.02, 821.43, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:56:10.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:56:10.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:56:10.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:55:50, diff=20.064474s, valid=True
2026-06-03T18:56:10.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:56:10.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:56:10.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:56:12, diff=-1.93195s, valid=True
2026-06-03T18:56:10.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:56:10.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:56:10.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:55:46, diff=24.076563s, valid=True
2026-06-03T18:56:10.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:56:10.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:56:10.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:56:10.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:56:10.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:56:10.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:56:10.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:56:12, diff=-1.919545s, valid=True
2026-06-03T18:56:10.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:56:10.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:56:10.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:56:10.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=79967.081308s, valid=False
2026-06-03T18:56:10.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:56:10.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:56:10.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:56:10.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:56:10.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:56:10.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:56:10.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:56:10.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:56:10.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:56:10.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:56:10.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:56:10.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:56:10.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:56:10.445 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:56:10.675 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:56:11.017 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:56:11.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:56:11.121 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:56:11.121 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:56:11.302 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:56:11.302 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:56:41.312 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:56:41.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:56:41.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:56:41.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:56:41.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:56:41.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:56:41.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:56:41.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:56:41.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:56:41.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:56:41.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:56:41.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:56:41.768 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:56:44.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:56:44.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:56:44.942 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:56:44.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:56:44.952 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:56:44.965 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:56:44.965 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:56:44.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:56:44.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:56:44.967 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:56:44.967 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:56:44.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:56:45.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:56:45.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:56:45.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:56:45.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:56:45.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:56:45.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:56:45.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:56:45.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:56:45.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:56:45.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:56:45.312 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:56:45.388 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:56:21
2026-06-03T18:56:45.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86793, datetime.datetime(2026, 6, 3, 18, 56, 21), datetime.datetime(2026, 6, 3, 18, 56, 21), 'salt', 4.56, 100.1, None, 25.76, 138.0, -0.02, 821.62, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:56:45.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:56:45.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:56:45.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:56:21, diff=24.39609s, valid=True
2026-06-03T18:56:45.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:56:45.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:56:45.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:56:12, diff=33.399598s, valid=True
2026-06-03T18:56:45.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:56:45.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:56:45.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:56:17, diff=28.407838s, valid=True
2026-06-03T18:56:45.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:56:45.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:56:45.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:56:45.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:56:45.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:56:45.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:56:45.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:56:12, diff=33.411574s, valid=True
2026-06-03T18:56:45.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:56:45.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:56:45.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:56:45.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80002.412389s, valid=False
2026-06-03T18:56:45.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:56:45.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:56:45.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:56:45.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:56:45.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:56:45.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:56:45.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:56:45.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:56:45.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:56:45.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:56:45.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:56:45.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:56:45.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:56:45.734 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:56:46.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:56:46.353 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:56:46.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:56:46.456 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:56:46.456 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:56:46.642 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:56:46.643 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:57:16.668 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:57:16.668 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:57:16.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:57:16.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:57:16.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:57:17.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:57:17.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:57:17.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:57:17.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:57:17.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:57:17.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:57:17.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:57:17.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:57:19.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:57:20.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:57:20.001 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:57:20.001 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:57:20.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:57:20.023 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:57:20.023 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:57:20.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:57:20.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:57:20.024 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:57:20.024 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:57:20.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:57:20.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:57:20.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:57:20.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:57:20.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:57:20.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:57:20.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:57:20.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:57:20.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:57:20.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:57:20.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:57:20.325 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:57:20.404 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:56:51
2026-06-03T18:57:20.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86794, datetime.datetime(2026, 6, 3, 18, 56, 51), datetime.datetime(2026, 6, 3, 18, 56, 51), 'salt', 4.56, 100.0, None, 33.73, 126.63, -0.01, 821.31, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T18:57:20.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:57:20.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:57:20.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:56:51, diff=29.411914s, valid=True
2026-06-03T18:57:20.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:57:20.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:57:20.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:57:12, diff=8.415159s, valid=True
2026-06-03T18:57:20.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:57:20.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:57:20.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:56:49, diff=31.422732s, valid=True
2026-06-03T18:57:20.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:57:20.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:57:20.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:57:20.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:57:20.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:57:20.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:57:20.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:57:12, diff=8.426223s, valid=True
2026-06-03T18:57:20.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:57:20.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:57:20.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:57:20.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80037.42699s, valid=False
2026-06-03T18:57:20.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:57:20.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:57:20.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:57:20.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:57:20.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:57:20.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:57:20.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:57:20.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:57:20.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:57:20.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:57:20.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:57:20.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:57:20.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:57:20.745 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:57:20.950 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:57:21.289 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:57:21.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:57:21.392 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:57:21.392 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:57:21.583 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:57:21.584 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:57:51.614 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:57:51.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:57:51.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:57:51.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:57:51.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:57:52.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:57:52.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:57:52.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:57:52.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:57:52.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:57:52.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:57:52.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:57:52.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:57:54.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:57:54.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:57:54.980 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:57:54.980 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:57:54.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:57:54.998 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:57:54.998 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:57:54.998 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:57:54.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:57:54.999 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:57:54.999 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:57:55.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:57:55.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:57:55.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:57:55.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:57:55.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:57:55.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:57:55.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:57:55.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:57:55.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:57:55.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:57:55.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:57:55.297 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:57:55.400 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:57:52
2026-06-03T18:57:55.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86796, datetime.datetime(2026, 6, 3, 18, 57, 52), datetime.datetime(2026, 6, 3, 18, 57, 51), 'salt', 4.63, 100.03, None, 40.93, 131.31, -0.01, 821.62, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T18:57:55.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:57:55.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:57:55.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:57:51, diff=4.406986s, valid=True
2026-06-03T18:57:55.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:57:55.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:57:55.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:58:12, diff=-16.589745s, valid=True
2026-06-03T18:57:55.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:57:55.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:57:55.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:57:45, diff=10.417822s, valid=True
2026-06-03T18:57:55.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:57:55.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:57:55.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:57:55.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:57:55.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:57:55.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:57:55.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:58:12, diff=-16.578707s, valid=True
2026-06-03T18:57:55.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:57:55.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:57:55.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:57:55.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80072.422148s, valid=False
2026-06-03T18:57:55.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:57:55.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:57:55.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:57:55.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:57:55.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:57:55.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:57:55.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:57:55.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:57:55.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:57:55.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:57:55.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:57:55.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:57:55.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:57:55.813 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:57:56.018 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:57:56.356 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:57:56.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:57:56.458 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:57:56.458 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:57:56.704 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:57:56.704 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:58:26.735 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:58:26.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:58:26.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:58:26.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:58:26.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:58:27.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:58:27.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:58:27.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:58:27.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:58:27.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:58:27.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:58:27.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:58:27.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:58:30.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:58:30.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:58:30.181 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:58:30.181 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:58:30.191 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:58:30.204 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:58:30.204 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:58:30.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:58:30.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:58:30.205 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:58:30.206 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:58:30.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:58:30.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:58:30.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:58:30.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:58:30.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:58:30.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:58:30.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:58:30.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:58:30.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:58:30.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:58:30.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:58:30.564 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:58:30.638 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:58:22
2026-06-03T18:58:30.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86797, datetime.datetime(2026, 6, 3, 18, 58, 22), datetime.datetime(2026, 6, 3, 18, 58, 21), 'salt', 4.56, 100.07, None, 40.82, 127.48, -0.02, 821.37, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:58:30.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:58:30.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:58:30.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:58:21, diff=9.646025s, valid=True
2026-06-03T18:58:30.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:58:30.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:58:30.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:58:12, diff=18.649648s, valid=True
2026-06-03T18:58:30.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:58:30.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:58:30.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:58:15, diff=15.658045s, valid=True
2026-06-03T18:58:30.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:58:30.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:58:30.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:58:30.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:58:30.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:58:30.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:58:30.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:58:12, diff=18.661914s, valid=True
2026-06-03T18:58:30.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:58:30.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:58:30.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:58:30.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80107.662762s, valid=False
2026-06-03T18:58:30.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:58:30.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:58:30.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:58:30.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:58:30.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:58:30.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:58:30.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:58:30.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:58:30.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:58:30.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:58:30.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:58:30.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:58:30.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:58:30.986 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:58:31.193 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:58:31.538 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:58:31.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:58:31.643 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:58:31.643 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:58:31.829 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:58:31.829 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:59:01.837 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:59:01.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:59:01.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:59:02.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:59:02.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:59:02.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:59:02.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:59:02.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:59:02.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:59:02.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:59:02.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:59:02.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:59:02.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:59:05.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:59:05.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:59:05.233 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:59:05.233 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:59:05.243 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:59:05.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:59:05.257 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:59:05.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:59:05.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:59:05.258 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:59:05.258 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:59:05.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:59:05.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:59:05.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:59:05.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:59:05.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:59:05.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:59:05.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:59:05.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:59:05.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:59:05.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:59:05.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:59:05.615 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:59:05.689 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:58:52
2026-06-03T18:59:05.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86798, datetime.datetime(2026, 6, 3, 18, 58, 52), datetime.datetime(2026, 6, 3, 18, 58, 52), 'salt', 4.63, 100.13, None, 35.99, 130.28, -0.02, 821.37, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:59:05.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:59:05.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:59:05.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:58:52, diff=13.696542s, valid=True
2026-06-03T18:59:05.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:59:05.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:59:05.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:59:12, diff=-6.299966s, valid=True
2026-06-03T18:59:05.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:59:05.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:59:05.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:58:45, diff=20.708288s, valid=True
2026-06-03T18:59:05.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:59:05.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:59:05.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:59:05.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:59:05.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:59:05.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:59:05.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:59:12, diff=-6.28796s, valid=True
2026-06-03T18:59:05.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:59:05.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:59:05.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:59:05.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80142.712854s, valid=False
2026-06-03T18:59:05.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:59:05.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:59:05.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:59:05.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:59:05.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:59:05.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:59:05.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:59:05.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:59:05.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:59:05.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:59:05.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:59:06.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:59:06.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:59:06.101 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:59:06.306 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:59:06.662 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:59:06.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:59:06.764 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:59:06.765 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:59:06.952 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:59:06.953 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T18:59:36.982 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T18:59:36.982 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T18:59:36.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T18:59:37.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T18:59:37.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T18:59:37.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T18:59:37.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T18:59:37.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T18:59:37.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T18:59:37.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T18:59:37.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T18:59:37.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T18:59:37.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T18:59:40.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T18:59:40.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T18:59:40.336 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T18:59:40.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T18:59:40.346 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T18:59:40.359 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T18:59:40.360 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T18:59:40.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T18:59:40.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T18:59:40.361 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T18:59:40.361 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T18:59:40.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T18:59:40.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T18:59:40.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T18:59:40.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T18:59:40.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:59:40.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:59:40.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T18:59:40.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T18:59:40.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T18:59:40.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T18:59:40.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T18:59:40.707 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T18:59:40.794 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:59:23
2026-06-03T18:59:40.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86799, datetime.datetime(2026, 6, 3, 18, 59, 23), datetime.datetime(2026, 6, 3, 18, 59, 22), 'salt', 4.63, 100.13, None, 31.05, 132.18, -0.02, 821.49, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T18:59:40.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T18:59:40.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T18:59:40.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:59:22, diff=18.801693s, valid=True
2026-06-03T18:59:40.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T18:59:40.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:59:40.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:59:12, diff=28.805178s, valid=True
2026-06-03T18:59:40.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T18:59:40.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T18:59:40.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:59:16, diff=24.813256s, valid=True
2026-06-03T18:59:40.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T18:59:40.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:59:40.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T18:59:40.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T18:59:40.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T18:59:40.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T18:59:40.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:59:12, diff=28.816967s, valid=True
2026-06-03T18:59:40.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T18:59:40.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T18:59:40.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T18:59:40.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80177.817791s, valid=False
2026-06-03T18:59:40.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T18:59:40.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T18:59:40.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T18:59:40.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T18:59:40.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T18:59:40.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T18:59:40.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T18:59:40.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T18:59:40.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T18:59:40.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T18:59:41.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T18:59:41.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T18:59:41.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T18:59:41.138 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T18:59:41.343 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:59:41.682 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T18:59:41.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T18:59:41.781 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T18:59:41.781 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T18:59:41.971 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T18:59:41.972 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:00:11.998 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:00:11.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:00:11.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:00:12.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:00:12.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:00:12.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:00:12.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:00:12.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:00:12.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:00:12.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:00:12.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:00:12.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:00:12.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:00:15.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:00:15.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:00:15.898 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:00:15.898 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:00:15.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:00:15.921 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:00:15.921 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:00:15.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:00:15.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:00:15.923 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:00:15.923 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:00:15.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:00:16.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:00:16.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:00:16.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:00:16.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:00:16.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:00:16.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:00:16.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:00:16.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:00:16.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:00:16.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:00:16.224 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:00:16.298 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 18:59:53
2026-06-03T19:00:16.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86800, datetime.datetime(2026, 6, 3, 18, 59, 53), datetime.datetime(2026, 6, 3, 18, 59, 52), 'salt', 4.63, 100.1, None, 35.35, 126.12, -0.02, 821.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T19:00:16.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:00:16.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:00:16.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:59:52, diff=24.305601s, valid=True
2026-06-03T19:00:16.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:00:16.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:00:16.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:00:12, diff=4.308957s, valid=True
2026-06-03T19:00:16.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:00:16.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:00:16.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 18:59:48, diff=28.316753s, valid=True
2026-06-03T19:00:16.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:00:16.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:00:16.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:00:16.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:00:16.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:00:16.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:00:16.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:00:12, diff=4.320334s, valid=True
2026-06-03T19:00:16.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:00:16.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:00:16.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:00:16.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80213.32112s, valid=False
2026-06-03T19:00:16.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:00:16.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:00:16.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:00:16.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:00:16.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:00:16.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:00:16.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:00:16.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:00:16.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:00:16.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:00:16.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:00:16.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:00:16.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:00:16.708 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:00:16.914 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:00:17.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:00:17.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:00:17.357 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:00:17.357 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:00:17.613 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:00:17.613 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:00:47.644 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:00:47.644 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:00:47.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:00:47.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:00:47.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:00:48.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:00:48.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:00:48.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:00:48.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:00:48.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:00:48.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:00:48.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:00:48.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:00:51.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:00:51.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:00:51.081 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:00:51.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:00:51.091 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:00:51.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:00:51.104 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:00:51.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:00:51.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:00:51.105 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:00:51.105 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:00:51.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:00:51.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:00:51.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:00:51.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:00:51.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:00:51.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:00:51.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:00:51.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:00:51.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:00:51.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:00:51.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:00:51.450 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:00:51.524 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:00:23
2026-06-03T19:00:51.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86801, datetime.datetime(2026, 6, 3, 19, 0, 23), datetime.datetime(2026, 6, 3, 19, 0, 23), 'salt', 4.66, 100.13, None, 35.21, 124.01, -0.03, 821.56, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T19:00:51.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:00:51.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:00:51.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:00:23, diff=28.531824s, valid=True
2026-06-03T19:00:51.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:00:51.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:00:51.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:00:12, diff=39.535325s, valid=True
2026-06-03T19:00:51.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:00:51.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:00:51.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:00:19, diff=32.543547s, valid=True
2026-06-03T19:00:51.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:00:51.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:00:51.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:00:51.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:00:51.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:00:51.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:00:51.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:00:12, diff=39.547264s, valid=True
2026-06-03T19:00:51.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:00:51.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:00:51.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:00:51.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80248.54807s, valid=False
2026-06-03T19:00:51.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:00:51.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:00:51.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:00:51.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:00:51.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:00:51.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:00:51.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:00:51.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:00:51.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:00:51.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:00:51.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:00:51.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:00:51.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:00:51.869 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:00:52.073 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:00:52.411 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:00:52.513 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:00:52.513 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:00:52.513 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:00:52.765 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:00:52.765 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:01:22.770 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:01:22.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:01:22.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:01:22.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:01:22.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:01:23.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:01:23.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:01:23.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:01:23.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:01:23.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:01:23.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:01:23.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:01:23.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:01:26.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:01:26.310 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:01:26.310 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:01:26.311 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:01:26.321 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:01:26.333 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:01:26.334 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:01:26.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:01:26.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:01:26.335 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:01:26.335 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:01:26.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:01:26.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:01:26.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:01:26.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:01:26.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:01:26.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:01:26.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:01:26.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:01:26.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:01:26.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:01:26.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:01:26.744 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:01:26.819 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:01:24
2026-06-03T19:01:26.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86803, datetime.datetime(2026, 6, 3, 19, 1, 24), datetime.datetime(2026, 6, 3, 19, 1, 23), 'salt', 4.6, 100.1, None, 39.52, 131.76, -0.01, 821.68, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:01:26.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:01:26.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:01:26.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:01:23, diff=3.825809s, valid=True
2026-06-03T19:01:26.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:01:26.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:01:26.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:01:12, diff=14.828615s, valid=True
2026-06-03T19:01:26.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:01:26.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:01:26.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:01:22, diff=4.835145s, valid=True
2026-06-03T19:01:26.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:01:26.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:01:26.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:01:26.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:01:26.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:01:26.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:01:26.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:01:12, diff=14.838149s, valid=True
2026-06-03T19:01:26.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:01:26.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:01:26.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:01:26.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80283.838818s, valid=False
2026-06-03T19:01:26.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:01:26.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:01:26.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:01:26.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:01:26.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:01:26.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:01:26.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:01:26.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:01:26.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:01:26.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:01:27.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:01:27.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:01:27.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:01:27.150 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:01:27.354 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:01:27.696 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:01:27.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:01:27.798 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:01:27.798 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:01:28.050 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:01:28.050 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:01:58.059 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:01:58.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:01:58.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:01:58.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:01:58.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:01:58.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:01:58.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:01:58.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:01:58.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:01:58.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:01:58.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:01:58.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:01:58.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:02:01.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:02:01.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:02:01.520 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:02:01.521 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:02:01.531 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:02:01.543 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:02:01.544 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:02:01.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:02:01.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:02:01.545 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:02:01.545 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:02:01.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:02:01.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:02:01.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:02:01.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:02:01.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:02:01.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:02:01.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:02:01.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:02:01.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:02:01.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:02:01.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:02:01.895 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:02:01.973 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:01:54
2026-06-03T19:02:01.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86804, datetime.datetime(2026, 6, 3, 19, 1, 54), datetime.datetime(2026, 6, 3, 19, 1, 53), 'salt', 4.6, 100.13, None, 42.73, 124.01, -0.02, 821.68, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:02:01.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:02:01.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:02:01.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:01:53, diff=8.985253s, valid=True
2026-06-03T19:02:01.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:02:01.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:02:01.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:02:12, diff=-10.011212s, valid=True
2026-06-03T19:02:01.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:02:01.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:02:01.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:01:53, diff=8.997022s, valid=True
2026-06-03T19:02:01.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:02:01.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:02:01.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:02:01.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:02:01.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:02:01.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:02:02.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:02:12, diff=-9.999185s, valid=True
2026-06-03T19:02:02.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:02:02.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:02:02.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:02:02.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80319.001643s, valid=False
2026-06-03T19:02:02.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:02:02.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:02:02.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:02:02.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:02:02.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:02:02.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:02:02.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:02:02.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:02:02.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:02:02.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:02:02.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:02:02.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:02:02.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:02:02.324 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:02:02.534 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:02:02.880 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:02:02.982 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:02:02.983 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:02:02.983 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:02:03.249 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:02:03.249 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:02:33.279 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:02:33.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:02:33.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:02:33.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:02:33.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:02:33.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:02:33.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:02:33.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:02:33.926 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:02:33.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:02:33.939 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:02:33.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:02:33.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:02:36.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:02:36.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:02:36.890 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:02:36.891 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:02:36.900 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:02:36.913 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:02:36.914 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:02:36.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:02:36.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:02:36.915 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:02:36.915 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:02:36.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:02:37.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:02:37.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:02:37.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:02:37.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:02:37.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:02:37.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:02:37.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:02:37.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:02:37.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:02:37.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:02:37.268 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:02:37.345 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:02:24
2026-06-03T19:02:37.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86805, datetime.datetime(2026, 6, 3, 19, 2, 24), datetime.datetime(2026, 6, 3, 19, 2, 24), 'salt', 4.56, 100.03, None, 40.68, 130.65, -0.01, 821.71, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:02:37.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:02:37.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:02:37.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:02:24, diff=13.352461s, valid=True
2026-06-03T19:02:37.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:02:37.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:02:37.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:02:12, diff=25.356003s, valid=True
2026-06-03T19:02:37.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:02:37.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:02:37.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:02:17, diff=20.364298s, valid=True
2026-06-03T19:02:37.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:02:37.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:02:37.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:02:37.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:02:37.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:02:37.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:02:37.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:02:12, diff=25.368131s, valid=True
2026-06-03T19:02:37.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:02:37.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:02:37.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:02:37.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80354.368959s, valid=False
2026-06-03T19:02:37.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:02:37.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:02:37.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:02:37.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:02:37.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:02:37.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:02:37.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:02:37.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:02:37.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:02:37.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:02:37.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:02:37.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:02:37.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:02:37.688 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:02:37.897 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:02:38.252 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:02:38.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:02:38.354 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:02:38.354 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:02:38.609 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:02:38.609 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:03:08.626 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:03:08.626 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:03:08.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:03:08.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:03:08.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:03:09.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:03:09.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:03:09.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:03:09.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:03:09.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:03:09.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:03:09.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:03:09.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:03:12.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:03:12.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:03:12.155 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:03:12.156 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:03:12.169 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:03:12.182 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:03:12.182 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:03:12.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:03:12.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:03:12.184 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:03:12.184 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:03:12.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:03:12.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:03:12.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:03:12.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:03:12.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:03:12.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:03:12.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:03:12.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:03:12.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:03:12.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:03:12.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:03:12.530 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:03:12.601 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:02:55
2026-06-03T19:03:12.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86806, datetime.datetime(2026, 6, 3, 19, 2, 55), datetime.datetime(2026, 6, 3, 19, 2, 54), 'salt', 4.56, 100.1, None, 39.8, 122.27, -0.02, 821.68, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:03:12.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:03:12.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:03:12.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:02:54, diff=18.608181s, valid=True
2026-06-03T19:03:12.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:03:12.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:03:12.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:03:12, diff=0.611045s, valid=True
2026-06-03T19:03:12.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:03:12.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:03:12.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:02:47, diff=25.617687s, valid=True
2026-06-03T19:03:12.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:03:12.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:03:12.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:03:12.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:03:12.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:03:12.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:03:12.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:03:12, diff=0.620776s, valid=True
2026-06-03T19:03:12.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:03:12.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:03:12.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:03:12.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80389.62142s, valid=False
2026-06-03T19:03:12.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:03:12.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:03:12.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:03:12.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:03:12.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:03:12.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:03:12.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:03:12.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:03:12.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:03:12.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:03:12.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:03:12.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:03:13.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:03:13.059 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:03:13.264 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:03:13.663 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:03:13.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:03:13.765 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:03:13.765 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:03:14.045 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:03:14.045 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:03:44.047 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:03:44.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:03:44.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:03:44.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:03:44.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:03:44.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:03:44.427 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:03:44.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:03:44.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:03:44.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:03:44.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:03:44.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:03:44.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:03:47.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:03:47.393 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:03:47.394 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:03:47.394 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:03:47.405 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:03:47.417 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:03:47.418 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:03:47.418 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:03:47.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:03:47.419 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:03:47.419 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:03:47.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:03:47.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:03:47.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:03:47.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:03:47.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:03:47.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:03:47.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:03:47.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:03:47.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:03:47.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:03:47.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:03:47.772 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:03:47.846 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:03:25
2026-06-03T19:03:47.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86807, datetime.datetime(2026, 6, 3, 19, 3, 25), datetime.datetime(2026, 6, 3, 19, 3, 24), 'salt', 4.83, 100.33, None, 37.93, 111.38, -0.05, 821.56, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:03:47.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:03:47.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:03:47.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:03:24, diff=23.854053s, valid=True
2026-06-03T19:03:47.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:03:47.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:03:47.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:03:12, diff=35.857639s, valid=True
2026-06-03T19:03:47.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:03:47.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:03:47.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:03:17, diff=30.8659s, valid=True
2026-06-03T19:03:47.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:03:47.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:03:47.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:03:47.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:03:47.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:03:47.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:03:47.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:03:12, diff=35.869725s, valid=True
2026-06-03T19:03:47.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:03:47.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:03:47.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:03:47.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80424.870527s, valid=False
2026-06-03T19:03:47.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:03:47.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:03:47.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:03:47.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:03:47.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:03:47.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:03:47.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:03:47.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:03:47.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:03:48.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:03:48.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:03:48.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:03:48.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:03:48.195 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:03:48.412 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:03:48.757 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:03:48.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:03:48.861 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:03:48.861 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:03:49.076 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:03:49.076 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:04:19.106 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:04:19.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:04:19.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:04:19.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:04:19.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:04:19.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:04:19.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:04:19.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:04:19.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:04:19.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:04:19.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:04:19.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:04:19.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:04:22.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:04:22.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:04:22.679 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:04:22.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:04:22.690 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:04:22.703 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:04:22.704 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:04:22.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:04:22.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:04:22.705 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:04:22.705 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:04:22.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:04:22.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:04:22.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:04:22.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:04:22.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:04:23.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:04:23.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:04:23.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:04:23.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:04:23.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:04:23.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:04:23.080 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:04:23.171 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:03:55
2026-06-03T19:04:23.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86808, datetime.datetime(2026, 6, 3, 19, 3, 55), datetime.datetime(2026, 6, 3, 19, 3, 54), 'salt', 4.63, 100.1, None, 36.17, 126.9, -0.02, 821.8, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:04:23.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:04:23.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:04:23.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:03:54, diff=29.179584s, valid=True
2026-06-03T19:04:23.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:04:23.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:04:23.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:04:12, diff=11.183294s, valid=True
2026-06-03T19:04:23.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:04:23.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:04:23.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:03:49, diff=34.191916s, valid=True
2026-06-03T19:04:23.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:04:23.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:04:23.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:04:23.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:04:23.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:04:23.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:04:23.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:04:12, diff=11.195973s, valid=True
2026-06-03T19:04:23.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:04:23.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:04:23.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:04:23.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80460.196836s, valid=False
2026-06-03T19:04:23.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:04:23.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:04:23.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:04:23.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:04:23.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:04:23.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:04:23.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:04:23.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:04:23.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:04:23.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:04:23.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:04:23.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:04:23.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:04:23.519 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:04:23.798 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:04:24.137 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:04:24.240 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:04:24.240 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:04:24.240 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:04:24.429 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:04:24.429 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:04:54.454 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:04:54.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:04:54.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:04:54.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:04:54.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:04:55.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:04:55.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:04:55.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:04:55.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:04:55.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:04:55.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:04:55.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:04:55.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:04:57.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:04:57.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:04:57.974 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:04:57.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:04:57.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:04:57.994 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:04:57.994 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:04:57.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:04:57.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:04:57.994 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:04:57.994 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:04:57.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:04:58.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:04:58.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:04:58.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:04:58.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:04:58.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:04:58.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:04:58.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:04:58.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:04:58.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:04:58.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:04:58.288 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:04:58.357 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:04:56
2026-06-03T19:04:58.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86810, datetime.datetime(2026, 6, 3, 19, 4, 56), datetime.datetime(2026, 6, 3, 19, 4, 55), 'salt', 4.5, 100.13, None, 42.66, 119.5, -0.02, 821.56, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:04:58.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:04:58.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:04:58.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:04:55, diff=3.364581s, valid=True
2026-06-03T19:04:58.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:04:58.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:04:58.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:05:12, diff=-13.63216s, valid=True
2026-06-03T19:04:58.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:04:58.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:04:58.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:04:51, diff=7.37557s, valid=True
2026-06-03T19:04:58.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:04:58.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:04:58.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:04:58.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:04:58.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:04:58.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:04:58.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:05:12, diff=-13.620959s, valid=True
2026-06-03T19:04:58.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:04:58.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:04:58.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:04:58.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80495.379795s, valid=False
2026-06-03T19:04:58.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:04:58.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:04:58.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:04:58.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:04:58.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:04:58.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:04:58.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:04:58.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:04:58.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:04:58.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:04:58.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:04:58.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:04:58.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:04:58.697 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:04:58.905 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:04:59.244 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:04:59.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:04:59.348 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:04:59.348 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:04:59.589 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:04:59.590 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:05:29.591 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:05:29.591 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:05:29.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:05:30.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:05:30.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:05:30.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:05:30.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:05:30.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:05:30.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:05:30.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:05:30.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:05:30.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:05:30.353 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:05:33.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:05:33.317 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:05:33.318 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:05:33.318 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:05:33.328 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:05:33.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:05:33.342 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:05:33.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:05:33.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:05:33.343 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:05:33.343 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:05:33.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:05:33.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:05:33.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:05:33.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:05:33.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:05:33.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:05:33.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:05:33.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:05:33.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:05:33.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:05:33.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:05:33.676 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:05:33.747 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:05:26
2026-06-03T19:05:33.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86811, datetime.datetime(2026, 6, 3, 19, 5, 26), datetime.datetime(2026, 6, 3, 19, 5, 25), 'salt', 4.53, 100.17, None, 33.24, 129.13, -0.03, 821.62, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:05:33.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:05:33.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:05:33.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:05:25, diff=8.754991s, valid=True
2026-06-03T19:05:33.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:05:33.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:05:33.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:05:12, diff=21.75863s, valid=True
2026-06-03T19:05:33.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:05:33.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:05:33.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:05:23, diff=10.767146s, valid=True
2026-06-03T19:05:33.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:05:33.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:05:33.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:05:33.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:05:33.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:05:33.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:05:33.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:05:12, diff=21.771017s, valid=True
2026-06-03T19:05:33.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:05:33.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:05:33.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:05:33.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80530.771853s, valid=False
2026-06-03T19:05:33.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:05:33.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:05:33.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:05:33.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:05:33.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:05:33.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:05:33.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:05:33.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:05:33.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:05:33.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:05:33.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:05:34.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:05:34.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:05:34.163 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:05:34.368 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:05:34.709 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:05:34.811 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:05:34.811 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:05:34.811 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:05:34.996 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:05:34.996 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:06:05.022 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:06:05.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:06:05.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:06:05.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:06:05.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:06:05.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:06:05.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:06:05.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:06:05.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:06:05.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:06:05.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:06:05.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:06:05.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:06:08.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:06:08.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:06:08.314 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:06:08.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:06:08.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:06:08.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:06:08.337 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:06:08.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:06:08.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:06:08.339 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:06:08.339 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:06:08.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:06:08.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:06:08.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:06:08.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:06:08.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:06:08.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:06:08.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:06:08.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:06:08.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:06:08.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:06:08.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:06:08.670 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:06:08.739 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:05:56
2026-06-03T19:06:08.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86812, datetime.datetime(2026, 6, 3, 19, 5, 56), datetime.datetime(2026, 6, 3, 19, 5, 55), 'salt', 4.46, 100.1, None, 32.67, 139.84, -0.02, 821.62, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:06:08.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:06:08.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:06:08.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:05:55, diff=13.746752s, valid=True
2026-06-03T19:06:08.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:06:08.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:06:08.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:06:12, diff=-3.249863s, valid=True
2026-06-03T19:06:08.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:06:08.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:06:08.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:05:54, diff=14.757923s, valid=True
2026-06-03T19:06:08.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:06:08.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:06:08.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:06:08.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:06:08.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:06:08.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:06:08.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:06:12, diff=-3.238484s, valid=True
2026-06-03T19:06:08.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:06:08.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:06:08.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:06:08.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80565.762301s, valid=False
2026-06-03T19:06:08.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:06:08.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:06:08.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:06:08.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:06:08.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:06:08.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:06:08.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:06:08.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:06:08.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:06:08.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:06:08.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:06:08.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:06:09.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:06:09.081 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:06:09.293 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:06:09.634 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:06:09.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:06:09.737 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:06:09.737 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:06:09.933 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:06:09.933 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:06:39.944 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:06:39.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:06:39.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:06:40.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:06:40.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:06:40.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:06:40.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:06:40.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:06:40.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:06:40.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:06:40.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:06:40.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:06:40.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:06:43.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:06:43.729 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:06:43.730 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:06:43.730 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:06:43.740 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:06:43.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:06:43.753 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:06:43.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:06:43.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:06:43.755 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:06:43.755 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:06:43.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:06:43.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:06:43.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:06:43.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:06:43.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:06:44.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:06:44.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:06:44.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:06:44.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:06:44.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:06:44.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:06:44.092 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:06:44.164 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:06:26
2026-06-03T19:06:44.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86813, datetime.datetime(2026, 6, 3, 19, 6, 26), datetime.datetime(2026, 6, 3, 19, 6, 26), 'salt', 4.56, 100.13, None, 41.28, 106.68, -0.03, 821.8, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:06:44.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:06:44.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:06:44.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:06:26, diff=18.171736s, valid=True
2026-06-03T19:06:44.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:06:44.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:06:44.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:06:12, diff=32.175276s, valid=True
2026-06-03T19:06:44.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:06:44.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:06:44.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:06:26, diff=18.183398s, valid=True
2026-06-03T19:06:44.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:06:44.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:06:44.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:06:44.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:06:44.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:06:44.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:06:44.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:06:12, diff=32.187214s, valid=True
2026-06-03T19:06:44.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:06:44.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:06:44.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:06:44.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80601.188041s, valid=False
2026-06-03T19:06:44.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:06:44.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:06:44.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:06:44.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:06:44.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:06:44.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:06:44.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:06:44.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:06:44.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:06:44.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:06:44.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:06:44.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:06:44.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:06:44.579 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:06:44.786 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:06:45.128 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:06:45.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:06:45.231 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:06:45.231 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:06:45.465 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:06:45.465 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:07:15.486 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:07:15.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:07:15.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:07:15.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:07:15.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:07:16.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:07:16.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:07:16.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:07:16.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:07:16.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:07:16.090 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:07:16.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:07:16.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:07:19.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:07:19.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:07:19.023 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:07:19.023 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:07:19.032 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:07:19.044 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:07:19.044 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:07:19.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:07:19.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:07:19.045 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:07:19.045 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:07:19.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:07:19.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:07:19.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:07:19.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:07:19.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:07:19.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:07:19.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:07:19.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:07:19.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:07:19.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:07:19.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:07:19.333 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:07:19.405 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:06:57
2026-06-03T19:07:19.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86814, datetime.datetime(2026, 6, 3, 19, 6, 57), datetime.datetime(2026, 6, 3, 19, 6, 56), 'salt', 4.5, 100.1, None, 32.74, 124.15, -0.02, 821.86, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:07:19.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:07:19.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:07:19.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:06:56, diff=23.412079s, valid=True
2026-06-03T19:07:19.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:07:19.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:07:19.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:07:12, diff=7.415334s, valid=True
2026-06-03T19:07:19.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:07:19.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:07:19.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:06:50, diff=29.423001s, valid=True
2026-06-03T19:07:19.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:07:19.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:07:19.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:07:19.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:07:19.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:07:19.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:07:19.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:07:12, diff=7.426545s, valid=True
2026-06-03T19:07:19.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:07:19.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:07:19.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:07:19.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80636.427317s, valid=False
2026-06-03T19:07:19.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:07:19.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:07:19.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:07:19.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:07:19.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:07:19.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:07:19.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:07:19.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:07:19.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:07:19.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:07:19.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:07:19.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:07:19.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:07:19.746 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:07:19.963 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:07:20.313 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:07:20.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:07:20.416 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:07:20.416 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:07:20.656 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:07:20.656 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:07:50.686 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:07:50.686 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:07:50.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:07:50.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:07:50.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:07:51.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:07:51.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:07:51.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:07:51.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:07:51.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:07:51.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:07:51.132 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:07:51.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:07:54.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:07:54.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:07:54.151 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:07:54.151 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:07:54.159 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:07:54.172 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:07:54.172 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:07:54.173 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:07:54.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:07:54.173 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:07:54.174 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:07:54.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:07:54.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:07:54.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:07:54.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:07:54.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:07:54.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:07:54.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:07:54.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:07:54.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:07:54.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:07:54.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:07:54.483 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:07:54.552 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:07:27
2026-06-03T19:07:54.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86815, datetime.datetime(2026, 6, 3, 19, 7, 27), datetime.datetime(2026, 6, 3, 19, 7, 26), 'salt', 4.6, 100.1, None, 38.25, 130.26, -0.02, 821.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:07:54.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:07:54.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:07:54.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:07:26, diff=28.559668s, valid=True
2026-06-03T19:07:54.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:07:54.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:07:54.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:07:12, diff=42.562938s, valid=True
2026-06-03T19:07:54.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:07:54.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:07:54.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:07:20, diff=34.570542s, valid=True
2026-06-03T19:07:54.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:07:54.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:07:54.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:07:54.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:07:54.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:07:54.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:07:54.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:07:12, diff=42.574037s, valid=True
2026-06-03T19:07:54.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:07:54.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:07:54.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:07:54.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80671.574792s, valid=False
2026-06-03T19:07:54.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:07:54.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:07:54.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:07:54.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:07:54.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:07:54.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:07:54.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:07:54.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:07:54.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:07:54.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:07:54.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:07:54.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:07:54.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:07:54.959 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:07:55.165 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:07:55.509 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:07:55.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:07:55.612 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:07:55.612 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:07:55.866 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:07:55.866 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:08:25.893 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:08:25.893 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:08:25.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:08:26.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:08:26.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:08:26.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:08:26.244 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:08:26.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:08:26.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:08:26.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:08:26.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:08:26.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:08:26.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:08:29.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:08:29.151 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:08:29.151 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:08:29.152 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:08:29.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:08:29.175 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:08:29.176 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:08:29.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:08:29.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:08:29.177 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:08:29.177 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:08:29.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:08:29.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:08:29.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:08:29.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:08:29.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:08:29.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:08:29.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:08:29.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:08:29.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:08:29.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:08:29.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:08:29.508 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:08:29.583 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:08:27
2026-06-03T19:08:29.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86817, datetime.datetime(2026, 6, 3, 19, 8, 27), datetime.datetime(2026, 6, 3, 19, 8, 27), 'salt', 4.56, 100.1, None, 43.64, 114.9, -0.02, 821.68, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:08:29.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:08:29.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:08:29.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:08:27, diff=2.590808s, valid=True
2026-06-03T19:08:29.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:08:29.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:08:29.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:08:12, diff=17.594329s, valid=True
2026-06-03T19:08:29.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:08:29.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:08:29.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:08:21, diff=8.602479s, valid=True
2026-06-03T19:08:29.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:08:29.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:08:29.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:08:29.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:08:29.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:08:29.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:08:29.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:08:12, diff=17.606235s, valid=True
2026-06-03T19:08:29.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:08:29.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:08:29.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:08:29.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80706.607053s, valid=False
2026-06-03T19:08:29.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:08:29.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:08:29.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:08:29.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:08:29.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:08:29.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:08:29.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:08:29.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:08:29.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:08:29.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:08:29.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:08:29.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:08:29.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:08:29.936 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:08:30.172 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:08:30.550 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:08:30.652 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:08:30.652 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:08:30.652 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:08:30.894 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:08:30.894 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:09:00.894 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:09:00.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:09:00.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:09:01.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:09:01.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:09:01.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:09:01.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:09:01.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:09:01.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:09:01.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:09:01.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:09:01.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:09:01.573 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:09:04.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:09:04.484 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:09:04.485 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:09:04.486 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:09:04.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:09:04.508 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:09:04.509 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:09:04.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:09:04.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:09:04.510 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:09:04.510 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:09:04.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:09:04.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:09:04.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:09:04.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:09:04.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:09:04.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:09:04.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:09:04.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:09:04.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:09:04.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:09:04.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:09:04.838 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:09:04.909 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:08:58
2026-06-03T19:09:04.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86818, datetime.datetime(2026, 6, 3, 19, 8, 58), datetime.datetime(2026, 6, 3, 19, 8, 57), 'salt', 4.5, 100.13, None, 38.35, 111.03, -0.02, 821.68, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:09:04.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:09:04.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:09:04.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:08:57, diff=7.917224s, valid=True
2026-06-03T19:09:04.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:09:04.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:09:04.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:09:12, diff=-7.079265s, valid=True
2026-06-03T19:09:04.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:09:04.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:09:04.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:08:52, diff=12.928855s, valid=True
2026-06-03T19:09:04.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:09:04.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:09:04.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:09:04.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:09:04.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:09:04.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:09:04.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:09:12, diff=-7.067462s, valid=True
2026-06-03T19:09:04.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:09:04.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:09:04.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:09:04.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80741.933348s, valid=False
2026-06-03T19:09:04.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:09:04.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:09:04.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:09:04.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:09:04.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:09:04.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:09:05.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:09:05.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:09:05.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:09:05.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:09:05.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:09:05.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:09:05.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:09:05.252 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:09:05.458 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:09:05.799 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:09:05.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:09:05.902 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:09:05.902 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:09:06.083 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:09:06.084 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:09:36.094 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:09:36.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:09:36.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:09:36.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:09:36.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:09:36.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:09:36.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:09:36.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:09:36.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:09:36.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:09:36.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:09:36.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:09:36.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:09:39.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:09:39.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:09:39.467 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:09:39.467 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:09:39.477 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:09:39.489 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:09:39.490 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:09:39.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:09:39.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:09:39.491 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:09:39.491 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:09:39.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:09:39.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:09:39.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:09:39.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:09:39.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:09:39.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:09:39.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:09:39.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:09:39.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:09:39.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:09:39.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:09:39.831 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:09:39.905 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:09:28
2026-06-03T19:09:39.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86819, datetime.datetime(2026, 6, 3, 19, 9, 28), datetime.datetime(2026, 6, 3, 19, 9, 27), 'salt', 4.47, 100.04, None, 38.04, 117.53, 0.0, 821.62, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:09:39.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:09:39.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:09:39.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:09:27, diff=12.911592s, valid=True
2026-06-03T19:09:39.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:09:39.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:09:39.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:09:12, diff=27.914719s, valid=True
2026-06-03T19:09:39.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:09:39.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:09:39.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:09:24, diff=15.922034s, valid=True
2026-06-03T19:09:39.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:09:39.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:09:39.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:09:39.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:09:39.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:09:39.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:09:39.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:09:12, diff=27.92536s, valid=True
2026-06-03T19:09:39.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:09:39.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:09:39.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:09:39.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80776.926054s, valid=False
2026-06-03T19:09:39.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:09:39.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:09:39.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:09:39.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:09:39.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:09:39.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:09:39.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:09:39.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:09:40.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:09:40.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:09:40.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:09:40.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:09:40.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:09:40.252 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:09:40.459 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:09:40.862 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:09:40.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:09:40.967 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:09:40.967 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:09:41.126 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:09:41.126 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:10:11.156 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:10:11.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:10:11.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:10:11.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:10:11.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:10:11.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:10:11.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:10:11.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:10:11.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:10:11.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:10:11.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:10:11.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:10:11.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:10:14.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:10:14.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:10:14.483 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:10:14.483 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:10:14.492 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:10:14.503 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:10:14.504 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:10:14.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:10:14.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:10:14.504 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:10:14.504 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:10:14.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:10:14.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:10:14.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:10:14.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:10:14.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:10:14.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:10:14.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:10:14.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:10:14.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:10:14.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:10:14.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:10:14.784 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:10:14.856 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:09:58
2026-06-03T19:10:14.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86820, datetime.datetime(2026, 6, 3, 19, 9, 58), datetime.datetime(2026, 6, 3, 19, 9, 57), 'salt', 4.56, 100.14, None, 38.64, 119.31, -0.03, 821.62, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:10:14.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:10:14.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:10:14.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:09:57, diff=17.863557s, valid=True
2026-06-03T19:10:14.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:10:14.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:10:14.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:10:12, diff=2.866825s, valid=True
2026-06-03T19:10:14.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:10:14.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:10:14.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:09:55, diff=19.874363s, valid=True
2026-06-03T19:10:14.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:10:14.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:10:14.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:10:14.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:10:14.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:10:14.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:10:14.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:10:12, diff=2.877871s, valid=True
2026-06-03T19:10:14.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:10:14.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:10:14.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:10:14.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80811.878607s, valid=False
2026-06-03T19:10:14.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:10:14.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:10:14.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:10:14.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:10:14.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:10:14.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:10:14.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:10:14.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:10:14.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:10:15.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:10:15.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:10:15.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:10:15.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:10:15.197 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:10:15.406 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:10:15.750 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:10:15.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:10:15.855 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:10:15.855 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:10:16.077 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:10:16.077 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:10:46.108 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:10:46.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:10:46.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:10:46.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:10:46.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:10:46.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:10:46.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:10:46.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:10:46.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:10:46.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:10:46.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:10:46.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:10:46.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:10:49.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:10:49.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:10:49.672 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:10:49.673 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:10:49.681 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:10:49.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:10:49.699 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:10:49.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:10:49.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:10:49.700 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:10:49.700 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:10:49.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:10:49.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:10:49.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:10:49.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:10:49.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:10:49.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:10:49.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:10:50.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:10:50.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:10:50.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:10:50.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:10:50.020 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:10:50.089 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:10:28
2026-06-03T19:10:50.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86821, datetime.datetime(2026, 6, 3, 19, 10, 28), datetime.datetime(2026, 6, 3, 19, 10, 28), 'salt', 4.5, 100.1, None, 36.02, 115.72, -0.02, 821.81, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:10:50.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:10:50.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:10:50.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:10:28, diff=22.096952s, valid=True
2026-06-03T19:10:50.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:10:50.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:10:50.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:10:12, diff=38.100558s, valid=True
2026-06-03T19:10:50.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:10:50.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:10:50.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:10:27, diff=23.116184s, valid=True
2026-06-03T19:10:50.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:10:50.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:10:50.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:10:50.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:10:50.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:10:50.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:10:50.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:10:12, diff=38.123567s, valid=True
2026-06-03T19:10:50.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:10:50.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:10:50.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:10:50.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80847.124312s, valid=False
2026-06-03T19:10:50.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:10:50.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:10:50.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:10:50.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:10:50.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:10:50.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:10:50.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:10:50.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:10:50.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:10:50.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:10:50.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:10:50.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:10:50.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:10:50.515 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:10:50.721 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:10:51.065 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:10:51.170 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:10:51.170 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:10:51.170 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:10:51.459 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:10:51.459 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:11:21.489 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:11:21.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:11:21.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:11:21.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:11:21.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:11:22.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:11:22.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:11:22.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:11:22.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:11:22.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:11:22.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:11:22.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:11:22.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:11:25.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:11:25.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:11:25.049 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:11:25.049 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:11:25.059 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:11:25.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:11:25.072 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:11:25.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:11:25.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:11:25.073 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:11:25.074 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:11:25.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:11:25.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:11:25.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:11:25.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:11:25.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:11:25.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:11:25.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:11:25.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:11:25.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:11:25.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:11:25.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:11:25.404 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:11:25.476 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:10:59
2026-06-03T19:11:25.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86822, datetime.datetime(2026, 6, 3, 19, 10, 59), datetime.datetime(2026, 6, 3, 19, 10, 58), 'salt', 4.5, 100.1, None, 41.42, 113.28, -0.02, 821.81, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:11:25.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:11:25.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:11:25.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:10:58, diff=27.483394s, valid=True
2026-06-03T19:11:25.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:11:25.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:11:25.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:11:12, diff=13.486888s, valid=True
2026-06-03T19:11:25.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:11:25.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:11:25.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:10:58, diff=27.494919s, valid=True
2026-06-03T19:11:25.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:11:25.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:11:25.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:11:25.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:11:25.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:11:25.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:11:25.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:11:12, diff=13.498658s, valid=True
2026-06-03T19:11:25.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:11:25.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:11:25.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:11:25.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80882.499474s, valid=False
2026-06-03T19:11:25.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:11:25.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:11:25.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:11:25.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:11:25.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:11:25.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:11:25.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:11:25.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:11:25.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:11:25.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:11:25.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:11:25.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:11:25.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:11:25.821 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:11:26.026 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:11:26.365 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:11:26.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:11:26.467 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:11:26.467 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:11:26.651 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:11:26.651 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:11:56.658 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:11:56.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:11:56.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:11:56.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:11:56.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:11:57.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:11:57.221 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:11:57.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:11:57.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:11:57.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:11:57.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:11:57.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:11:57.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:12:00.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:12:00.145 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:12:00.146 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:12:00.146 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:12:00.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:12:00.169 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:12:00.169 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:12:00.169 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:12:00.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:12:00.170 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:12:00.170 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:12:00.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:12:00.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:12:00.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:12:00.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:12:00.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:12:00.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:12:00.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:12:00.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:12:00.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:12:00.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:12:00.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:12:00.495 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:12:00.565 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:11:29
2026-06-03T19:12:00.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86823, datetime.datetime(2026, 6, 3, 19, 11, 29), datetime.datetime(2026, 6, 3, 19, 11, 28), 'salt', 4.53, 100.14, None, 38.71, 120.07, -0.03, 821.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:12:00.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:12:00.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:12:00.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:11:58, diff=2.573006s, valid=True
2026-06-03T19:12:00.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:12:00.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:12:00.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:11:12, diff=48.576474s, valid=True
2026-06-03T19:12:00.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:12:00.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:12:00.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:11:53, diff=7.584579s, valid=True
2026-06-03T19:12:00.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:12:00.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:12:00.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:12:00.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:12:00.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:12:00.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:12:00.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:11:12, diff=48.588299s, valid=True
2026-06-03T19:12:00.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:12:00.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:12:00.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:12:00.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80917.589114s, valid=False
2026-06-03T19:12:00.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:12:00.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:12:00.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:12:00.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:12:00.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:12:00.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:12:00.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:12:00.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:12:00.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:12:00.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:12:00.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:12:00.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:12:00.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:12:00.976 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:12:01.183 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:12:01.551 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:12:01.653 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:12:01.654 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:12:01.654 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:12:02.393 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:12:02.393 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:12:32.423 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:12:32.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:12:32.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:12:32.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:12:32.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:12:32.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:12:32.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:12:32.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:12:32.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:12:32.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:12:32.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:12:32.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:12:32.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:12:35.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:12:35.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:12:35.780 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:12:35.780 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:12:35.790 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:12:35.802 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:12:35.803 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:12:35.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:12:35.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:12:35.804 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:12:35.804 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:12:35.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:12:35.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:12:35.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:12:36.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:12:36.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:12:36.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:12:36.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:12:36.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:12:36.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:12:36.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:12:36.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:12:36.134 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:12:36.203 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:12:31
2026-06-03T19:12:36.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86825, datetime.datetime(2026, 6, 3, 19, 12, 31), datetime.datetime(2026, 6, 3, 19, 12, 30), 'salt', 4.5, 100.14, None, 35.04, 118.89, -0.02, 821.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:12:36.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:12:36.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:12:36.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:12:30, diff=6.210833s, valid=True
2026-06-03T19:12:36.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:12:36.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:12:36.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:12:12, diff=24.214289s, valid=True
2026-06-03T19:12:36.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:12:36.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:12:36.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:12:23, diff=13.222417s, valid=True
2026-06-03T19:12:36.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:12:36.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:12:36.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:12:36.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:12:36.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:12:36.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:12:36.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:12:12, diff=24.226156s, valid=True
2026-06-03T19:12:36.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:12:36.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:12:36.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:12:36.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80953.226992s, valid=False
2026-06-03T19:12:36.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:12:36.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:12:36.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:12:36.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:12:36.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:12:36.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:12:36.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:12:36.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:12:36.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:12:36.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:12:36.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:12:36.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:12:36.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:12:36.547 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:12:36.755 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:12:37.093 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:12:37.197 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:12:37.197 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:12:37.197 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:12:37.408 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:12:37.408 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:13:07.438 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:13:07.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:13:07.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:13:07.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:13:07.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:13:08.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:13:08.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:13:08.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:13:08.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:13:08.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:13:08.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:13:08.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:13:08.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:13:11.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:13:11.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:13:11.025 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:13:11.025 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:13:11.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:13:11.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:13:11.045 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:13:11.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:13:11.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:13:11.046 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:13:11.046 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:13:11.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:13:11.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:13:11.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:13:11.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:13:11.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:13:11.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:13:11.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:13:11.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:13:11.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:13:11.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:13:11.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:13:11.311 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:13:11.379 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:13:01
2026-06-03T19:13:11.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86826, datetime.datetime(2026, 6, 3, 19, 13, 1), datetime.datetime(2026, 6, 3, 19, 13), 'salt', 4.57, 100.14, None, 45.13, 112.48, -0.02, 821.81, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:13:11.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:13:11.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:13:11.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:13:00, diff=11.386712s, valid=True
2026-06-03T19:13:11.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:13:11.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:13:11.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:13:12, diff=-0.610149s, valid=True
2026-06-03T19:13:11.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:13:11.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:13:11.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:12:53, diff=18.397295s, valid=True
2026-06-03T19:13:11.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:13:11.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:13:11.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:13:11.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:13:11.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:13:11.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:13:11.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:13:12, diff=-0.59935s, valid=True
2026-06-03T19:13:11.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:13:11.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:13:11.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:13:11.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=80988.401371s, valid=False
2026-06-03T19:13:11.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:13:11.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:13:11.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:13:11.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:13:11.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:13:11.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:13:11.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:13:11.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:13:11.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:13:11.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:13:11.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:13:11.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:13:11.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:13:11.810 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:13:12.016 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:13:12.356 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:13:12.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:13:12.458 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:13:12.458 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:13:12.660 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:13:12.660 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:13:42.667 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:13:42.668 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:13:42.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:13:42.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:13:42.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:13:43.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:13:43.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:13:43.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:13:43.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:13:43.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:13:43.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:13:43.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:13:43.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:13:46.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:13:46.129 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:13:46.130 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:13:46.130 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:13:46.140 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:13:46.153 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:13:46.153 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:13:46.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:13:46.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:13:46.154 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:13:46.154 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:13:46.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:13:46.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:13:46.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:13:46.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:13:46.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:13:46.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:13:46.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:13:46.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T19:13:46.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:13:46.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:13:46.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:13:46.482 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:13:46.551 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:13:31
2026-06-03T19:13:46.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86827, datetime.datetime(2026, 6, 3, 19, 13, 31), datetime.datetime(2026, 6, 3, 19, 13, 30), 'salt', 4.43, 100.1, None, 37.86, 113.05, -0.02, 821.87, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:13:46.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:13:46.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:13:46.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:13:30, diff=16.558443s, valid=True
2026-06-03T19:13:46.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:13:46.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:13:46.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:13:12, diff=34.561948s, valid=True
2026-06-03T19:13:46.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:13:46.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:13:46.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:13:25, diff=21.573943s, valid=True
2026-06-03T19:13:46.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:13:46.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:13:46.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:13:46.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:13:46.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:13:46.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T19:13:46.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:13:12, diff=34.57842s, valid=True
2026-06-03T19:13:46.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:13:46.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:13:46.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:13:46.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81023.579346s, valid=False
2026-06-03T19:13:46.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:13:46.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:13:46.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:13:46.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:13:46.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:13:46.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:13:46.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:13:46.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:13:46.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:13:46.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:13:46.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:13:46.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:13:46.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:13:46.901 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:13:47.129 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:13:47.468 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:13:47.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:13:47.570 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:13:47.570 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:13:47.874 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:13:47.874 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:14:17.905 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:14:17.905 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:14:17.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:14:18.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:14:18.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:14:18.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:14:18.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:14:18.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:14:18.396 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:14:18.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:14:18.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:14:18.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:14:18.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:14:21.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:14:21.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:14:21.321 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:14:21.321 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:14:21.332 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:14:21.345 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:14:21.346 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:14:21.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:14:21.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:14:21.347 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:14:21.347 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:14:21.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:14:21.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:14:21.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:14:21.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:14:21.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:14:21.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:14:21.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:14:21.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:14:21.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:14:21.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:14:21.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:14:21.680 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:14:21.751 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:14:01
2026-06-03T19:14:21.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86828, datetime.datetime(2026, 6, 3, 19, 14, 1), datetime.datetime(2026, 6, 3, 19, 14, 1), 'salt', 4.47, 100.1, None, 43.4, 117.6, -0.01, 821.63, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:14:21.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:14:21.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:14:21.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:14:01, diff=20.758842s, valid=True
2026-06-03T19:14:21.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:14:21.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:14:21.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:13:12, diff=69.762348s, valid=True
2026-06-03T19:14:21.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:14:21.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:14:21.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:13:56, diff=25.770631s, valid=True
2026-06-03T19:14:21.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:14:21.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:14:21.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:14:21.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:14:21.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:14:21.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:14:21.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:13:12, diff=69.774334s, valid=True
2026-06-03T19:14:21.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:14:21.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:14:21.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:14:21.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81058.775155s, valid=False
2026-06-03T19:14:21.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:14:21.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:14:21.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:14:21.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:14:21.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:14:21.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:14:21.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:14:21.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:14:21.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:14:21.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:14:21.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:14:22.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:14:22.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:14:22.094 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:14:22.301 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:14:22.640 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:14:22.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:14:22.743 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:14:22.743 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:14:23.075 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:14:23.075 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:14:53.105 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:14:53.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:14:53.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:14:53.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:14:53.274 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:14:53.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:14:53.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:14:53.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:14:53.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:14:53.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:14:53.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:14:53.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:14:53.545 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:14:56.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:14:56.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:14:56.470 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:14:56.470 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:14:56.480 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:14:56.493 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:14:56.493 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:14:56.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:14:56.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:14:56.494 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:14:56.495 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:14:56.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:14:56.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:14:56.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:14:56.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:14:56.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:14:56.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:14:56.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:14:56.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:14:56.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:14:56.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:14:56.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:14:56.777 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:14:56.851 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:14:32
2026-06-03T19:14:56.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86829, datetime.datetime(2026, 6, 3, 19, 14, 32), datetime.datetime(2026, 6, 3, 19, 14, 31), 'salt', 4.53, 100.17, None, 34.44, 107.18, -0.03, 821.69, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:14:56.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:14:56.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:14:56.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:14:31, diff=25.85845s, valid=True
2026-06-03T19:14:56.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:14:56.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:14:56.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:13:12, diff=104.861704s, valid=True
2026-06-03T19:14:56.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:14:56.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:14:56.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:14:28, diff=28.869409s, valid=True
2026-06-03T19:14:56.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:14:56.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:14:56.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:14:56.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:14:56.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:14:56.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:14:56.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:13:12, diff=104.872886s, valid=True
2026-06-03T19:14:56.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:14:56.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:14:56.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:14:56.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81093.873635s, valid=False
2026-06-03T19:14:56.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:14:56.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:14:56.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:14:56.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:14:56.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:14:56.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:14:56.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:14:56.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:14:56.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:14:57.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:14:57.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:14:57.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:14:57.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:14:57.192 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:14:57.396 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:14:57.793 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:14:57.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:14:57.894 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:14:57.894 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:14:57.981 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:14:57.981 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:15:27.984 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:15:27.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:15:27.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:15:28.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:15:28.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:15:28.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:15:28.534 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:15:28.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:15:28.547 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:15:28.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:15:28.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:15:28.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:15:28.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:15:31.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:15:31.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:15:31.457 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:15:31.458 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:15:31.467 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:15:31.481 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:15:31.482 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:15:31.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:15:31.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:15:31.483 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:15:31.483 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:15:31.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:15:31.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T19:15:31.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:15:31.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T19:15:31.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:15:31.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T19:15:31.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:15:31.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T19:15:31.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:15:31.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:15:31.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:15:31.812 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:15:31.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:15:02
2026-06-03T19:15:31.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86830, datetime.datetime(2026, 6, 3, 19, 15, 2), datetime.datetime(2026, 6, 3, 19, 15, 1), 'salt', 4.4, 100.1, None, 43.08, 120.25, -0.02, 821.81, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:15:31.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:15:31.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T19:15:31.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:15:01, diff=30.893129s, valid=True
2026-06-03T19:15:31.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:15:31.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T19:15:31.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:13:12, diff=139.896532s, valid=True
2026-06-03T19:15:31.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:15:31.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T19:15:31.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:14:59, diff=32.904395s, valid=True
2026-06-03T19:15:31.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:15:31.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:15:31.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:15:31.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:15:31.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:15:31.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T19:15:31.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:13:12, diff=139.908014s, valid=True
2026-06-03T19:15:31.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:15:31.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:15:31.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:15:31.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81128.908818s, valid=False
2026-06-03T19:15:31.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:15:31.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:15:31.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:15:31.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:15:31.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:15:31.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:15:31.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:15:31.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:15:31.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:15:32.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:15:32.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:15:32.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:15:32.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:15:32.227 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:15:32.439 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:15:32.781 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:15:32.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:15:32.883 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:15:32.883 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:15:33.081 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:15:33.081 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:16:03.111 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:16:03.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:16:03.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:16:03.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:16:03.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:16:03.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:16:03.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:16:03.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:16:03.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:16:03.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:16:03.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:16:03.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:16:03.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:16:06.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:16:06.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:16:06.535 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:16:06.535 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:16:06.546 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:16:06.559 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:16:06.560 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:16:06.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:16:06.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:16:06.561 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:16:06.561 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:16:06.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:16:06.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:16:06.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:16:06.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:16:06.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:16:06.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T19:16:06.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:16:06.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T19:16:06.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:16:06.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:16:06.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:16:06.890 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:16:06.960 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:16:02
2026-06-03T19:16:06.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86832, datetime.datetime(2026, 6, 3, 19, 16, 2), datetime.datetime(2026, 6, 3, 19, 16, 1), 'salt', 4.4, 100.04, None, 45.83, 109.57, -0.01, 821.81, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:16:06.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:16:06.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:16:06.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:16:01, diff=5.96822s, valid=True
2026-06-03T19:16:06.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:16:06.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T19:16:06.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:13:12, diff=174.971692s, valid=True
2026-06-03T19:16:06.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:16:06.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:16:06.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:15:55, diff=11.979924s, valid=True
2026-06-03T19:16:06.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:16:06.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:16:06.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:16:06.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:16:06.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:16:06.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T19:16:06.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:13:12, diff=174.983688s, valid=True
2026-06-03T19:16:06.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:16:06.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:16:06.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:16:06.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81163.984484s, valid=False
2026-06-03T19:16:06.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:16:06.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:16:06.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:16:06.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:16:06.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:16:07.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:16:07.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:16:07.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:16:07.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:16:07.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:16:07.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:16:07.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:16:07.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:16:07.305 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:16:07.582 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:16:07.922 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:16:08.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:16:08.024 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:16:08.024 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:16:08.324 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:16:08.324 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:16:38.331 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:16:38.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:16:38.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:16:38.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:16:38.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:16:38.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:16:38.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:16:38.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:16:38.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:16:38.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:16:38.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:16:38.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:16:38.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:16:41.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:16:41.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:16:41.705 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:16:41.705 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:16:41.719 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:16:41.732 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:16:41.732 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:16:41.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:16:41.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:16:41.733 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:16:41.734 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:16:41.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:16:41.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:16:41.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:16:41.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:16:41.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:16:42.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T19:16:42.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:16:42.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T19:16:42.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:16:42.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:16:42.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:16:42.087 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:16:42.162 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:16:32
2026-06-03T19:16:42.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86833, datetime.datetime(2026, 6, 3, 19, 16, 32), datetime.datetime(2026, 6, 3, 19, 16, 32), 'salt', 4.4, 100.04, None, 39.23, 116.1, -0.01, 821.69, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:16:42.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:16:42.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:16:42.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:16:32, diff=10.169825s, valid=True
2026-06-03T19:16:42.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:16:42.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T19:16:42.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:13:12, diff=210.175143s, valid=True
2026-06-03T19:16:42.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:16:42.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:16:42.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:16:25, diff=17.183531s, valid=True
2026-06-03T19:16:42.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:16:42.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:16:42.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:16:42.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:16:42.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:16:42.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T19:16:42.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:13:12, diff=210.187312s, valid=True
2026-06-03T19:16:42.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:16:42.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:16:42.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:16:42.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81199.188146s, valid=False
2026-06-03T19:16:42.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:16:42.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:16:42.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:16:42.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:16:42.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:16:42.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:16:42.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:16:42.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:16:42.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:16:42.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:16:42.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:16:42.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:16:42.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:16:42.534 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:16:42.757 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:16:43.119 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:16:43.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:16:43.230 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:16:43.230 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:16:43.425 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:16:43.425 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:17:13.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:17:13.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:17:13.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:17:13.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:17:13.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:17:14.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:17:14.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:17:14.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:17:14.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:17:14.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:17:14.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:17:14.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:17:14.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:17:16.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:17:16.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:17:16.986 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:17:16.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:17:16.997 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:17:17.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:17:17.010 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:17:17.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:17:17.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:17:17.011 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:17:17.012 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:17:17.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:17:17.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:17:17.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:17:17.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:17:17.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:17:17.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:17:17.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:17:17.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:17:17.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:17:17.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:17:17.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:17:17.356 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:17:17.431 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:17:03
2026-06-03T19:17:17.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86834, datetime.datetime(2026, 6, 3, 19, 17, 3), datetime.datetime(2026, 6, 3, 19, 17, 2), 'salt', 4.43, 100.07, None, 42.59, 107.13, -0.02, 821.75, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:17:17.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:17:17.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:17:17.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:17:02, diff=15.438822s, valid=True
2026-06-03T19:17:17.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:17:17.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:17:17.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:13:12, diff=245.44229s, valid=True
2026-06-03T19:17:17.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:17:17.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:17:17.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:16:56, diff=21.450517s, valid=True
2026-06-03T19:17:17.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:17:17.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:17:17.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:17:17.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:17:17.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:17:17.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:17:17.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:13:12, diff=245.45428s, valid=True
2026-06-03T19:17:17.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:17:17.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:17:17.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:17:17.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81234.455106s, valid=False
2026-06-03T19:17:17.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:17:17.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:17:17.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:17:17.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:17:17.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:17:17.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:17:17.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:17:17.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:17:17.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:17:17.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:17:17.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:17:17.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:17:17.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:17:17.850 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:17:18.054 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:17:18.398 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:17:18.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:17:18.500 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:17:18.500 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:17:18.712 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:17:18.713 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:17:48.743 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:17:48.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:17:48.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:17:48.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:17:48.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:17:49.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:17:49.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:17:49.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:17:49.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:17:49.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:17:49.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:17:49.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:17:49.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:17:52.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:17:52.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:17:52.100 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:17:52.100 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:17:52.108 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:17:52.128 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:17:52.128 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:17:52.129 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:17:52.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:17:52.129 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:17:52.129 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:17:52.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:17:52.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:17:52.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:17:52.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:17:52.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:17:52.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:17:52.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:17:52.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:17:52.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:17:52.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:17:52.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:17:52.452 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:17:52.522 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:17:33
2026-06-03T19:17:52.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86835, datetime.datetime(2026, 6, 3, 19, 17, 33), datetime.datetime(2026, 6, 3, 19, 17, 32), 'salt', 4.47, 100.14, None, 40.05, 108.73, -0.02, 821.81, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:17:52.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:17:52.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:17:52.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:17:32, diff=20.529703s, valid=True
2026-06-03T19:17:52.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:17:52.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:17:52.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:13:12, diff=280.533191s, valid=True
2026-06-03T19:17:52.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:17:52.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:17:52.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:17:27, diff=25.541402s, valid=True
2026-06-03T19:17:52.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:17:52.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:17:52.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:17:52.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:17:52.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:17:52.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:17:52.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:13:12, diff=280.545095s, valid=True
2026-06-03T19:17:52.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:17:52.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:17:52.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:17:52.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81269.545909s, valid=False
2026-06-03T19:17:52.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:17:52.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:17:52.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:17:52.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:17:52.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:17:52.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:17:52.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:17:52.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:17:52.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:17:52.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:17:52.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:17:52.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:17:52.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:17:52.866 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:17:53.070 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:17:53.409 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:17:53.510 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:17:53.510 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:17:53.511 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:17:53.707 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:17:53.707 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:18:23.731 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:18:23.731 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:18:23.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:18:24.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:18:24.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:18:24.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:18:24.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:18:24.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:18:24.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:18:24.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:18:24.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:18:24.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:18:24.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:18:27.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:18:27.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:18:27.337 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:18:27.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:18:27.349 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:18:27.362 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:18:27.362 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:18:27.363 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:18:27.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:18:27.363 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:18:27.364 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:18:27.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:18:27.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:18:27.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:18:27.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:18:27.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:18:27.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:18:27.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:18:27.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:18:27.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:18:27.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:18:27.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:18:27.695 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:18:27.768 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:18:03
2026-06-03T19:18:27.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86836, datetime.datetime(2026, 6, 3, 19, 18, 3), datetime.datetime(2026, 6, 3, 19, 18, 2), 'salt', 4.43, 100.1, None, 37.51, 102.76, -0.02, 821.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:18:27.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:18:27.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:18:27.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:18:02, diff=25.776189s, valid=True
2026-06-03T19:18:27.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:18:27.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:18:27.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:13:12, diff=315.779646s, valid=True
2026-06-03T19:18:27.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:18:27.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:18:27.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:17:59, diff=28.787821s, valid=True
2026-06-03T19:18:27.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:18:27.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:18:27.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:18:27.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:18:27.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:18:27.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:18:27.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:13:12, diff=315.791491s, valid=True
2026-06-03T19:18:27.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:18:27.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:18:27.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:18:27.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81304.792306s, valid=False
2026-06-03T19:18:27.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:18:27.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:18:27.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:18:27.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:18:27.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:18:27.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:18:27.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:18:27.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:18:27.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:18:27.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:18:28.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:18:28.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:18:28.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:18:28.191 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:18:28.399 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:18:28.789 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:18:28.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:18:28.891 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:18:28.891 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:18:29.080 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:18:29.080 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:18:59.096 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:18:59.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:18:59.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:18:59.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:18:59.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:18:59.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:18:59.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:18:59.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:18:59.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:18:59.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:18:59.698 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:18:59.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:18:59.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:19:02.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:19:02.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:19:02.880 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:19:02.880 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:19:02.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:19:02.900 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:19:02.900 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:19:02.900 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:19:02.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:19:02.900 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:19:02.900 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:19:02.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:19:02.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T19:19:02.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:19:03.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T19:19:03.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:19:03.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:19:03.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:19:03.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:19:03.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:19:03.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:19:03.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:19:03.173 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:19:03.242 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:18:33
2026-06-03T19:19:03.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86837, datetime.datetime(2026, 6, 3, 19, 18, 33), datetime.datetime(2026, 6, 3, 19, 18, 33), 'salt', 4.43, 100.1, None, 32.78, 112.06, -0.02, 821.75, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:19:03.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:19:03.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T19:19:03.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:18:33, diff=30.249536s, valid=True
2026-06-03T19:19:03.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:19:03.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:19:03.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:19:12, diff=-8.747312s, valid=True
2026-06-03T19:19:03.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:19:03.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T19:19:03.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:18:30, diff=33.260038s, valid=True
2026-06-03T19:19:03.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:19:03.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:19:03.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:19:03.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:19:03.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:19:03.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:19:03.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:19:12, diff=-8.736613s, valid=True
2026-06-03T19:19:03.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:19:03.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:19:03.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:19:03.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81340.264127s, valid=False
2026-06-03T19:19:03.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:19:03.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:19:03.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:19:03.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:19:03.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:19:03.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:19:03.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:19:03.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:19:03.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:19:03.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:19:03.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:19:03.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:19:03.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:19:03.581 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:19:03.787 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:19:04.125 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:19:04.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:19:04.228 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:19:04.228 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:19:05.032 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:19:05.033 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:19:35.063 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:19:35.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:19:35.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:19:35.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:19:35.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:19:35.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:19:35.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:19:35.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:19:35.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:19:35.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:19:35.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:19:35.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:19:35.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:19:38.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:19:38.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:19:38.744 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:19:38.744 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:19:38.756 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:19:38.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:19:38.770 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:19:38.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:19:38.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:19:38.771 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:19:38.771 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:19:38.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:19:38.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:19:38.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:19:39.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:19:39.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:19:39.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:19:39.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:19:39.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:19:39.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:19:39.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:19:39.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:19:39.105 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:19:39.175 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:19:34
2026-06-03T19:19:39.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86839, datetime.datetime(2026, 6, 3, 19, 19, 34), datetime.datetime(2026, 6, 3, 19, 19, 34), 'salt', 4.43, 100.14, None, 37.29, 119.93, -0.03, 821.81, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:19:39.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:19:39.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:19:39.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:19:34, diff=5.181858s, valid=True
2026-06-03T19:19:39.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:19:39.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:19:39.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:20:12, diff=-32.815323s, valid=True
2026-06-03T19:19:39.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:19:39.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:19:39.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:19:33, diff=6.191434s, valid=True
2026-06-03T19:19:39.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:19:39.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:19:39.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:19:39.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:19:39.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:19:39.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:19:39.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:20:12, diff=-32.80552s, valid=True
2026-06-03T19:19:39.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:19:39.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:19:39.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:19:39.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81376.195135s, valid=False
2026-06-03T19:19:39.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:19:39.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:19:39.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:19:39.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:19:39.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:19:39.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:19:39.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:19:39.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:19:39.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:19:39.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:19:39.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:19:39.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:19:39.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:19:39.588 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:19:39.796 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:19:40.161 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:19:40.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:19:40.264 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:19:40.264 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:19:40.464 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:19:40.464 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:20:10.494 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:20:10.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:20:10.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:20:10.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:20:10.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:20:11.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:20:11.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:20:11.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:20:11.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:20:11.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:20:11.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:20:11.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:20:11.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:20:14.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:20:14.028 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:20:14.029 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:20:14.029 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:20:14.040 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:20:14.053 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:20:14.054 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:20:14.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:20:14.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:20:14.055 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:20:14.055 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:20:14.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:20:14.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:20:14.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:20:14.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:20:14.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:20:14.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:20:14.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:20:14.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:20:14.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:20:14.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:20:14.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:20:14.379 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:20:14.451 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:20:05
2026-06-03T19:20:14.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86840, datetime.datetime(2026, 6, 3, 19, 20, 5), datetime.datetime(2026, 6, 3, 19, 20, 4), 'salt', 4.4, 100.14, None, 41.74, 111.83, -0.02, 821.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:20:14.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:20:14.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:20:14.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:20:04, diff=10.459383s, valid=True
2026-06-03T19:20:14.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:20:14.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:20:14.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:20:12, diff=2.462953s, valid=True
2026-06-03T19:20:14.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:20:14.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:20:14.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:20:04, diff=10.47127s, valid=True
2026-06-03T19:20:14.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:20:14.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:20:14.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:20:14.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:20:14.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:20:14.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:20:14.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:20:12, diff=2.47513s, valid=True
2026-06-03T19:20:14.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:20:14.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:20:14.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:20:14.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81411.47597s, valid=False
2026-06-03T19:20:14.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:20:14.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:20:14.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:20:14.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:20:14.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:20:14.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:20:14.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:20:14.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:20:14.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:20:14.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:20:14.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:20:14.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:20:14.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:20:14.795 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:20:15.025 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:20:15.367 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:20:15.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:20:15.470 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:20:15.470 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:20:15.742 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:20:15.742 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:20:45.772 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:20:45.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:20:45.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:20:46.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:20:46.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:20:46.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:20:46.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:20:46.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:20:46.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:20:46.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:20:46.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:20:46.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:20:46.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:20:49.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:20:49.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:20:49.613 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:20:49.614 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:20:49.621 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:20:49.635 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:20:49.635 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:20:49.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:20:49.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:20:49.636 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:20:49.636 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:20:49.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:20:49.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:20:49.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:20:49.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:20:49.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:20:49.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:20:49.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:20:49.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:20:49.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:20:49.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:20:49.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:20:49.960 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:20:50.030 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:20:35
2026-06-03T19:20:50.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86841, datetime.datetime(2026, 6, 3, 19, 20, 35), datetime.datetime(2026, 6, 3, 19, 20, 34), 'salt', 4.33, 100.04, None, 38.81, 120.63, -0.01, 821.75, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:20:50.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:20:50.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:20:50.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:20:34, diff=16.037569s, valid=True
2026-06-03T19:20:50.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:20:50.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:20:50.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:21:12, diff=-21.959402s, valid=True
2026-06-03T19:20:50.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:20:50.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:20:50.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:20:28, diff=22.047809s, valid=True
2026-06-03T19:20:50.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:20:50.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:20:50.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:20:50.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:20:50.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:20:50.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:20:50.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:21:12, diff=-21.948705s, valid=True
2026-06-03T19:20:50.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:20:50.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:20:50.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:20:50.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81447.051988s, valid=False
2026-06-03T19:20:50.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:20:50.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:20:50.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:20:50.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:20:50.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:20:50.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:20:50.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:20:50.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:20:50.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:20:50.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:20:50.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:20:50.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:20:50.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:20:50.372 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:20:50.580 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:20:50.922 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:20:51.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:20:51.025 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:20:51.025 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:20:51.212 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:20:51.212 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:21:21.242 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:21:21.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:21:21.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:21:21.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:21:21.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:21:22.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:21:22.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:21:22.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:21:22.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:21:22.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:21:22.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:21:22.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:21:22.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:21:25.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:21:25.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:21:25.022 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:21:25.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:21:25.032 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:21:25.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:21:25.046 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:21:25.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:21:25.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:21:25.047 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:21:25.047 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:21:25.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:21:25.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:21:25.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:21:25.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:21:25.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:21:25.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:21:25.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:21:25.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:21:25.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:21:25.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:21:25.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:21:25.378 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:21:25.450 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:21:05
2026-06-03T19:21:25.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86842, datetime.datetime(2026, 6, 3, 19, 21, 5), datetime.datetime(2026, 6, 3, 19, 21, 4), 'salt', 4.37, 100.14, None, 35.53, 118.07, -0.02, 821.75, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:21:25.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:21:25.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:21:25.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:21:04, diff=21.45859s, valid=True
2026-06-03T19:21:25.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:21:25.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:21:25.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:21:12, diff=13.462092s, valid=True
2026-06-03T19:21:25.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:21:25.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:21:25.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:20:58, diff=27.470141s, valid=True
2026-06-03T19:21:25.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:21:25.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:21:25.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:21:25.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:21:25.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:21:25.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:21:25.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:21:12, diff=13.473866s, valid=True
2026-06-03T19:21:25.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:21:25.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:21:25.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:21:25.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81482.474698s, valid=False
2026-06-03T19:21:25.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:21:25.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:21:25.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:21:25.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:21:25.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:21:25.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:21:25.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:21:25.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:21:25.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:21:25.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:21:25.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:21:25.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:21:25.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:21:25.796 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:21:26.001 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:21:26.402 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:21:26.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:21:26.505 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:21:26.505 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:21:26.697 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:21:26.698 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:21:56.725 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:21:56.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:21:56.726 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:21:57.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:21:57.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:21:57.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:21:57.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:21:57.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:21:57.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:21:57.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:21:57.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:21:57.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:21:57.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:22:00.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:22:00.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:22:00.319 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:22:00.320 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:22:00.330 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:22:00.343 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:22:00.343 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:22:00.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:22:00.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:22:00.345 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:22:00.345 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:22:00.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:22:00.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:22:00.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:22:00.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:22:00.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:22:00.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:22:00.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:22:00.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:22:00.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:22:00.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:22:00.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:22:00.675 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:22:00.747 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:21:35
2026-06-03T19:22:00.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86843, datetime.datetime(2026, 6, 3, 19, 21, 35), datetime.datetime(2026, 6, 3, 19, 21, 35), 'salt', 4.47, 100.1, None, 35.99, 123.19, -0.01, 821.81, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:22:00.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:22:00.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:22:00.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:21:35, diff=25.754612s, valid=True
2026-06-03T19:22:00.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:22:00.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:22:00.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:22:12, diff=-11.241876s, valid=True
2026-06-03T19:22:00.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:22:00.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:22:00.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:21:28, diff=32.766237s, valid=True
2026-06-03T19:22:00.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:22:00.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:22:00.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:22:00.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:22:00.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:22:00.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:22:00.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:22:12, diff=-11.230045s, valid=True
2026-06-03T19:22:00.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:22:00.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:22:00.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:22:00.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81517.770788s, valid=False
2026-06-03T19:22:00.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:22:00.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:22:00.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:22:00.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:22:00.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:22:00.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:22:00.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:22:00.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:22:00.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:22:00.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:22:00.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:22:01.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:22:01.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:22:01.091 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:22:01.352 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:22:01.693 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:22:01.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:22:01.795 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:22:01.795 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:22:01.990 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:22:01.990 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:22:31.990 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:22:31.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:22:31.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:22:32.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:22:32.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:22:32.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:22:32.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:22:32.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:22:32.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:22:32.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:22:32.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:22:32.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:22:32.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:22:35.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:22:35.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:22:35.647 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:22:35.647 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:22:35.659 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:22:35.671 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:22:35.672 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:22:35.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:22:35.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:22:35.673 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:22:35.673 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:22:35.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:22:35.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T19:22:35.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:22:35.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T19:22:35.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:22:35.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:22:35.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:22:35.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:22:35.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:22:36.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:22:36.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:22:36.004 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:22:36.076 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:22:06
2026-06-03T19:22:36.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86844, datetime.datetime(2026, 6, 3, 19, 22, 6), datetime.datetime(2026, 6, 3, 19, 22, 5), 'salt', 4.5, 100.14, None, 40.86, 126.76, -0.02, 821.87, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:22:36.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:22:36.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T19:22:36.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:22:05, diff=31.083691s, valid=True
2026-06-03T19:22:36.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:22:36.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:22:36.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:22:12, diff=24.087008s, valid=True
2026-06-03T19:22:36.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:22:36.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T19:22:36.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:22:00, diff=36.094811s, valid=True
2026-06-03T19:22:36.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:22:36.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:22:36.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:22:36.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:22:36.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:22:36.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:22:36.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:22:12, diff=24.098384s, valid=True
2026-06-03T19:22:36.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:22:36.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:22:36.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:22:36.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81553.099171s, valid=False
2026-06-03T19:22:36.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:22:36.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:22:36.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:22:36.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:22:36.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:22:36.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:22:36.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:22:36.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:22:36.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:22:36.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:22:36.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:22:36.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:22:36.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:22:36.489 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:22:36.693 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:22:37.034 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:22:37.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:22:37.136 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:22:37.136 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:22:37.323 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:22:37.323 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:23:07.353 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:23:07.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:23:07.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:23:07.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:23:07.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:23:07.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:23:07.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:23:07.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:23:07.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:23:07.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:23:07.795 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:23:07.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:23:07.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:23:10.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:23:10.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:23:10.746 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:23:10.746 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:23:10.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:23:10.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:23:10.771 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:23:10.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:23:10.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:23:10.772 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:23:10.772 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:23:10.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:23:10.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:23:10.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:23:11.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:23:11.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:23:11.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:23:11.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:23:11.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:23:11.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:23:11.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:23:11.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:23:11.095 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:23:11.169 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:23:06
2026-06-03T19:23:11.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86846, datetime.datetime(2026, 6, 3, 19, 23, 6), datetime.datetime(2026, 6, 3, 19, 23, 5), 'salt', 4.33, 100.04, None, 39.06, 123.33, -0.01, 821.87, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:23:11.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:23:11.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:23:11.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:23:05, diff=6.175509s, valid=True
2026-06-03T19:23:11.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:23:11.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:23:11.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:23:12, diff=-0.82153s, valid=True
2026-06-03T19:23:11.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:23:11.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:23:11.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:23:03, diff=8.18555s, valid=True
2026-06-03T19:23:11.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:23:11.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:23:11.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:23:11.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:23:11.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:23:11.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:23:11.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:23:12, diff=-0.811232s, valid=True
2026-06-03T19:23:11.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:23:11.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:23:11.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:23:11.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81588.189478s, valid=False
2026-06-03T19:23:11.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:23:11.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:23:11.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:23:11.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:23:11.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:23:11.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:23:11.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:23:11.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:23:11.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:23:11.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:23:11.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:23:11.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:23:11.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:23:11.513 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:23:11.722 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:23:12.068 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:23:12.170 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:23:12.170 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:23:12.170 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:23:12.419 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:23:12.419 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:23:42.449 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:23:42.450 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:23:42.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:23:42.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:23:42.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:23:43.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:23:43.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:23:43.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:23:43.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:23:43.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:23:43.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:23:43.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:23:43.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:23:46.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:23:46.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:23:46.144 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:23:46.144 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:23:46.153 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:23:46.159 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:23:46.160 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:23:46.161 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:23:46.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:23:46.161 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:23:46.161 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:23:46.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:23:46.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:23:46.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:23:46.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:23:46.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:23:46.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:23:46.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:23:46.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:23:46.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:23:46.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:23:46.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:23:46.489 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:23:46.560 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:23:36
2026-06-03T19:23:46.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86847, datetime.datetime(2026, 6, 3, 19, 23, 36), datetime.datetime(2026, 6, 3, 19, 23, 36), 'salt', 4.4, 100.1, None, 35.74, 124.39, -0.02, 821.75, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:23:46.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:23:46.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:23:46.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:23:36, diff=10.567775s, valid=True
2026-06-03T19:23:46.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:23:46.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:23:46.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:24:12, diff=-25.42874s, valid=True
2026-06-03T19:23:46.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:23:46.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:23:46.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:23:34, diff=12.579518s, valid=True
2026-06-03T19:23:46.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:23:46.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:23:46.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:23:46.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:23:46.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:23:46.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:23:46.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:24:12, diff=-25.416584s, valid=True
2026-06-03T19:23:46.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:23:46.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:23:46.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:23:46.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81623.58429s, valid=False
2026-06-03T19:23:46.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:23:46.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:23:46.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:23:46.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:23:46.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:23:46.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:23:46.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:23:46.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:23:46.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:23:46.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:23:46.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:23:46.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:23:46.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:23:46.975 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:23:47.179 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:23:47.519 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:23:47.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:23:47.621 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:23:47.621 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:23:47.814 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:23:47.815 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:24:17.845 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:24:17.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:24:17.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:24:18.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:24:18.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:24:18.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:24:18.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:24:18.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:24:18.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:24:18.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:24:18.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:24:18.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:24:18.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:24:21.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:24:21.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:24:21.275 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:24:21.275 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:24:21.285 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:24:21.297 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:24:21.297 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:24:21.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:24:21.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:24:21.297 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:24:21.297 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:24:21.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:24:21.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:24:21.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:24:21.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:24:21.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:24:21.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:24:21.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:24:21.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:24:21.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:24:21.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:24:21.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:24:21.625 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:24:21.697 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:24:07
2026-06-03T19:24:21.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86848, datetime.datetime(2026, 6, 3, 19, 24, 7), datetime.datetime(2026, 6, 3, 19, 24, 6), 'salt', 4.47, 100.2, None, 36.34, 121.17, -0.03, 821.69, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:24:21.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:24:21.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:24:21.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:24:06, diff=15.70446s, valid=True
2026-06-03T19:24:21.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:24:21.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:24:21.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:24:12, diff=9.707946s, valid=True
2026-06-03T19:24:21.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:24:21.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:24:21.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:24:06, diff=15.716326s, valid=True
2026-06-03T19:24:21.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:24:21.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:24:21.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:24:21.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:24:21.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:24:21.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:24:21.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:24:12, diff=9.720095s, valid=True
2026-06-03T19:24:21.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:24:21.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:24:21.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:24:21.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81658.720915s, valid=False
2026-06-03T19:24:21.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:24:21.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:24:21.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:24:21.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:24:21.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:24:21.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:24:21.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:24:21.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:24:21.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:24:21.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:24:21.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:24:21.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:24:22.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:24:22.040 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:24:22.245 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:24:22.582 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:24:22.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:24:22.685 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:24:22.685 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:24:22.843 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:24:22.843 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:24:52.874 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:24:52.874 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:24:52.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:24:53.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:24:53.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:24:53.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:24:53.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:24:53.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:24:53.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:24:53.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:24:53.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:24:53.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:24:53.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:24:56.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:24:56.249 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:24:56.249 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:24:56.250 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:24:56.261 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:24:56.273 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:24:56.274 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:24:56.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:24:56.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:24:56.275 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:24:56.275 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:24:56.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:24:56.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:24:56.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:24:56.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:24:56.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:24:56.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:24:56.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:24:56.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:24:56.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:24:56.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:24:56.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:24:56.595 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:24:56.667 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:24:37
2026-06-03T19:24:56.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86849, datetime.datetime(2026, 6, 3, 19, 24, 37), datetime.datetime(2026, 6, 3, 19, 24, 36), 'salt', 4.43, 100.14, None, 36.91, 114.97, -0.03, 821.69, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:24:56.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:24:56.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:24:56.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:24:36, diff=20.674776s, valid=True
2026-06-03T19:24:56.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:24:56.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:24:56.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:25:12, diff=-15.321879s, valid=True
2026-06-03T19:24:56.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:24:56.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:24:56.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:24:30, diff=26.686048s, valid=True
2026-06-03T19:24:56.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:24:56.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:24:56.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:24:56.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:24:56.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:24:56.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:24:56.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:25:12, diff=-15.310385s, valid=True
2026-06-03T19:24:56.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:24:56.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:24:56.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:24:56.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81693.690393s, valid=False
2026-06-03T19:24:56.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:24:56.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:24:56.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:24:56.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:24:56.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:24:56.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:24:56.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:24:56.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:24:56.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:24:56.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:24:56.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:24:56.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:24:57.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:24:57.077 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:24:57.283 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:24:57.623 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:24:57.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:24:57.725 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:24:57.725 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:24:57.883 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:24:57.883 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:25:27.910 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:25:27.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:25:27.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:25:28.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:25:28.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:25:28.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:25:28.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:25:28.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:25:28.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:25:28.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:25:28.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:25:28.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:25:28.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:25:31.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:25:31.211 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:25:31.212 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:25:31.212 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:25:31.222 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:25:31.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:25:31.236 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:25:31.236 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:25:31.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:25:31.237 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:25:31.237 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:25:31.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:25:31.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:25:31.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:25:31.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:25:31.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:25:31.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:25:31.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:25:31.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:25:31.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:25:31.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:25:31.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:25:31.577 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:25:31.646 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:25:07
2026-06-03T19:25:31.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86850, datetime.datetime(2026, 6, 3, 19, 25, 7), datetime.datetime(2026, 6, 3, 19, 25, 6), 'salt', 4.4, 100.1, None, 42.97, 119.15, -0.02, 821.69, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:25:31.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:25:31.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:25:31.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:25:06, diff=25.653925s, valid=True
2026-06-03T19:25:31.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:25:31.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:25:31.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:25:12, diff=19.657413s, valid=True
2026-06-03T19:25:31.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:25:31.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:25:31.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:25:00, diff=31.665709s, valid=True
2026-06-03T19:25:31.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:25:31.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:25:31.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:25:31.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:25:31.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:25:31.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:25:31.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:25:12, diff=19.669525s, valid=True
2026-06-03T19:25:31.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:25:31.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:25:31.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:25:31.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81728.670362s, valid=False
2026-06-03T19:25:31.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:25:31.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:25:31.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:25:31.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:25:31.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:25:31.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:25:31.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:25:31.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:25:31.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:25:31.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:25:31.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:25:31.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:25:31.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:25:31.992 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:25:32.197 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:25:32.536 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:25:32.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:25:32.640 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:25:32.640 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:25:32.835 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:25:32.835 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:26:02.839 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:26:02.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:26:02.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:26:03.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:26:03.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:26:03.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:26:03.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:26:03.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:26:03.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:26:03.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:26:03.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:26:03.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:26:03.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:26:06.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:26:06.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:26:06.329 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:26:06.330 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:26:06.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:26:06.354 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:26:06.354 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:26:06.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:26:06.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:26:06.355 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:26:06.355 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:26:06.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:26:06.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T19:26:06.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:26:06.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T19:26:06.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:26:06.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:26:06.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:26:06.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:26:06.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:26:06.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:26:06.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:26:06.685 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:26:06.759 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:25:37
2026-06-03T19:26:06.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86851, datetime.datetime(2026, 6, 3, 19, 25, 37), datetime.datetime(2026, 6, 3, 19, 25, 37), 'salt', 4.43, 100.14, None, 41.74, 119.69, -0.03, 821.87, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:26:06.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:26:06.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T19:26:06.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:25:37, diff=29.767012s, valid=True
2026-06-03T19:26:06.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:26:06.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:26:06.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:26:12, diff=-5.229499s, valid=True
2026-06-03T19:26:06.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:26:06.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T19:26:06.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:25:30, diff=36.778883s, valid=True
2026-06-03T19:26:06.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:26:06.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:26:06.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:26:06.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:26:06.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:26:06.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:26:06.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:26:12, diff=-5.217345s, valid=True
2026-06-03T19:26:06.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:26:06.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:26:06.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:26:06.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81763.783464s, valid=False
2026-06-03T19:26:06.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:26:06.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:26:06.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:26:06.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:26:06.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:26:06.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:26:06.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:26:06.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:26:06.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:26:06.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:26:06.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:26:07.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:26:07.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:26:07.106 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:26:07.317 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:26:07.658 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:26:07.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:26:07.760 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:26:07.760 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:26:07.853 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:26:07.853 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:26:37.883 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:26:37.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:26:37.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:26:38.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:26:38.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:26:38.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:26:38.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:26:38.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:26:38.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:26:38.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:26:38.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:26:38.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:26:38.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:26:41.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:26:41.652 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:26:41.653 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:26:41.653 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:26:41.663 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:26:41.676 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:26:41.677 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:26:41.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:26:41.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:26:41.678 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:26:41.678 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:26:41.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:26:41.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:26:41.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:26:41.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:26:41.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:26:41.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:26:41.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:26:42.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:26:42.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:26:42.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:26:42.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:26:42.021 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:26:42.092 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:26:38
2026-06-03T19:26:42.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86853, datetime.datetime(2026, 6, 3, 19, 26, 38), datetime.datetime(2026, 6, 3, 19, 26, 37), 'salt', 4.37, 100.14, None, 44.14, 126.31, -0.02, 821.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:26:42.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:26:42.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:26:42.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:26:37, diff=5.10047s, valid=True
2026-06-03T19:26:42.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:26:42.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:26:42.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:27:12, diff=-29.89591s, valid=True
2026-06-03T19:26:42.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:26:42.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:26:42.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:26:32, diff=10.112599s, valid=True
2026-06-03T19:26:42.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:26:42.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:26:42.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:26:42.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:26:42.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:26:42.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:26:42.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:27:12, diff=-29.88352s, valid=True
2026-06-03T19:26:42.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:26:42.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:26:42.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:26:42.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81799.11733s, valid=False
2026-06-03T19:26:42.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:26:42.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:26:42.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:26:42.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:26:42.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:26:42.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:26:42.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:26:42.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:26:42.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:26:42.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:26:42.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:26:42.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:26:42.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:26:42.439 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:26:42.645 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:26:42.983 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:26:43.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:26:43.086 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:26:43.086 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:26:43.275 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:26:43.275 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:27:13.305 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:27:13.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:27:13.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:27:13.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:27:13.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:27:13.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:27:13.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:27:13.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:27:13.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:27:13.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:27:13.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:27:13.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:27:13.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:27:16.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:27:16.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:27:16.946 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:27:16.946 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:27:16.955 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:27:16.967 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:27:16.968 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:27:16.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:27:16.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:27:16.969 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:27:16.969 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:27:16.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:27:17.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:27:17.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:27:17.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:27:17.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:27:17.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:27:17.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:27:17.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:27:17.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:27:17.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:27:17.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:27:17.327 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:27:17.405 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:27:08
2026-06-03T19:27:17.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86854, datetime.datetime(2026, 6, 3, 19, 27, 8), datetime.datetime(2026, 6, 3, 19, 27, 7), 'salt', 4.37, 100.14, None, 42.23, 118.94, -0.02, 821.69, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:27:17.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:27:17.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:27:17.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:27:07, diff=10.413086s, valid=True
2026-06-03T19:27:17.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:27:17.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:27:17.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:27:12, diff=5.416691s, valid=True
2026-06-03T19:27:17.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:27:17.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:27:17.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:27:04, diff=13.425142s, valid=True
2026-06-03T19:27:17.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:27:17.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:27:17.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:27:17.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:27:17.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:27:17.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:27:17.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:27:12, diff=5.428965s, valid=True
2026-06-03T19:27:17.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:27:17.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:27:17.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:27:17.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81834.429805s, valid=False
2026-06-03T19:27:17.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:27:17.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:27:17.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:27:17.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:27:17.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:27:17.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:27:17.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:27:17.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:27:17.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:27:17.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:27:17.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:27:17.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:27:17.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:27:17.752 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:27:17.975 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:27:18.320 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:27:18.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:27:18.423 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:27:18.423 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:27:18.615 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:27:18.615 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:27:48.645 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:27:48.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:27:48.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:27:48.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:27:48.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:27:49.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:27:49.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:27:49.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:27:49.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:27:49.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:27:49.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:27:49.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:27:49.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:27:52.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:27:52.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:27:52.015 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:27:52.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:27:52.024 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:27:52.037 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:27:52.037 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:27:52.038 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:27:52.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:27:52.038 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:27:52.038 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:27:52.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:27:52.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:27:52.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:27:52.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:27:52.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:27:52.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:27:52.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:27:52.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:27:52.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:27:52.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:27:52.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:27:52.383 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:27:52.469 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:27:38
2026-06-03T19:27:52.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86855, datetime.datetime(2026, 6, 3, 19, 27, 38), datetime.datetime(2026, 6, 3, 19, 27, 38), 'salt', 4.33, 100.14, None, 41.39, 132.23, -0.03, 821.69, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:27:52.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:27:52.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:27:52.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:27:38, diff=14.477087s, valid=True
2026-06-03T19:27:52.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:27:52.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:27:52.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:28:12, diff=-19.519439s, valid=True
2026-06-03T19:27:52.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:27:52.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:27:52.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:27:35, diff=17.48872s, valid=True
2026-06-03T19:27:52.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:27:52.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:27:52.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:27:52.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:27:52.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:27:52.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:27:52.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:28:12, diff=-19.507597s, valid=True
2026-06-03T19:27:52.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:27:52.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:27:52.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:27:52.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81869.493226s, valid=False
2026-06-03T19:27:52.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:27:52.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:27:52.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:27:52.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:27:52.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:27:52.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:27:52.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:27:52.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:27:52.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:27:52.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:27:52.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:27:52.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:27:52.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:27:52.815 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:27:53.081 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:27:53.424 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:27:53.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:27:53.527 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:27:53.527 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:27:53.619 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:27:53.619 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:28:23.649 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:28:23.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:28:23.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:28:23.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:28:23.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:28:24.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:28:24.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:28:24.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:28:24.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:28:24.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:28:24.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:28:24.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:28:24.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:28:27.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:28:27.168 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:28:27.169 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:28:27.170 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:28:27.181 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:28:27.194 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:28:27.195 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:28:27.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:28:27.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:28:27.196 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:28:27.196 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:28:27.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:28:27.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:28:27.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:28:27.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:28:27.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:28:27.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:28:27.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:28:27.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:28:27.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:28:27.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:28:27.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:28:27.532 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:28:27.631 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:28:10
2026-06-03T19:28:27.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86856, datetime.datetime(2026, 6, 3, 19, 28, 10), datetime.datetime(2026, 6, 3, 19, 28, 8), 'salt', 4.33, 100.14, None, 43.54, 127.0, -0.03, 821.69, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T19:28:27.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:28:27.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:28:27.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:28:08, diff=19.638864s, valid=True
2026-06-03T19:28:27.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:28:27.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:28:27.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:28:12, diff=15.642339s, valid=True
2026-06-03T19:28:27.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:28:27.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:28:27.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:28:07, diff=20.650464s, valid=True
2026-06-03T19:28:27.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:28:27.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:28:27.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:28:27.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:28:27.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:28:27.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:28:27.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:28:12, diff=15.65416s, valid=True
2026-06-03T19:28:27.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:28:27.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:28:27.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:28:27.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81904.654967s, valid=False
2026-06-03T19:28:27.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:28:27.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:28:27.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:28:27.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:28:27.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:28:27.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:28:27.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:28:27.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:28:27.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:28:27.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:28:27.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:28:27.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:28:27.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:28:27.976 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:28:28.184 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:28:28.527 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:28:28.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:28:28.631 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:28:28.631 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:28:28.720 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:28:28.720 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:28:58.723 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:28:58.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:28:58.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:28:58.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:28:58.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:28:59.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:28:59.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:28:59.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:28:59.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:28:59.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:28:59.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:28:59.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:28:59.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:29:01.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:29:01.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:29:01.984 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:29:01.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:29:01.995 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:29:02.008 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:29:02.008 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:29:02.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:29:02.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:29:02.009 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:29:02.010 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:29:02.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:29:02.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:29:02.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:29:02.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:29:02.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:29:02.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:29:02.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:29:02.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:29:02.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:29:02.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:29:02.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:29:02.359 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:29:02.431 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:28:40
2026-06-03T19:29:02.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86857, datetime.datetime(2026, 6, 3, 19, 28, 40), datetime.datetime(2026, 6, 3, 19, 28, 39), 'salt', 4.23, 100.07, None, 47.21, 126.24, -0.02, 821.87, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T19:29:02.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:29:02.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:29:02.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:28:39, diff=23.438455s, valid=True
2026-06-03T19:29:02.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:29:02.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:29:02.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:29:12, diff=-9.558069s, valid=True
2026-06-03T19:29:02.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:29:02.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:29:02.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:28:39, diff=23.450126s, valid=True
2026-06-03T19:29:02.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:29:02.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:29:02.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:29:02.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:29:02.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:29:02.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:29:02.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:29:12, diff=-9.546115s, valid=True
2026-06-03T19:29:02.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:29:02.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:29:02.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:29:02.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81939.454707s, valid=False
2026-06-03T19:29:02.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:29:02.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:29:02.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:29:02.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:29:02.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:29:02.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:29:02.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:29:02.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:29:02.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:29:02.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:29:02.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:29:02.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:29:02.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:29:02.852 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:29:03.059 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:29:03.401 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:29:03.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:29:03.504 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:29:03.504 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:29:03.791 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:29:03.791 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:29:33.821 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:29:33.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:29:33.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:29:34.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:29:34.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:29:34.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:29:34.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:29:34.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:29:34.429 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:29:34.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:29:34.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:29:34.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:29:34.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:29:37.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:29:37.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:29:37.437 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:29:37.438 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:29:37.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:29:37.458 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:29:37.458 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:29:37.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:29:37.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:29:37.458 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:29:37.459 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:29:37.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:29:37.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:29:37.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:29:37.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:29:37.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:29:37.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:29:37.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:29:37.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:29:37.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:29:37.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:29:37.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:29:37.745 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:29:37.829 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:29:11
2026-06-03T19:29:37.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86858, datetime.datetime(2026, 6, 3, 19, 29, 11), datetime.datetime(2026, 6, 3, 19, 29, 9), 'salt', 4.3, 100.17, None, 44.84, 120.87, -0.03, 821.75, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T19:29:37.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:29:37.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:29:37.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:29:09, diff=28.835515s, valid=True
2026-06-03T19:29:37.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:29:37.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:29:37.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:29:12, diff=25.838349s, valid=True
2026-06-03T19:29:37.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:29:37.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:29:37.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:29:10, diff=27.845001s, valid=True
2026-06-03T19:29:37.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:29:37.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:29:37.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:29:37.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:29:37.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:29:37.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:29:37.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:29:12, diff=25.847977s, valid=True
2026-06-03T19:29:37.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:29:37.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:29:37.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:29:37.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=81974.848651s, valid=False
2026-06-03T19:29:37.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:29:37.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:29:37.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:29:37.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:29:37.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:29:37.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:29:37.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:29:37.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:29:37.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:29:37.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:29:38.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:29:38.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:29:38.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:29:38.181 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:29:38.390 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:29:38.735 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:29:38.838 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:29:38.838 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:29:38.838 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:29:38.930 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:29:38.931 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:30:08.961 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:30:08.961 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:30:08.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:30:09.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:30:09.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:30:09.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:30:09.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:30:09.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:30:09.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:30:09.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:30:09.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:30:09.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:30:09.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:30:12.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:30:12.377 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:30:12.377 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:30:12.378 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:30:12.388 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:30:12.407 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:30:12.407 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:30:12.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:30:12.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:30:12.408 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:30:12.409 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:30:12.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:30:12.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:30:12.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:30:12.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:30:12.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:30:12.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:30:12.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:30:12.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:30:12.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:30:12.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:30:12.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:30:12.717 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:30:12.794 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:30:11
2026-06-03T19:30:12.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86860, datetime.datetime(2026, 6, 3, 19, 30, 11), datetime.datetime(2026, 6, 3, 19, 30, 11), 'salt', 4.3, 100.1, None, 39.62, 115.11, -0.02, 821.87, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:30:12.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:30:12.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:30:12.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:30:11, diff=1.801253s, valid=True
2026-06-03T19:30:12.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:30:12.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:30:12.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:30:12, diff=0.804651s, valid=True
2026-06-03T19:30:12.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:30:12.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:30:12.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:30:03, diff=9.812547s, valid=True
2026-06-03T19:30:12.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:30:12.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:30:12.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:30:12.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:30:12.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:30:12.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:30:12.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:30:12, diff=0.816109s, valid=True
2026-06-03T19:30:12.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:30:12.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:30:12.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:30:12.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82009.816904s, valid=False
2026-06-03T19:30:12.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:30:12.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:30:12.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:30:12.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:30:12.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:30:12.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:30:12.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:30:12.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:30:12.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:30:12.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:30:13.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:30:13.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:30:13.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:30:13.204 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:30:13.408 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:30:13.751 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:30:13.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:30:13.853 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:30:13.853 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:30:14.040 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:30:14.040 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:30:44.071 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:30:44.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:30:44.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:30:44.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:30:44.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:30:44.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:30:44.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:30:44.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:30:44.477 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:30:44.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:30:44.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:30:44.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:30:44.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:30:47.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:30:47.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:30:47.488 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:30:47.489 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:30:47.498 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:30:47.518 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:30:47.519 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:30:47.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:30:47.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:30:47.520 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:30:47.520 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:30:47.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:30:47.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:30:47.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:30:47.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:30:47.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:30:47.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:30:47.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:30:47.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:30:47.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:30:47.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:30:47.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:30:47.859 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:30:47.935 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:30:42
2026-06-03T19:30:47.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86861, datetime.datetime(2026, 6, 3, 19, 30, 42), datetime.datetime(2026, 6, 3, 19, 30, 41), 'salt', 4.4, 100.17, None, 43.68, 120.05, -0.03, 821.63, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:30:47.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:30:47.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:30:47.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:30:41, diff=6.942766s, valid=True
2026-06-03T19:30:47.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:30:47.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:30:47.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:31:12, diff=-24.053851s, valid=True
2026-06-03T19:30:47.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:30:47.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:30:47.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:30:34, diff=13.95403s, valid=True
2026-06-03T19:30:47.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:30:47.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:30:47.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:30:47.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:30:47.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:30:47.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:30:47.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:31:12, diff=-24.042372s, valid=True
2026-06-03T19:30:47.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:30:47.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:30:47.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:30:47.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82044.958388s, valid=False
2026-06-03T19:30:47.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:30:47.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:30:47.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:30:47.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:30:47.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:30:48.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:30:48.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:30:48.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:30:48.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:30:48.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:30:48.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:30:48.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:30:48.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:30:48.277 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:30:48.484 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:30:48.825 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:30:48.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:30:48.929 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:30:48.929 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:30:49.125 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:30:49.125 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:31:19.156 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:31:19.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:31:19.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:31:19.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:31:19.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:31:19.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:31:19.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:31:19.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:31:19.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:31:19.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:31:19.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:31:19.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:31:19.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:31:22.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:31:22.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:31:22.769 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:31:22.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:31:22.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:31:22.792 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:31:22.792 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:31:22.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:31:22.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:31:22.794 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:31:22.794 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:31:22.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:31:22.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:31:22.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:31:23.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:31:23.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:31:23.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:31:23.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:31:23.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:31:23.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:31:23.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:31:23.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:31:23.147 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:31:23.231 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:31:12
2026-06-03T19:31:23.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86862, datetime.datetime(2026, 6, 3, 19, 31, 12), datetime.datetime(2026, 6, 3, 19, 31, 11), 'salt', 4.23, 100.07, None, 53.28, 114.72, -0.02, 821.63, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:31:23.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:31:23.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:31:23.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:31:11, diff=12.238753s, valid=True
2026-06-03T19:31:23.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:31:23.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:31:23.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:31:12, diff=11.242405s, valid=True
2026-06-03T19:31:23.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:31:23.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:31:23.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:31:05, diff=18.250957s, valid=True
2026-06-03T19:31:23.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:31:23.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:31:23.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:31:23.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:31:23.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:31:23.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:31:23.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:31:12, diff=11.254917s, valid=True
2026-06-03T19:31:23.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:31:23.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:31:23.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:31:23.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82080.255789s, valid=False
2026-06-03T19:31:23.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:31:23.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:31:23.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:31:23.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:31:23.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:31:23.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:31:23.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:31:23.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:31:23.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:31:23.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:31:23.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:31:23.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:31:23.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:31:23.644 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:31:23.852 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:31:24.193 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:31:24.295 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:31:24.295 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:31:24.296 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:31:24.483 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:31:24.483 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:31:54.509 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:31:54.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:31:54.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:31:54.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:31:54.674 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:31:54.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:31:54.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:31:54.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:31:54.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:31:54.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:31:54.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:31:54.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:31:54.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:31:57.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:31:57.949 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:31:57.950 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:31:57.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:31:57.960 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:31:57.973 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:31:57.974 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:31:57.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:31:57.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:31:57.975 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:31:57.975 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:31:57.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:31:58.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:31:58.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:31:58.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:31:58.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:31:58.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:31:58.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:31:58.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:31:58.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:31:58.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:31:58.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:31:58.266 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:31:58.335 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:31:42
2026-06-03T19:31:58.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86863, datetime.datetime(2026, 6, 3, 19, 31, 42), datetime.datetime(2026, 6, 3, 19, 31, 42), 'salt', 4.23, 100.1, None, 47.46, 117.02, -0.02, 821.81, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:31:58.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:31:58.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:31:58.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:31:42, diff=16.341162s, valid=True
2026-06-03T19:31:58.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:31:58.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:31:58.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:32:12, diff=-13.65606s, valid=True
2026-06-03T19:31:58.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:31:58.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:31:58.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:31:37, diff=21.350504s, valid=True
2026-06-03T19:31:58.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:31:58.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:31:58.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:31:58.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:31:58.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:31:58.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:31:58.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:32:12, diff=-13.646543s, valid=True
2026-06-03T19:31:58.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:31:58.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:31:58.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:31:58.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82115.354117s, valid=False
2026-06-03T19:31:58.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:31:58.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:31:58.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:31:58.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:31:58.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:31:58.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:31:58.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:31:58.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:31:58.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:31:58.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:31:58.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:31:58.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:31:58.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:31:58.669 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:31:58.876 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:31:59.233 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:31:59.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:31:59.336 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:31:59.336 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:31:59.616 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:31:59.616 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:32:29.646 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:32:29.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:32:29.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:32:29.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:32:29.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:32:30.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:32:30.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:32:30.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:32:30.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:32:30.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:32:30.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:32:30.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:32:30.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:32:32.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:32:33.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:32:33.005 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:32:33.005 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:32:33.016 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:32:33.029 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:32:33.029 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:32:33.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:32:33.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:32:33.031 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:32:33.031 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:32:33.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:32:33.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:32:33.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:32:33.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:32:33.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:32:33.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:32:33.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:32:33.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:32:33.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:32:33.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:32:33.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:32:33.370 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:32:33.441 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:32:13
2026-06-03T19:32:33.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86864, datetime.datetime(2026, 6, 3, 19, 32, 13), datetime.datetime(2026, 6, 3, 19, 32, 12), 'salt', 4.2, 100.17, None, 50.07, 117.77, -0.03, 821.57, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:32:33.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:32:33.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:32:33.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:32:12, diff=21.449134s, valid=True
2026-06-03T19:32:33.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:32:33.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:32:33.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:32:12, diff=21.452589s, valid=True
2026-06-03T19:32:33.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:32:33.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:32:33.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:32:08, diff=25.460837s, valid=True
2026-06-03T19:32:33.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:32:33.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:32:33.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:32:33.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:32:33.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:32:33.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:32:33.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:32:12, diff=21.464531s, valid=True
2026-06-03T19:32:33.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:32:33.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:32:33.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:32:33.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82150.465347s, valid=False
2026-06-03T19:32:33.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:32:33.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:32:33.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:32:33.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:32:33.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:32:33.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:32:33.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:32:33.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:32:33.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:32:33.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:32:33.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:32:33.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:32:33.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:32:33.787 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:32:33.995 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:32:34.337 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:32:34.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:32:34.440 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:32:34.441 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:32:34.629 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:32:34.629 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:33:04.660 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:33:04.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:33:04.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:33:04.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:33:04.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:33:05.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:33:05.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:33:05.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:33:05.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:33:05.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:33:05.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:33:05.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:33:05.274 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:33:08.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:33:08.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:33:08.212 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:33:08.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:33:08.224 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:33:08.237 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:33:08.237 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:33:08.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:33:08.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:33:08.239 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:33:08.239 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:33:08.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:33:08.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:33:08.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:33:08.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:33:08.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:33:08.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:33:08.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:33:08.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:33:08.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:33:08.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:33:08.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:33:08.572 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:33:08.643 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:32:43
2026-06-03T19:33:08.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86865, datetime.datetime(2026, 6, 3, 19, 32, 43), datetime.datetime(2026, 6, 3, 19, 32, 42), 'salt', 4.07, 100.07, None, 45.94, 115.42, -0.01, 821.63, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:33:08.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:33:08.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:33:08.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:32:42, diff=26.6506s, valid=True
2026-06-03T19:33:08.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:33:08.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:33:08.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:33:12, diff=-3.345925s, valid=True
2026-06-03T19:33:08.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:33:08.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:33:08.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:32:40, diff=28.662253s, valid=True
2026-06-03T19:33:08.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:33:08.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:33:08.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:33:08.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:33:08.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:33:08.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:33:08.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:33:12, diff=-3.33403s, valid=True
2026-06-03T19:33:08.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:33:08.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:33:08.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:33:08.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82185.666793s, valid=False
2026-06-03T19:33:08.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:33:08.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:33:08.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:33:08.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:33:08.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:33:08.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:33:08.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:33:08.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:33:08.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:33:08.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:33:08.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:33:08.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:33:08.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:33:08.987 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:33:09.194 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:33:09.594 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:33:09.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:33:09.699 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:33:09.699 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:33:09.890 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:33:09.890 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:33:39.899 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:33:39.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:33:39.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:33:40.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:33:40.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:33:40.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:33:40.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:33:40.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:33:40.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:33:40.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:33:40.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:33:40.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:33:40.633 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:33:43.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:33:43.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:33:43.705 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:33:43.706 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:33:43.716 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:33:43.729 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:33:43.729 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:33:43.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:33:43.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:33:43.731 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:33:43.731 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:33:43.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:33:43.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T19:33:43.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:33:43.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T19:33:43.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:33:44.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:33:44.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:33:44.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:33:44.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:33:44.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:33:44.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:33:44.062 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:33:44.133 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:33:14
2026-06-03T19:33:44.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86866, datetime.datetime(2026, 6, 3, 19, 33, 14), datetime.datetime(2026, 6, 3, 19, 33, 12), 'salt', 4.1, 100.07, None, 41.81, 122.68, -0.01, 821.69, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:33:44.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:33:44.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T19:33:44.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:33:12, diff=32.141253s, valid=True
2026-06-03T19:33:44.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:33:44.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:33:44.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:33:12, diff=32.144729s, valid=True
2026-06-03T19:33:44.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:33:44.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T19:33:44.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:33:11, diff=33.152982s, valid=True
2026-06-03T19:33:44.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:33:44.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:33:44.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:33:44.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:33:44.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:33:44.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:33:44.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:33:12, diff=32.156667s, valid=True
2026-06-03T19:33:44.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:33:44.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:33:44.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:33:44.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82221.157471s, valid=False
2026-06-03T19:33:44.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:33:44.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:33:44.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:33:44.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:33:44.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:33:44.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:33:44.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:33:44.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:33:44.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:33:44.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:33:44.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:33:44.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:33:44.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:33:44.486 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:33:44.700 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:33:45.045 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:33:45.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:33:45.147 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:33:45.148 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:33:45.331 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:33:45.331 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:34:15.344 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:34:15.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:34:15.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:34:15.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:34:15.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:34:16.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:34:16.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:34:16.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:34:16.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:34:16.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:34:16.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:34:16.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:34:16.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:34:19.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:34:19.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:34:19.042 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:34:19.042 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:34:19.052 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:34:19.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:34:19.065 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:34:19.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:34:19.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:34:19.066 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:34:19.067 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:34:19.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:34:19.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:34:19.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:34:19.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:34:19.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:34:19.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:34:19.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:34:19.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:34:19.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:34:19.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:34:19.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:34:19.399 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:34:19.471 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:34:14
2026-06-03T19:34:19.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86868, datetime.datetime(2026, 6, 3, 19, 34, 14), datetime.datetime(2026, 6, 3, 19, 34, 13), 'salt', 4.13, 100.07, None, 42.48, 116.76, -0.02, 821.63, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:34:19.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:34:19.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:34:19.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:34:13, diff=6.478896s, valid=True
2026-06-03T19:34:19.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:34:19.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:34:19.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:34:12, diff=7.482345s, valid=True
2026-06-03T19:34:19.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:34:19.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:34:19.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:34:14, diff=5.490532s, valid=True
2026-06-03T19:34:19.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:34:19.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:34:19.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:34:19.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:34:19.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:34:19.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:34:19.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:34:12, diff=7.494248s, valid=True
2026-06-03T19:34:19.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:34:19.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:34:19.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:34:19.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82256.495053s, valid=False
2026-06-03T19:34:19.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:34:19.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:34:19.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:34:19.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:34:19.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:34:19.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:34:19.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:34:19.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:34:19.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:34:19.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:34:19.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:34:19.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:34:19.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:34:19.899 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:34:20.151 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:34:20.509 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:34:20.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:34:20.611 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:34:20.611 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:34:20.892 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:34:20.892 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:34:50.901 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:34:50.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:34:50.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:34:51.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:34:51.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:34:51.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:34:51.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:34:51.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:34:51.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:34:51.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:34:51.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:34:51.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:34:51.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:34:54.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:34:54.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:34:54.650 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:34:54.650 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:34:54.659 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:34:54.671 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:34:54.672 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:34:54.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:34:54.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:34:54.673 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:34:54.673 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:34:54.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:34:54.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:34:54.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:34:54.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:34:54.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:34:54.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:34:54.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:34:55.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:34:55.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:34:55.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:34:55.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:34:55.018 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:34:55.092 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:34:44
2026-06-03T19:34:55.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86869, datetime.datetime(2026, 6, 3, 19, 34, 44), datetime.datetime(2026, 6, 3, 19, 34, 44), 'salt', 4.1, 100.07, None, 49.71, 121.64, -0.02, 821.93, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:34:55.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:34:55.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:34:55.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:34:44, diff=11.099822s, valid=True
2026-06-03T19:34:55.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:34:55.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:34:55.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:35:12, diff=-16.896705s, valid=True
2026-06-03T19:34:55.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:34:55.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:34:55.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:34:44, diff=11.111514s, valid=True
2026-06-03T19:34:55.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:34:55.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:34:55.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:34:55.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:34:55.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:34:55.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:34:55.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:35:12, diff=-16.884783s, valid=True
2026-06-03T19:34:55.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:34:55.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:34:55.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:34:55.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82292.116052s, valid=False
2026-06-03T19:34:55.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:34:55.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:34:55.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:34:55.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:34:55.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:34:55.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:34:55.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:34:55.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:34:55.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:34:55.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:34:55.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:34:55.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:34:55.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:34:55.438 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:34:55.645 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:34:55.987 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:34:56.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:34:56.091 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:34:56.091 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:34:56.283 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:34:56.283 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:35:26.313 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:35:26.314 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:35:26.314 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:35:26.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:35:26.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:35:27.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:35:27.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:35:27.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:35:27.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:35:27.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:35:27.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:35:27.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:35:27.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:35:30.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:35:30.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:35:30.017 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:35:30.017 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:35:30.025 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:35:30.037 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:35:30.037 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:35:30.038 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:35:30.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:35:30.038 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:35:30.038 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:35:30.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:35:30.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:35:30.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:35:30.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:35:30.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:35:30.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:35:30.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:35:30.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-03T19:35:30.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:35:30.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:35:30.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:35:30.345 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:35:30.415 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:35:15
2026-06-03T19:35:30.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86870, datetime.datetime(2026, 6, 3, 19, 35, 15), datetime.datetime(2026, 6, 3, 19, 35, 14), 'salt', 4.1, 100.11, None, 45.69, 94.73, -0.02, 821.51, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:35:30.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:35:30.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:35:30.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:35:14, diff=16.423186s, valid=True
2026-06-03T19:35:30.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:35:30.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:35:30.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:35:12, diff=18.42654s, valid=True
2026-06-03T19:35:30.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:35:30.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:35:30.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:35:14, diff=16.434468s, valid=True
2026-06-03T19:35:30.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:35:30.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:35:30.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:35:30.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:35:30.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:35:30.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-03T19:35:30.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:35:12, diff=18.438125s, valid=True
2026-06-03T19:35:30.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:35:30.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:35:30.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:35:30.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82327.438936s, valid=False
2026-06-03T19:35:30.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:35:30.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:35:30.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:35:30.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:35:30.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:35:30.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:35:30.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:35:30.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:35:30.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:35:30.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:35:30.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:35:30.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:35:30.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:35:30.826 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:35:31.032 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:35:31.375 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:35:31.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:35:31.478 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:35:31.478 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:35:31.661 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:35:31.662 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:36:01.663 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:36:01.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:36:01.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:36:02.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:36:02.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:36:02.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:36:02.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:36:02.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:36:02.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:36:02.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:36:02.429 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:36:02.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:36:02.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:36:05.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:36:05.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:36:05.294 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:36:05.295 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:36:05.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:36:05.316 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:36:05.317 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:36:05.317 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:36:05.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:36:05.318 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:36:05.318 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:36:05.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:36:05.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:36:05.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:36:05.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:36:05.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:36:05.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:36:05.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:36:05.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:36:05.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:36:05.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:36:05.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:36:05.679 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:36:05.752 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:35:45
2026-06-03T19:36:05.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86871, datetime.datetime(2026, 6, 3, 19, 35, 45), datetime.datetime(2026, 6, 3, 19, 35, 44), 'salt', 4.1, 100.14, None, 46.29, 116.73, -0.03, 821.57, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:36:05.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:36:05.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:36:05.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:35:44, diff=21.760035s, valid=True
2026-06-03T19:36:05.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:36:05.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:36:05.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:36:12, diff=-6.236351s, valid=True
2026-06-03T19:36:05.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:36:05.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:36:05.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:35:45, diff=20.772089s, valid=True
2026-06-03T19:36:05.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:36:05.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:36:05.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:36:05.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:36:05.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:36:05.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:36:05.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:36:12, diff=-6.224003s, valid=True
2026-06-03T19:36:05.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:36:05.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:36:05.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:36:05.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82362.776852s, valid=False
2026-06-03T19:36:05.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:36:05.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:36:05.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:36:05.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:36:05.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:36:05.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:36:05.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:36:05.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:36:05.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:36:05.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:36:05.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:36:06.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:36:06.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:36:06.100 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:36:06.307 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:36:06.649 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:36:06.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:36:06.754 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:36:06.754 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:36:06.950 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:36:06.951 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:36:36.961 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:36:36.961 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:36:36.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:36:37.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:36:37.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:36:37.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:36:37.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:36:37.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:36:37.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:36:37.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:36:37.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:36:37.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:36:37.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:36:40.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:36:40.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:36:40.555 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:36:40.555 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:36:40.565 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:36:40.578 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:36:40.579 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:36:40.579 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:36:40.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:36:40.580 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:36:40.580 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:36:40.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:36:40.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:36:40.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:36:40.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:36:40.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:36:40.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:36:40.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:36:40.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T19:36:40.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:36:40.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:36:40.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:36:40.937 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:36:41.012 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:36:15
2026-06-03T19:36:41.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86872, datetime.datetime(2026, 6, 3, 19, 36, 15), datetime.datetime(2026, 6, 3, 19, 36, 14), 'salt', 4.1, 100.07, None, 46.19, 115.89, -0.02, 821.63, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:36:41.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:36:41.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:36:41.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:36:14, diff=27.018724s, valid=True
2026-06-03T19:36:41.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:36:41.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:36:41.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:36:12, diff=29.021771s, valid=True
2026-06-03T19:36:41.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:36:41.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:36:41.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:36:15, diff=26.029134s, valid=True
2026-06-03T19:36:41.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:36:41.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:36:41.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:36:41.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:36:41.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:36:41.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T19:36:41.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:36:12, diff=29.03287s, valid=True
2026-06-03T19:36:41.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:36:41.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:36:41.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:36:41.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82398.03373s, valid=False
2026-06-03T19:36:41.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:36:41.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:36:41.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:36:41.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:36:41.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:36:41.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:36:41.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:36:41.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:36:41.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:36:41.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:36:41.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:36:41.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:36:41.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:36:41.419 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:36:41.626 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:36:41.968 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:36:42.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:36:42.070 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:36:42.070 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:36:42.227 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:36:42.228 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:37:12.258 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:37:12.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:37:12.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:37:12.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:37:12.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:37:12.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:37:12.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:37:12.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:37:12.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:37:12.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:37:12.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:37:12.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:37:12.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:37:15.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:37:16.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:37:16.005 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:37:16.005 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:37:16.017 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:37:16.029 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:37:16.030 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:37:16.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:37:16.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:37:16.031 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:37:16.031 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:37:16.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:37:16.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T19:37:16.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:37:16.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T19:37:16.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:37:16.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T19:37:16.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:37:16.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T19:37:16.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:37:16.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:37:16.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:37:16.372 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:37:16.443 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:36:46
2026-06-03T19:37:16.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86873, datetime.datetime(2026, 6, 3, 19, 36, 46), datetime.datetime(2026, 6, 3, 19, 36, 45), 'salt', 4.04, 99.97, None, 43.68, 132.63, 0.01, 821.69, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:37:16.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:37:16.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T19:37:16.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:36:45, diff=31.451079s, valid=True
2026-06-03T19:37:16.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:37:16.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T19:37:16.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:37:12, diff=4.45446s, valid=True
2026-06-03T19:37:16.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:37:16.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T19:37:16.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:36:45, diff=31.462277s, valid=True
2026-06-03T19:37:16.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:37:16.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:37:16.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:37:16.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:37:16.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:37:16.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T19:37:16.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:37:12, diff=4.465894s, valid=True
2026-06-03T19:37:16.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:37:16.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:37:16.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:37:16.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82433.46667s, valid=False
2026-06-03T19:37:16.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:37:16.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:37:16.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:37:16.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:37:16.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:37:16.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:37:16.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:37:16.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:37:16.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:37:16.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:37:16.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:37:16.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:37:16.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:37:16.787 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:37:16.982 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:37:17.318 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:37:17.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:37:17.420 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:37:17.420 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:37:17.579 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:37:17.580 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:37:47.608 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:37:47.609 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:37:47.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:37:47.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:37:47.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:37:48.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:37:48.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:37:48.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:37:48.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:37:48.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:37:48.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:37:48.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:37:48.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:37:51.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:37:51.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:37:51.084 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:37:51.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:37:51.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:37:51.107 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:37:51.108 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:37:51.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:37:51.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:37:51.109 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:37:51.109 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:37:51.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:37:51.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:37:51.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:37:51.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:37:51.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:37:51.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T19:37:51.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:37:51.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T19:37:51.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:37:51.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:37:51.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:37:51.451 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:37:51.525 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:37:47
2026-06-03T19:37:51.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86875, datetime.datetime(2026, 6, 3, 19, 37, 47), datetime.datetime(2026, 6, 3, 19, 37, 46), 'salt', 4.0, 100.11, None, 41.67, 125.59, -0.02, 821.75, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:37:51.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:37:51.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:37:51.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:37:46, diff=5.533405s, valid=True
2026-06-03T19:37:51.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:37:51.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T19:37:51.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:38:12, diff=-20.463095s, valid=True
2026-06-03T19:37:51.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:37:51.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:37:51.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:37:46, diff=5.545146s, valid=True
2026-06-03T19:37:51.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:37:51.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:37:51.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:37:51.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:37:51.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:37:51.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T19:37:51.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:38:12, diff=-20.451168s, valid=True
2026-06-03T19:37:51.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:37:51.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:37:51.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:37:51.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82468.549642s, valid=False
2026-06-03T19:37:51.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:37:51.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:37:51.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:37:51.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:37:51.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:37:51.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:37:51.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:37:51.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:37:51.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:37:51.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:37:51.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:37:51.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:37:51.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:37:51.871 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:37:52.068 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:37:52.398 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:37:52.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:37:52.500 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:37:52.500 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:37:52.733 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:37:52.733 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:38:22.737 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:38:22.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:38:22.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:38:23.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:38:23.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:38:23.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:38:23.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:38:23.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:38:23.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:38:23.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:38:23.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:38:23.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:38:23.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:38:26.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:38:26.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:38:26.275 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:38:26.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:38:26.286 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:38:26.299 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:38:26.299 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:38:26.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:38:26.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:38:26.300 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:38:26.301 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:38:26.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:38:26.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:38:26.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:38:26.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:38:26.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:38:26.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T19:38:26.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:38:26.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T19:38:26.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:38:26.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:38:26.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:38:26.641 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:38:26.713 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:38:17
2026-06-03T19:38:26.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86876, datetime.datetime(2026, 6, 3, 19, 38, 17), datetime.datetime(2026, 6, 3, 19, 38, 16), 'salt', 3.97, 100.04, None, 45.3, 117.77, -0.01, 821.57, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:38:26.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:38:26.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:38:26.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:38:16, diff=10.720999s, valid=True
2026-06-03T19:38:26.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:38:26.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T19:38:26.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:38:12, diff=14.724467s, valid=True
2026-06-03T19:38:26.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:38:26.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:38:26.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:38:17, diff=9.732617s, valid=True
2026-06-03T19:38:26.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:38:26.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:38:26.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:38:26.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:38:26.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:38:26.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T19:38:26.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:38:12, diff=14.736339s, valid=True
2026-06-03T19:38:26.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:38:26.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:38:26.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:38:26.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82503.737149s, valid=False
2026-06-03T19:38:26.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:38:26.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:38:26.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:38:26.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:38:26.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:38:26.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:38:26.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:38:26.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:38:26.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:38:26.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:38:26.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:38:26.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:38:27.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:38:27.058 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:38:27.254 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:38:27.649 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:38:27.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:38:27.750 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:38:27.750 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:38:28.004 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:38:28.004 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:38:58.014 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:38:58.015 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:38:58.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:38:58.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:38:58.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:38:58.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:38:58.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:38:58.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:38:58.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:38:58.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:38:58.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:38:58.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:38:58.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:39:01.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:39:01.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:39:01.555 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:39:01.556 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:39:01.566 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:39:01.578 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:39:01.579 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:39:01.579 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:39:01.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:39:01.580 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:39:01.580 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:39:01.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:39:01.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:39:01.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:39:01.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:39:01.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:39:01.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:39:01.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:39:01.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:39:01.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:39:01.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:39:01.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:39:01.922 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:39:01.992 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:38:47
2026-06-03T19:39:01.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86877, datetime.datetime(2026, 6, 3, 19, 38, 47), datetime.datetime(2026, 6, 3, 19, 38, 46), 'salt', 4.0, 100.04, None, 40.68, 116.83, -0.01, 821.63, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:39:01.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:39:01.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:39:01.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:38:46, diff=15.999404s, valid=True
2026-06-03T19:39:01.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:39:01.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:39:02.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:39:12, diff=-9.997442s, valid=True
2026-06-03T19:39:02.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:39:02.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:39:02.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:38:47, diff=15.00993s, valid=True
2026-06-03T19:39:02.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:39:02.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:39:02.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:39:02.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:39:02.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:39:02.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:39:02.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:39:12, diff=-9.986747s, valid=True
2026-06-03T19:39:02.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:39:02.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:39:02.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:39:02.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82539.013967s, valid=False
2026-06-03T19:39:02.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:39:02.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:39:02.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:39:02.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:39:02.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:39:02.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:39:02.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:39:02.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:39:02.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:39:02.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:39:02.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:39:02.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:39:02.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:39:02.332 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:39:02.530 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:39:02.859 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:39:02.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:39:02.956 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:39:02.957 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:39:03.154 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:39:03.154 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:39:33.184 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:39:33.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:39:33.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:39:33.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:39:33.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:39:33.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:39:33.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:39:33.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:39:33.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:39:33.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:39:33.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:39:33.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:39:33.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:39:36.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:39:36.718 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:39:36.719 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:39:36.719 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:39:36.729 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:39:36.742 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:39:36.743 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:39:36.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:39:36.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:39:36.744 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:39:36.744 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:39:36.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:39:36.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:39:36.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:39:36.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:39:36.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:39:37.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:39:37.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:39:37.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:39:37.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:39:37.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:39:37.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:39:37.091 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:39:37.165 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:39:17
2026-06-03T19:39:37.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86878, datetime.datetime(2026, 6, 3, 19, 39, 17), datetime.datetime(2026, 6, 3, 19, 39, 17), 'salt', 4.07, 100.34, None, 40.93, 116.03, -0.05, 821.75, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:39:37.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:39:37.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:39:37.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:39:17, diff=20.172956s, valid=True
2026-06-03T19:39:37.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:39:37.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:39:37.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:39:12, diff=25.176484s, valid=True
2026-06-03T19:39:37.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:39:37.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:39:37.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:39:17, diff=20.184746s, valid=True
2026-06-03T19:39:37.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:39:37.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:39:37.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:39:37.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:39:37.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:39:37.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:39:37.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:39:12, diff=25.188497s, valid=True
2026-06-03T19:39:37.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:39:37.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:39:37.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:39:37.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82574.189316s, valid=False
2026-06-03T19:39:37.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:39:37.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:39:37.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:39:37.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:39:37.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:39:37.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:39:37.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:39:37.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:39:37.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:39:37.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:39:37.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:39:37.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:39:37.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:39:37.510 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:39:37.784 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:39:38.136 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:39:38.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:39:38.239 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:39:38.239 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:39:38.445 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:39:38.445 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:40:08.458 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:40:08.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:40:08.458 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:40:08.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:40:08.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:40:09.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:40:09.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:40:09.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:40:09.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:40:09.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:40:09.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:40:09.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:40:09.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:40:12.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:40:12.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:40:12.278 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:40:12.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:40:12.289 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:40:12.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:40:12.303 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:40:12.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:40:12.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:40:12.304 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:40:12.304 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:40:12.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:40:12.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:40:12.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:40:12.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:40:12.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:40:12.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:40:12.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:40:12.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:40:12.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:40:12.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:40:12.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:40:12.631 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:40:12.701 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:39:48
2026-06-03T19:40:12.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86879, datetime.datetime(2026, 6, 3, 19, 39, 48), datetime.datetime(2026, 6, 3, 19, 39, 47), 'salt', 3.94, 100.3, None, 38.11, 107.2, -0.04, 821.75, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:40:12.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:40:12.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:40:12.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:39:47, diff=25.708986s, valid=True
2026-06-03T19:40:12.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:40:12.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:40:12.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:40:12, diff=0.712319s, valid=True
2026-06-03T19:40:12.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:40:12.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:40:12.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:39:47, diff=25.720242s, valid=True
2026-06-03T19:40:12.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:40:12.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:40:12.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:40:12.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:40:12.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:40:12.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:40:12.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:40:12, diff=0.723868s, valid=True
2026-06-03T19:40:12.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:40:12.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:40:12.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:40:12.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82609.724654s, valid=False
2026-06-03T19:40:12.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:40:12.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:40:12.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:40:12.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:40:12.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:40:12.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:40:12.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:40:12.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:40:12.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:40:12.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:40:12.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:40:12.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:40:13.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:40:13.045 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:40:13.242 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:40:13.576 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:40:13.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:40:13.677 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:40:13.677 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:40:13.943 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:40:13.943 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:40:43.973 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:40:43.973 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:40:43.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:40:44.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:40:44.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:40:44.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:40:44.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:40:44.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:40:44.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:40:44.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:40:44.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:40:44.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:40:44.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:40:47.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:40:47.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:40:47.714 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:40:47.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:40:47.725 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:40:47.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:40:47.738 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:40:47.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:40:47.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:40:47.739 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:40:47.739 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:40:47.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:40:47.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T19:40:47.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:40:47.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T19:40:47.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:40:48.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T19:40:48.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:40:48.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T19:40:48.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:40:48.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:40:48.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:40:48.081 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:40:48.154 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:40:18
2026-06-03T19:40:48.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86880, datetime.datetime(2026, 6, 3, 19, 40, 18), datetime.datetime(2026, 6, 3, 19, 40, 17), 'salt', 4.13, 100.4, None, 34.65, 117.53, -0.07, 821.94, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:40:48.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:40:48.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T19:40:48.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:40:17, diff=31.161875s, valid=True
2026-06-03T19:40:48.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:40:48.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T19:40:48.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:40:12, diff=36.165393s, valid=True
2026-06-03T19:40:48.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:40:48.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T19:40:48.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:40:17, diff=31.173691s, valid=True
2026-06-03T19:40:48.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:40:48.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:40:48.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:40:48.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:40:48.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:40:48.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T19:40:48.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:40:12, diff=36.177494s, valid=True
2026-06-03T19:40:48.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:40:48.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:40:48.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:40:48.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82645.178335s, valid=False
2026-06-03T19:40:48.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:40:48.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:40:48.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:40:48.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:40:48.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:40:48.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:40:48.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:40:48.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:40:48.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:40:48.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:40:48.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:40:48.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:40:48.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:40:48.571 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:40:48.770 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:40:49.104 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:40:49.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:40:49.205 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:40:49.205 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:40:49.396 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:40:49.396 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:41:19.425 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:41:19.425 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:41:19.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:41:19.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:41:19.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:41:20.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:41:20.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:41:20.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:41:20.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:41:20.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:41:20.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:41:20.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:41:20.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:41:23.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:41:23.462 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:41:23.463 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:41:23.463 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:41:23.473 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:41:23.485 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:41:23.486 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:41:23.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:41:23.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:41:23.487 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:41:23.487 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:41:23.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:41:23.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:41:23.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:41:23.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:41:23.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:41:23.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:41:23.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:41:23.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:41:23.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:41:23.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:41:23.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:41:23.837 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:41:23.922 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:41:18
2026-06-03T19:41:23.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86882, datetime.datetime(2026, 6, 3, 19, 41, 18), datetime.datetime(2026, 6, 3, 19, 41, 18), 'salt', 4.07, 100.44, None, 38.6, 126.86, -0.06, 821.75, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:41:23.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:41:23.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:41:23.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:41:18, diff=5.929875s, valid=True
2026-06-03T19:41:23.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:41:23.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:41:23.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:41:12, diff=11.933394s, valid=True
2026-06-03T19:41:23.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:41:23.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:41:23.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:41:18, diff=5.94144s, valid=True
2026-06-03T19:41:23.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:41:23.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:41:23.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:41:23.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:41:23.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:41:23.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:41:23.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:41:12, diff=11.945168s, valid=True
2026-06-03T19:41:23.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:41:23.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:41:23.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:41:23.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82680.945997s, valid=False
2026-06-03T19:41:23.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:41:23.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:41:23.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:41:23.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:41:23.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:41:24.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:41:24.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:41:24.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:41:24.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:41:24.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:41:24.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:41:24.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:41:24.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:41:24.266 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:41:24.465 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:41:24.798 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:41:24.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:41:24.900 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:41:24.900 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:41:25.060 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:41:25.060 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:41:55.072 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:41:55.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:41:55.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:41:55.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:41:55.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:41:55.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:41:55.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:41:55.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:41:55.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:41:55.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:41:55.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:41:55.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:41:55.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:41:58.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:41:58.383 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:41:58.384 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:41:58.384 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:41:58.394 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:41:58.407 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:41:58.408 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:41:58.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:41:58.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:41:58.409 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:41:58.409 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:41:58.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:41:58.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:41:58.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:41:58.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:41:58.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:41:58.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:41:58.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:41:58.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:41:58.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:41:58.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:41:58.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:41:58.750 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:41:58.821 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:41:49
2026-06-03T19:41:58.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86883, datetime.datetime(2026, 6, 3, 19, 41, 49), datetime.datetime(2026, 6, 3, 19, 41, 48), 'salt', 4.07, 100.44, None, 31.51, 109.5, -0.06, 821.81, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:41:58.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:41:58.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:41:58.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:41:48, diff=10.828978s, valid=True
2026-06-03T19:41:58.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:41:58.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:41:58.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:42:12, diff=-13.167518s, valid=True
2026-06-03T19:41:58.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:41:58.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:41:58.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:41:48, diff=10.840663s, valid=True
2026-06-03T19:41:58.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:41:58.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:41:58.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:41:58.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:41:58.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:41:58.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:41:58.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:42:12, diff=-13.155599s, valid=True
2026-06-03T19:41:58.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:41:58.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:41:58.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:41:58.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82715.845233s, valid=False
2026-06-03T19:41:58.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:41:58.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:41:58.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:41:58.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:41:58.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:41:58.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:41:58.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:41:58.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:41:58.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:41:58.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:41:59.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:41:59.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:41:59.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:41:59.237 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:41:59.436 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:41:59.772 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:41:59.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:41:59.879 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:41:59.879 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:42:00.143 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:42:00.143 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:42:30.172 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:42:30.172 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:42:30.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:42:30.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:42:30.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:42:30.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:42:30.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:42:30.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:42:30.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:42:30.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:42:30.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:42:30.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:42:30.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:42:33.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:42:33.634 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:42:33.635 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:42:33.636 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:42:33.646 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:42:33.659 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:42:33.660 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:42:33.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:42:33.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:42:33.661 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:42:33.661 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:42:33.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:42:33.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:42:33.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:42:33.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:42:33.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:42:33.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:42:33.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:42:33.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:42:33.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:42:33.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:42:33.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:42:33.997 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:42:34.066 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:42:19
2026-06-03T19:42:34.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86884, datetime.datetime(2026, 6, 3, 19, 42, 19), datetime.datetime(2026, 6, 3, 19, 42, 18), 'salt', 3.97, 100.27, None, 43.05, 120.8, -0.04, 821.81, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:42:34.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:42:34.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:42:34.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:42:18, diff=16.073971s, valid=True
2026-06-03T19:42:34.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:42:34.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:42:34.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:42:12, diff=22.077438s, valid=True
2026-06-03T19:42:34.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:42:34.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:42:34.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:42:15, diff=19.085505s, valid=True
2026-06-03T19:42:34.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:42:34.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:42:34.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:42:34.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:42:34.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:42:34.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:42:34.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:42:12, diff=22.089242s, valid=True
2026-06-03T19:42:34.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:42:34.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:42:34.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:42:34.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82751.090064s, valid=False
2026-06-03T19:42:34.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:42:34.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:42:34.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:42:34.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:42:34.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:42:34.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:42:34.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:42:34.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:42:34.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:42:34.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:42:34.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:42:34.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:42:34.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:42:34.413 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:42:34.613 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:42:34.947 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:42:35.050 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:42:35.050 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:42:35.050 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:42:35.202 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:42:35.202 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:43:05.232 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:43:05.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:43:05.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:43:05.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:43:05.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:43:05.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:43:05.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:43:05.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:43:05.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:43:05.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:43:05.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:43:05.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:43:05.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:43:08.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:43:08.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:43:08.741 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:43:08.741 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:43:08.751 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:43:08.764 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:43:08.765 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:43:08.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:43:08.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:43:08.766 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:43:08.766 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:43:08.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:43:08.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:43:08.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:43:09.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:43:09.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:43:09.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:43:09.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:43:09.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:43:09.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:43:09.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:43:09.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:43:09.115 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:43:09.189 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:42:49
2026-06-03T19:43:09.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86885, datetime.datetime(2026, 6, 3, 19, 42, 49), datetime.datetime(2026, 6, 3, 19, 42, 49), 'salt', 4.0, 100.37, None, 43.22, 115.16, -0.06, 821.69, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:43:09.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:43:09.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:43:09.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:42:49, diff=20.197175s, valid=True
2026-06-03T19:43:09.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:43:09.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:43:09.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:43:12, diff=-2.799301s, valid=True
2026-06-03T19:43:09.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:43:09.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:43:09.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:42:49, diff=20.208827s, valid=True
2026-06-03T19:43:09.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:43:09.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:43:09.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:43:09.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:43:09.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:43:09.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:43:09.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:43:12, diff=-2.787457s, valid=True
2026-06-03T19:43:09.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:43:09.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:43:09.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:43:09.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82786.213362s, valid=False
2026-06-03T19:43:09.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:43:09.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:43:09.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:43:09.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:43:09.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:43:09.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:43:09.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:43:09.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:43:09.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:43:09.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:43:09.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:43:09.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:43:09.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:43:09.599 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:43:09.800 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:43:10.154 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:43:10.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:43:10.256 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:43:10.256 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:43:10.525 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:43:10.525 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:43:40.555 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:43:40.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:43:40.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:43:40.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:43:40.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:43:41.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:43:41.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:43:41.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:43:41.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:43:41.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:43:41.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:43:41.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:43:41.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:43:44.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:43:44.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:43:44.106 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:43:44.106 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:43:44.113 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:43:44.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:43:44.125 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:43:44.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:43:44.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:43:44.125 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:43:44.126 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:43:44.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:43:44.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:43:44.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:43:44.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:43:44.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:43:44.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:43:44.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:43:44.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:43:44.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:43:44.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:43:44.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:43:44.403 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:43:44.475 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:43:20
2026-06-03T19:43:44.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86886, datetime.datetime(2026, 6, 3, 19, 43, 20), datetime.datetime(2026, 6, 3, 19, 43, 19), 'salt', 3.97, 100.37, None, 43.86, 110.96, -0.06, 821.63, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:43:44.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:43:44.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:43:44.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:43:19, diff=25.482879s, valid=True
2026-06-03T19:43:44.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:43:44.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:43:44.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:43:12, diff=32.486017s, valid=True
2026-06-03T19:43:44.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:43:44.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:43:44.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:43:18, diff=26.493351s, valid=True
2026-06-03T19:43:44.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:43:44.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:43:44.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:43:44.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:43:44.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:43:44.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:43:44.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:43:12, diff=32.496717s, valid=True
2026-06-03T19:43:44.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:43:44.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:43:44.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:43:44.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82821.497429s, valid=False
2026-06-03T19:43:44.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:43:44.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:43:44.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:43:44.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:43:44.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:43:44.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:43:44.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:43:44.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:43:44.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:43:44.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:43:44.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:43:44.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:43:44.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:43:44.818 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:43:45.014 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:43:45.345 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:43:45.445 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:43:45.445 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:43:45.446 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:43:45.720 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:43:45.720 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:44:15.724 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:44:15.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:44:15.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:44:16.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:44:16.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:44:16.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:44:16.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:44:16.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:44:16.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:44:16.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:44:16.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:44:16.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:44:16.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:44:19.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:44:19.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:44:19.306 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:44:19.307 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:44:19.318 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:44:19.330 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:44:19.331 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:44:19.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:44:19.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:44:19.332 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:44:19.332 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:44:19.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:44:19.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T19:44:19.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:44:19.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T19:44:19.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:44:19.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:44:19.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:44:19.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:44:19.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:44:19.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:44:19.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:44:19.687 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:44:19.762 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:43:50
2026-06-03T19:44:19.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86887, datetime.datetime(2026, 6, 3, 19, 43, 50), datetime.datetime(2026, 6, 3, 19, 43, 49), 'salt', 3.94, 100.34, None, 43.61, 122.3, -0.05, 821.69, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:44:19.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:44:19.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T19:44:19.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:43:49, diff=30.769698s, valid=True
2026-06-03T19:44:19.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:44:19.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:44:19.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:44:12, diff=7.773199s, valid=True
2026-06-03T19:44:19.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:44:19.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T19:44:19.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:43:50, diff=29.781354s, valid=True
2026-06-03T19:44:19.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:44:19.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:44:19.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:44:19.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:44:19.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:44:19.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:44:19.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:44:12, diff=7.78509s, valid=True
2026-06-03T19:44:19.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:44:19.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:44:19.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:44:19.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82856.785891s, valid=False
2026-06-03T19:44:19.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:44:19.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:44:19.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:44:19.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:44:19.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:44:19.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:44:19.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:44:19.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:44:19.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:44:19.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:44:20.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:44:20.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:44:20.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:44:20.160 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:44:20.358 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:44:20.689 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:44:20.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:44:20.789 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:44:20.789 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:44:22.910 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:44:22.911 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:44:52.937 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:44:52.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:44:52.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:44:53.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:44:53.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:44:53.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:44:53.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:44:53.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:44:53.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:44:53.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:44:53.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:44:53.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:44:53.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:44:56.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:44:56.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:44:56.656 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:44:56.656 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:44:56.666 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:44:56.679 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:44:56.680 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:44:56.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:44:56.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:44:56.681 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:44:56.681 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:44:56.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:44:56.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:44:56.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:44:56.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:44:56.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:44:56.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:44:56.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:44:57.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:44:57.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:44:57.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:44:57.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:44:57.006 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:44:57.078 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:44:50
2026-06-03T19:44:57.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86889, datetime.datetime(2026, 6, 3, 19, 44, 50), datetime.datetime(2026, 6, 3, 19, 44, 50), 'salt', 3.84, 100.37, None, 51.16, 125.56, -0.05, 821.57, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:44:57.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:44:57.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:44:57.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:44:50, diff=7.08584s, valid=True
2026-06-03T19:44:57.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:44:57.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:44:57.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:45:12, diff=-14.910754s, valid=True
2026-06-03T19:44:57.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:44:57.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:44:57.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:44:50, diff=7.097162s, valid=True
2026-06-03T19:44:57.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:44:57.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:44:57.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:44:57.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:44:57.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:44:57.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:44:57.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:45:12, diff=-14.899221s, valid=True
2026-06-03T19:44:57.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:44:57.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:44:57.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:44:57.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82894.101545s, valid=False
2026-06-03T19:44:57.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:44:57.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:44:57.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:44:57.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:44:57.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:44:57.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:44:57.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:44:57.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:44:57.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:44:57.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:44:57.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:44:57.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:44:57.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:44:57.424 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:44:57.620 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:44:57.952 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:44:58.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:44:58.112 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:44:58.113 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:44:58.267 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:44:58.268 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:45:28.269 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:45:28.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:45:28.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:45:28.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:45:28.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:45:28.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:45:28.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:45:28.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:45:28.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:45:28.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:45:28.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:45:28.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:45:28.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:45:31.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:45:31.709 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:45:31.710 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:45:31.710 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:45:31.719 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:45:31.731 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:45:31.731 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:45:31.731 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:45:31.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:45:31.732 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:45:31.732 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:45:31.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:45:31.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:45:31.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:45:31.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:45:31.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:45:31.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:45:31.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:45:32.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:45:32.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:45:32.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:45:32.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:45:32.023 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:45:32.096 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:45:21
2026-06-03T19:45:32.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86890, datetime.datetime(2026, 6, 3, 19, 45, 21), datetime.datetime(2026, 6, 3, 19, 45, 20), 'salt', 3.84, 100.37, None, 43.72, 110.47, -0.05, 821.76, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:45:32.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:45:32.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:45:32.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:45:20, diff=12.103687s, valid=True
2026-06-03T19:45:32.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:45:32.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:45:32.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:45:12, diff=20.106958s, valid=True
2026-06-03T19:45:32.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:45:32.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:45:32.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:45:20, diff=12.114633s, valid=True
2026-06-03T19:45:32.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:45:32.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:45:32.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:45:32.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:45:32.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:45:32.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:45:32.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:45:12, diff=20.118114s, valid=True
2026-06-03T19:45:32.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:45:32.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:45:32.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:45:32.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82929.118868s, valid=False
2026-06-03T19:45:32.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:45:32.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:45:32.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:45:32.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:45:32.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:45:32.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:45:32.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:45:32.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:45:32.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:45:32.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:45:32.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:45:32.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:45:32.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:45:32.437 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:45:32.635 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:45:32.969 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:45:33.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:45:33.069 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:45:33.069 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:45:33.267 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:45:33.267 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:46:03.294 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:46:03.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:46:03.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:46:03.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:46:03.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:46:03.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:46:03.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:46:03.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:46:03.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:46:03.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:46:03.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:46:03.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:46:03.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:46:06.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:46:06.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:46:06.483 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:46:06.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:46:06.494 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:46:06.506 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:46:06.506 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:46:06.507 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:46:06.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:46:06.508 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:46:06.508 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:46:06.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:46:06.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:46:06.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:46:06.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:46:06.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:46:06.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:46:06.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:46:06.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:46:06.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:46:06.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:46:06.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:46:06.849 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:46:06.920 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:45:51
2026-06-03T19:46:06.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86891, datetime.datetime(2026, 6, 3, 19, 45, 51), datetime.datetime(2026, 6, 3, 19, 45, 50), 'salt', 3.87, 100.34, None, 42.45, 117.75, -0.05, 821.82, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:46:06.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:46:06.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:46:06.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:45:50, diff=16.92768s, valid=True
2026-06-03T19:46:06.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:46:06.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:46:06.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:46:12, diff=-5.068931s, valid=True
2026-06-03T19:46:06.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:46:06.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:46:06.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:45:51, diff=15.939043s, valid=True
2026-06-03T19:46:06.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:46:06.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:46:06.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:46:06.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:46:06.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:46:06.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:46:06.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:46:12, diff=-5.057336s, valid=True
2026-06-03T19:46:06.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:46:06.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:46:06.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:46:06.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82963.943457s, valid=False
2026-06-03T19:46:06.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:46:06.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:46:06.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:46:06.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:46:06.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:46:07.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:46:07.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:46:07.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:46:07.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:46:07.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:46:07.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:46:07.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:46:07.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:46:07.268 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:46:07.542 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:46:07.876 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:46:07.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:46:07.976 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:46:07.976 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:46:08.176 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:46:08.176 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:46:38.179 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:46:38.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:46:38.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:46:38.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:46:38.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:46:38.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:46:38.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:46:38.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:46:38.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:46:38.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:46:38.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:46:38.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:46:38.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:46:41.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:46:41.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:46:41.517 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:46:41.517 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:46:41.528 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:46:41.540 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:46:41.541 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:46:41.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:46:41.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:46:41.542 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:46:41.542 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:46:41.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:46:41.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:46:41.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:46:41.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:46:41.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:46:41.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:46:41.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:46:41.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:46:41.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:46:41.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:46:41.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:46:41.891 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:46:41.970 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:46:21
2026-06-03T19:46:41.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86892, datetime.datetime(2026, 6, 3, 19, 46, 21), datetime.datetime(2026, 6, 3, 19, 46, 20), 'salt', 3.84, 100.31, None, 47.1, 125.26, -0.04, 821.7, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:46:41.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:46:41.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:46:41.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:46:20, diff=21.977592s, valid=True
2026-06-03T19:46:41.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:46:41.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:46:41.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:46:12, diff=29.98114s, valid=True
2026-06-03T19:46:41.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:46:41.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:46:41.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:46:21, diff=20.989388s, valid=True
2026-06-03T19:46:41.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:46:41.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:46:41.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:46:41.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:46:41.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:46:41.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:46:41.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:46:12, diff=29.993191s, valid=True
2026-06-03T19:46:41.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:46:41.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:46:41.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:46:41.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=82998.994026s, valid=False
2026-06-03T19:46:41.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:46:41.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:46:41.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:46:41.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:46:41.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:46:42.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:46:42.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:46:42.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:46:42.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:46:42.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:46:42.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:46:42.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:46:42.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:46:42.317 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:46:42.515 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:46:42.849 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:46:42.952 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:46:42.952 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:46:42.952 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:46:43.175 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:46:43.175 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:47:13.182 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:47:13.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:47:13.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:47:13.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:47:13.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:47:13.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:47:13.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:47:13.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:47:13.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:47:13.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:47:13.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:47:13.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:47:13.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:47:16.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:47:16.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:47:16.958 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:47:16.958 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:47:16.968 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:47:16.980 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:47:16.981 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:47:16.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:47:16.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:47:16.982 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:47:16.982 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:47:16.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:47:17.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:47:17.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:47:17.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:47:17.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:47:17.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:47:17.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:47:17.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:47:17.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:47:17.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:47:17.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:47:17.321 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:47:17.402 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:46:51
2026-06-03T19:47:17.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86893, datetime.datetime(2026, 6, 3, 19, 46, 51), datetime.datetime(2026, 6, 3, 19, 46, 51), 'salt', 3.87, 100.37, None, 52.29, 128.34, -0.06, 821.7, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:47:17.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:47:17.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:47:17.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:46:51, diff=26.409581s, valid=True
2026-06-03T19:47:17.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:47:17.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:47:17.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:47:12, diff=5.413042s, valid=True
2026-06-03T19:47:17.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:47:17.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:47:17.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:46:48, diff=29.421176s, valid=True
2026-06-03T19:47:17.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:47:17.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:47:17.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:47:17.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:47:17.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:47:17.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:47:17.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:47:12, diff=5.424905s, valid=True
2026-06-03T19:47:17.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:47:17.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:47:17.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:47:17.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83034.425721s, valid=False
2026-06-03T19:47:17.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:47:17.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:47:17.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:47:17.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:47:17.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:47:17.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:47:17.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:47:17.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:47:17.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:47:17.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:47:17.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:47:17.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:47:17.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:47:17.815 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:47:18.011 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:47:18.344 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:47:18.445 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:47:18.445 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:47:18.445 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:47:18.637 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:47:18.638 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:47:48.668 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:47:48.668 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:47:48.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:47:49.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:47:49.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:47:49.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:47:49.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:47:49.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:47:49.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:47:49.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:47:49.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:47:49.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:47:49.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:47:52.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:47:52.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:47:52.228 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:47:52.228 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:47:52.239 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:47:52.252 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:47:52.252 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:47:52.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:47:52.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:47:52.254 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:47:52.254 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:47:52.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:47:52.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:47:52.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:47:52.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:47:52.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:47:52.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:47:52.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:47:52.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:47:52.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:47:52.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:47:52.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:47:52.608 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:47:52.692 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:47:52
2026-06-03T19:47:52.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86895, datetime.datetime(2026, 6, 3, 19, 47, 52), datetime.datetime(2026, 6, 3, 19, 47, 51), 'salt', 3.74, 100.34, None, 49.22, 116.78, -0.05, 821.7, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:47:52.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:47:52.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:47:52.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:47:51, diff=1.699405s, valid=True
2026-06-03T19:47:52.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:47:52.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:47:52.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:48:12, diff=-19.297079s, valid=True
2026-06-03T19:47:52.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:47:52.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:47:52.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:47:52, diff=0.711095s, valid=True
2026-06-03T19:47:52.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:47:52.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:47:52.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:47:52.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:47:52.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:47:52.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:47:52.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:48:12, diff=-19.285175s, valid=True
2026-06-03T19:47:52.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:47:52.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:47:52.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:47:52.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83069.715663s, valid=False
2026-06-03T19:47:52.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:47:52.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:47:52.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:47:52.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:47:52.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:47:52.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:47:52.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:47:52.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:47:52.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:47:52.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:47:52.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:47:52.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:47:52.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:47:53.035 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:47:53.232 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:47:53.565 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:47:53.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:47:53.665 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:47:53.665 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:47:53.970 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:47:53.970 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:48:23.992 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:48:23.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:48:23.993 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:48:24.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:48:24.268 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:48:24.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:48:24.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:48:24.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:48:24.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:48:24.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:48:24.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:48:24.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:48:24.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:48:27.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:48:27.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:48:27.489 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:48:27.489 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:48:27.501 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:48:27.513 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:48:27.514 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:48:27.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:48:27.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:48:27.515 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:48:27.515 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:48:27.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:48:27.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:48:27.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:48:27.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:48:27.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:48:27.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:48:27.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:48:27.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:48:27.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:48:27.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:48:27.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:48:27.860 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:48:27.930 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:48:22
2026-06-03T19:48:27.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86896, datetime.datetime(2026, 6, 3, 19, 48, 22), datetime.datetime(2026, 6, 3, 19, 48, 21), 'salt', 3.87, 100.34, None, 51.41, 119.63, -0.05, 821.64, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:48:27.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:48:27.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:48:27.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:48:21, diff=6.938265s, valid=True
2026-06-03T19:48:27.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:48:27.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:48:27.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:48:12, diff=15.941745s, valid=True
2026-06-03T19:48:27.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:48:27.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:48:27.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:48:22, diff=5.949844s, valid=True
2026-06-03T19:48:27.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:48:27.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:48:27.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:48:27.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:48:27.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:48:27.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:48:27.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:48:12, diff=15.953526s, valid=True
2026-06-03T19:48:27.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:48:27.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:48:27.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:48:27.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83104.954336s, valid=False
2026-06-03T19:48:27.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:48:27.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:48:27.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:48:27.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:48:27.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:48:28.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:48:28.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:48:28.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:48:28.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:48:28.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:48:28.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:48:28.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:48:28.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:48:28.344 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:48:28.540 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:48:28.872 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:48:28.972 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:48:28.973 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:48:28.973 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:48:29.165 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:48:29.165 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:48:59.166 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:48:59.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:48:59.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:48:59.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:48:59.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:49:00.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:49:00.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:49:00.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:49:00.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:49:00.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:49:00.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:49:00.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:49:00.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:49:03.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:49:03.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:49:03.067 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:49:03.067 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:49:03.079 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:49:03.092 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:49:03.093 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:49:03.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:49:03.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:49:03.094 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:49:03.094 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:49:03.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:49:03.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:49:03.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:49:03.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:49:03.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:49:03.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:49:03.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:49:03.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:49:03.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:49:03.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:49:03.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:49:03.441 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:49:03.511 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:48:52
2026-06-03T19:49:03.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86897, datetime.datetime(2026, 6, 3, 19, 48, 52), datetime.datetime(2026, 6, 3, 19, 48, 52), 'salt', 3.74, 100.37, None, 49.61, 119.58, -0.05, 821.7, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:49:03.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:49:03.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:49:03.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:48:52, diff=11.51921s, valid=True
2026-06-03T19:49:03.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:49:03.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:49:03.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:49:12, diff=-8.477254s, valid=True
2026-06-03T19:49:03.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:49:03.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:49:03.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:48:52, diff=11.530938s, valid=True
2026-06-03T19:49:03.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:49:03.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:49:03.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:49:03.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:49:03.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:49:03.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:49:03.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:49:12, diff=-8.465336s, valid=True
2026-06-03T19:49:03.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:49:03.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:49:03.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:49:03.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83140.535466s, valid=False
2026-06-03T19:49:03.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:49:03.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:49:03.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:49:03.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:49:03.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:49:03.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:49:03.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:49:03.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:49:03.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:49:03.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:49:03.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:49:03.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:49:03.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:49:03.857 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:49:04.054 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:49:04.386 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:49:04.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:49:04.487 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:49:04.487 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:49:04.764 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:49:04.764 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:49:34.794 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:49:34.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:49:34.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:49:34.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:49:34.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:49:35.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:49:35.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:49:35.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:49:35.221 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:49:35.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:49:35.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:49:35.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:49:35.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:49:38.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:49:38.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:49:38.157 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:49:38.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:49:38.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:49:38.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:49:38.180 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:49:38.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:49:38.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:49:38.180 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:49:38.181 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:49:38.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:49:38.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:49:38.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:49:38.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:49:38.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:49:38.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:49:38.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:49:38.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:49:38.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:49:38.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:49:38.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:49:38.532 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:49:38.602 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:49:23
2026-06-03T19:49:38.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86898, datetime.datetime(2026, 6, 3, 19, 49, 23), datetime.datetime(2026, 6, 3, 19, 49, 22), 'salt', 3.74, 100.34, None, 46.96, 117.91, -0.05, 821.76, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:49:38.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:49:38.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:49:38.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:49:22, diff=16.609271s, valid=True
2026-06-03T19:49:38.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:49:38.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:49:38.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:49:12, diff=26.612517s, valid=True
2026-06-03T19:49:38.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:49:38.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:49:38.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:49:23, diff=15.620151s, valid=True
2026-06-03T19:49:38.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:49:38.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:49:38.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:49:38.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:49:38.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:49:38.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:49:38.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:49:12, diff=26.623605s, valid=True
2026-06-03T19:49:38.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:49:38.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:49:38.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:49:38.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83175.624367s, valid=False
2026-06-03T19:49:38.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:49:38.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:49:38.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:49:38.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:49:38.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:49:38.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:49:38.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:49:38.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:49:38.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:49:38.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:49:38.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:49:38.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:49:38.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:49:39.011 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:49:39.221 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:49:39.555 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:49:39.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:49:39.656 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:49:39.656 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:49:39.887 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:49:39.887 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:50:09.916 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:50:09.916 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:50:09.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:50:10.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:50:10.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:50:10.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:50:10.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:50:10.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:50:10.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:50:10.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:50:10.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:50:10.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:50:10.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:50:13.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:50:13.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:50:13.308 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:50:13.308 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:50:13.319 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:50:13.331 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:50:13.332 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:50:13.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:50:13.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:50:13.333 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:50:13.333 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:50:13.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:50:13.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:50:13.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:50:13.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:50:13.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:50:13.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:50:13.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:50:13.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:50:13.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:50:13.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:50:13.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:50:13.684 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:50:13.755 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:49:53
2026-06-03T19:50:13.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86899, datetime.datetime(2026, 6, 3, 19, 49, 53), datetime.datetime(2026, 6, 3, 19, 49, 52), 'salt', 3.77, 100.34, None, 41.78, 128.25, -0.05, 821.76, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:50:13.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:50:13.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:50:13.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:49:52, diff=21.762917s, valid=True
2026-06-03T19:50:13.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:50:13.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:50:13.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:50:12, diff=1.766178s, valid=True
2026-06-03T19:50:13.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:50:13.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:50:13.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:49:53, diff=20.77378s, valid=True
2026-06-03T19:50:13.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:50:13.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:50:13.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:50:13.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:50:13.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:50:13.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:50:13.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:50:12, diff=1.777086s, valid=True
2026-06-03T19:50:13.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:50:13.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:50:13.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:50:13.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83210.777766s, valid=False
2026-06-03T19:50:13.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:50:13.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:50:13.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:50:13.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:50:13.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:50:13.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:50:13.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:50:13.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:50:13.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:50:13.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:50:13.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:50:14.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:50:14.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:50:14.096 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:50:14.293 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:50:14.625 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:50:14.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:50:14.726 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:50:14.726 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:50:14.939 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:50:14.939 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:50:44.970 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:50:44.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:50:44.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:50:45.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:50:45.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:50:45.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:50:45.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:50:45.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:50:45.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:50:45.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:50:45.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:50:45.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:50:45.573 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:50:48.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:50:48.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:50:48.530 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:50:48.530 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:50:48.541 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:50:48.553 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:50:48.554 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:50:48.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:50:48.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:50:48.555 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:50:48.555 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:50:48.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:50:48.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:50:48.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:50:48.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:50:48.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:50:48.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:50:48.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:50:48.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:50:48.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:50:48.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:50:48.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:50:48.898 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:50:48.980 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:50:23
2026-06-03T19:50:48.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86900, datetime.datetime(2026, 6, 3, 19, 50, 23), datetime.datetime(2026, 6, 3, 19, 50, 22), 'salt', 3.8, 100.37, None, 43.61, 118.64, -0.06, 821.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:50:48.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:50:48.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:50:48.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:50:22, diff=26.98824s, valid=True
2026-06-03T19:50:48.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:50:48.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:50:48.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:50:12, diff=36.991745s, valid=True
2026-06-03T19:50:48.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:50:48.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:50:48.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:50:23, diff=25.999727s, valid=True
2026-06-03T19:50:48.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:50:48.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:50:49.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:50:49.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:50:49.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:50:49.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:50:49.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:50:12, diff=37.003449s, valid=True
2026-06-03T19:50:49.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:50:49.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:50:49.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:50:49.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83246.004273s, valid=False
2026-06-03T19:50:49.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:50:49.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:50:49.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:50:49.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:50:49.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:50:49.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:50:49.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:50:49.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:50:49.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:50:49.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:50:49.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:50:49.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:50:49.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:50:49.323 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:50:49.528 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:50:49.873 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:50:49.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:50:49.981 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:50:49.981 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:50:50.251 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:50:50.251 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:51:20.270 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:51:20.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:51:20.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:51:20.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:51:20.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:51:20.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:51:20.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:51:20.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:51:20.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:51:20.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:51:20.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:51:20.719 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:51:20.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:51:24.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:51:24.259 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:51:24.260 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:51:24.260 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:51:24.271 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:51:24.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:51:24.284 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:51:24.284 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:51:24.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:51:24.285 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:51:24.285 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:51:24.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:51:24.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:51:24.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:51:24.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:51:24.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:51:24.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:51:24.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:51:24.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:51:24.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:51:24.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:51:24.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:51:24.624 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:51:24.704 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:51:24
2026-06-03T19:51:24.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86902, datetime.datetime(2026, 6, 3, 19, 51, 24), datetime.datetime(2026, 6, 3, 19, 51, 23), 'salt', 3.67, 100.24, None, 47.6, 129.49, -0.04, 821.94, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:51:24.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:51:24.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:51:24.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:51:23, diff=1.711382s, valid=True
2026-06-03T19:51:24.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:51:24.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:51:24.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:51:12, diff=12.714878s, valid=True
2026-06-03T19:51:24.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:51:24.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:51:24.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:51:23, diff=1.72308s, valid=True
2026-06-03T19:51:24.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:51:24.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:51:24.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:51:24.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:51:24.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:51:24.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:51:24.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:51:12, diff=12.726833s, valid=True
2026-06-03T19:51:24.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:51:24.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:51:24.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:51:24.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83281.727653s, valid=False
2026-06-03T19:51:24.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:51:24.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:51:24.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:51:24.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:51:24.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:51:24.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:51:24.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:51:24.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:51:24.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:51:24.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:51:24.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:51:24.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:51:25.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:51:25.050 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:51:25.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:51:25.653 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:51:25.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:51:25.754 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:51:25.755 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:51:25.949 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:51:25.950 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:51:55.976 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:51:55.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:51:55.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:51:56.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:51:56.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:51:56.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:51:56.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:51:56.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:51:56.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:51:56.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:51:56.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:51:56.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:51:56.428 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:51:59.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:51:59.329 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:51:59.330 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:51:59.330 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:51:59.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:51:59.354 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:51:59.354 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:51:59.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:51:59.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:51:59.356 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:51:59.356 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:51:59.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:51:59.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:51:59.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:51:59.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:51:59.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:51:59.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:51:59.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:51:59.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:51:59.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:51:59.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:51:59.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:51:59.705 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:51:59.776 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:51:54
2026-06-03T19:51:59.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86903, datetime.datetime(2026, 6, 3, 19, 51, 54), datetime.datetime(2026, 6, 3, 19, 51, 53), 'salt', 3.74, 100.41, None, 50.31, 118.74, -0.06, 821.82, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:51:59.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:51:59.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:51:59.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:51:53, diff=6.784373s, valid=True
2026-06-03T19:51:59.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:51:59.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:51:59.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:52:12, diff=-12.211996s, valid=True
2026-06-03T19:51:59.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:51:59.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:51:59.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:51:54, diff=5.796189s, valid=True
2026-06-03T19:51:59.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:51:59.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:51:59.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:51:59.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:51:59.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:51:59.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:51:59.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:52:12, diff=-12.200048s, valid=True
2026-06-03T19:51:59.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:51:59.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:51:59.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:51:59.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83316.800777s, valid=False
2026-06-03T19:51:59.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:51:59.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:51:59.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:51:59.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:51:59.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:51:59.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:51:59.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:51:59.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:51:59.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:51:59.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:52:00.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:52:00.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:52:00.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:52:00.145 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:52:00.354 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:52:00.700 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:52:00.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:52:00.803 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:52:00.804 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:52:00.994 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:52:00.994 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:52:31.022 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:52:31.022 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:52:31.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:52:31.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:52:31.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:52:31.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:52:31.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:52:31.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:52:31.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:52:31.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:52:31.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:52:31.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:52:31.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:52:34.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:52:34.412 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:52:34.413 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:52:34.413 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:52:34.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:52:34.437 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:52:34.437 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:52:34.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:52:34.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:52:34.438 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:52:34.438 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:52:34.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:52:34.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:52:34.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:52:34.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:52:34.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:52:34.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:52:34.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:52:34.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:52:34.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:52:34.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:52:34.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:52:34.783 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:52:34.854 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:52:24
2026-06-03T19:52:34.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86904, datetime.datetime(2026, 6, 3, 19, 52, 24), datetime.datetime(2026, 6, 3, 19, 52, 23), 'salt', 3.71, 100.27, None, 45.69, 116.9, -0.04, 821.76, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:52:34.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:52:34.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:52:34.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:52:23, diff=11.8608s, valid=True
2026-06-03T19:52:34.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:52:34.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:52:34.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:52:12, diff=22.863692s, valid=True
2026-06-03T19:52:34.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:52:34.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:52:34.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:52:24, diff=10.87033s, valid=True
2026-06-03T19:52:34.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:52:34.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:52:34.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:52:34.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:52:34.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:52:34.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:52:34.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:52:12, diff=22.873405s, valid=True
2026-06-03T19:52:34.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:52:34.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:52:34.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:52:34.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83351.87407s, valid=False
2026-06-03T19:52:34.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:52:34.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:52:34.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:52:34.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:52:34.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:52:34.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:52:34.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:52:34.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:52:34.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:52:35.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:52:35.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:52:35.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:52:35.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:52:35.191 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:52:35.477 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:52:35.820 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:52:35.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:52:35.923 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:52:35.923 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:52:36.109 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:52:36.110 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:53:06.125 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:53:06.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:53:06.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:53:06.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:53:06.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:53:06.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:53:06.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:53:06.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:53:06.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:53:06.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:53:06.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:53:06.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:53:06.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:53:09.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:53:09.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:53:09.483 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:53:09.483 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:53:09.494 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:53:09.507 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:53:09.508 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:53:09.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:53:09.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:53:09.509 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:53:09.509 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:53:09.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:53:09.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:53:09.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:53:09.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:53:09.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:53:09.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:53:09.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:53:09.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:53:09.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:53:09.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:53:09.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:53:09.864 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:53:09.932 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:52:54
2026-06-03T19:53:09.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86905, datetime.datetime(2026, 6, 3, 19, 52, 54), datetime.datetime(2026, 6, 3, 19, 52, 54), 'salt', 3.67, 100.24, None, 43.01, 109.91, -0.04, 821.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:53:09.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:53:09.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:53:09.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:52:54, diff=15.938842s, valid=True
2026-06-03T19:53:09.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:53:09.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:53:09.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:53:12, diff=-2.058134s, valid=True
2026-06-03T19:53:09.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:53:09.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:53:09.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:52:54, diff=15.9489s, valid=True
2026-06-03T19:53:09.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:53:09.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:53:09.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:53:09.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:53:09.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:53:09.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:53:09.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:53:12, diff=-2.047952s, valid=True
2026-06-03T19:53:09.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:53:09.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:53:09.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:53:09.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83386.952734s, valid=False
2026-06-03T19:53:09.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:53:09.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:53:09.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:53:09.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:53:09.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:53:10.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:53:10.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:53:10.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:53:10.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:53:10.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:53:10.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:53:10.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:53:10.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:53:10.280 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:53:10.490 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:53:10.834 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:53:10.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:53:10.937 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:53:10.937 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:53:11.186 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:53:11.186 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:53:41.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:53:41.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:53:41.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:53:41.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:53:41.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:53:41.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:53:41.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:53:41.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:53:41.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:53:41.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:53:41.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:53:41.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:53:41.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:53:44.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:53:44.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:53:44.680 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:53:44.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:53:44.691 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:53:44.703 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:53:44.704 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:53:44.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:53:44.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:53:44.705 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:53:44.705 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:53:44.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:53:44.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:53:44.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:53:44.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:53:44.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:53:44.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:53:44.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:53:45.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:53:45.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:53:45.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:53:45.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:53:45.043 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:53:45.115 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:53:25
2026-06-03T19:53:45.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86906, datetime.datetime(2026, 6, 3, 19, 53, 25), datetime.datetime(2026, 6, 3, 19, 53, 23), 'salt', 3.74, 100.34, None, 45.87, 132.38, -0.05, 821.88, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:53:45.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:53:45.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:53:45.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:53:23, diff=22.122435s, valid=True
2026-06-03T19:53:45.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:53:45.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:53:45.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:53:12, diff=33.126506s, valid=True
2026-06-03T19:53:45.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:53:45.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:53:45.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:53:24, diff=21.134716s, valid=True
2026-06-03T19:53:45.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:53:45.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:53:45.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:53:45.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:53:45.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:53:45.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:53:45.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:53:12, diff=33.138432s, valid=True
2026-06-03T19:53:45.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:53:45.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:53:45.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:53:45.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83422.139463s, valid=False
2026-06-03T19:53:45.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:53:45.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:53:45.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:53:45.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:53:45.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:53:45.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:53:45.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:53:45.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:53:45.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:53:45.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:53:45.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:53:45.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:53:45.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:53:45.569 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:53:45.778 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:53:46.115 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:53:46.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:53:46.214 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:53:46.214 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:53:46.498 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:53:46.498 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:54:16.528 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:54:16.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:54:16.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:54:16.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:54:16.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:54:16.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:54:16.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:54:16.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:54:16.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:54:16.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:54:16.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:54:16.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:54:16.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:54:19.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:54:19.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:54:19.899 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:54:19.899 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:54:19.909 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:54:19.920 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:54:19.921 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:54:19.921 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:54:19.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:54:19.921 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:54:19.921 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:54:19.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:54:20.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:54:20.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:54:20.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:54:20.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:54:20.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:54:20.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:54:20.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:54:20.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:54:20.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:54:20.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:54:20.216 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:54:20.286 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:53:55
2026-06-03T19:54:20.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86907, datetime.datetime(2026, 6, 3, 19, 53, 55), datetime.datetime(2026, 6, 3, 19, 53, 54), 'salt', 3.71, 100.31, None, 47.24, 115.61, -0.04, 821.64, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:54:20.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:54:20.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:54:20.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:53:54, diff=26.293245s, valid=True
2026-06-03T19:54:20.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:54:20.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:54:20.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:54:12, diff=8.296346s, valid=True
2026-06-03T19:54:20.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:54:20.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:54:20.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:53:54, diff=26.303507s, valid=True
2026-06-03T19:54:20.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:54:20.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:54:20.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:54:20.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:54:20.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:54:20.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:54:20.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:54:12, diff=8.306746s, valid=True
2026-06-03T19:54:20.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:54:20.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:54:20.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:54:20.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83457.30744s, valid=False
2026-06-03T19:54:20.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:54:20.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:54:20.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:54:20.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:54:20.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:54:20.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:54:20.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:54:20.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:54:20.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:54:20.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:54:20.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:54:20.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:54:20.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:54:20.623 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:54:20.828 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:54:21.168 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:54:21.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:54:21.271 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:54:21.271 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:54:21.529 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:54:21.529 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:54:51.559 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:54:51.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:54:51.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:54:51.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:54:51.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:54:51.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:54:51.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:54:51.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:54:51.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:54:51.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:54:51.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:54:51.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:54:51.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:54:54.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:54:54.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:54:54.933 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:54:54.934 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:54:54.943 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:54:54.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:54:54.956 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:54:54.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:54:54.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:54:54.958 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:54:54.958 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:54:54.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:54:55.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T19:54:55.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:54:55.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T19:54:55.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:54:55.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T19:54:55.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:54:55.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T19:54:55.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:54:55.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:54:55.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:54:55.294 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:54:55.363 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:54:25
2026-06-03T19:54:55.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86908, datetime.datetime(2026, 6, 3, 19, 54, 25), datetime.datetime(2026, 6, 3, 19, 54, 25), 'salt', 3.67, 100.28, None, 43.22, 129.19, -0.05, 821.95, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:54:55.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:54:55.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T19:54:55.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:54:25, diff=30.370705s, valid=True
2026-06-03T19:54:55.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:54:55.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T19:54:55.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:54:12, diff=43.374097s, valid=True
2026-06-03T19:54:55.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:54:55.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T19:54:55.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:54:25, diff=30.381883s, valid=True
2026-06-03T19:54:55.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:54:55.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:54:55.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:54:55.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:54:55.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:54:55.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T19:54:55.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:54:12, diff=43.38545s, valid=True
2026-06-03T19:54:55.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:54:55.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:54:55.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:54:55.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83492.38624s, valid=False
2026-06-03T19:54:55.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:54:55.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:54:55.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:54:55.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:54:55.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:54:55.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:54:55.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:54:55.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:54:55.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:54:55.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:54:55.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:54:55.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:54:55.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:54:55.785 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:54:56.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:54:56.357 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:54:56.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:54:56.461 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:54:56.462 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:54:56.610 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:54:56.611 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:55:26.641 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:55:26.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:55:26.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:55:26.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:55:26.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:55:27.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:55:27.212 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:55:27.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:55:27.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:55:27.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:55:27.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:55:27.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:55:27.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:55:30.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:55:30.211 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:55:30.212 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:55:30.212 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:55:30.222 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:55:30.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:55:30.236 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:55:30.236 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:55:30.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:55:30.237 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:55:30.237 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:55:30.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:55:30.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:55:30.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:55:30.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:55:30.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:55:30.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:55:30.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:55:30.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:55:30.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:55:30.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:55:30.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:55:30.528 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:55:30.597 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:55:26
2026-06-03T19:55:30.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86910, datetime.datetime(2026, 6, 3, 19, 55, 26), datetime.datetime(2026, 6, 3, 19, 55, 25), 'salt', 3.64, 100.28, None, 50.1, 127.5, -0.04, 821.58, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:55:30.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:55:30.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:55:30.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:55:25, diff=5.604595s, valid=True
2026-06-03T19:55:30.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:55:30.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:55:30.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:55:12, diff=18.607869s, valid=True
2026-06-03T19:55:30.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:55:30.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:55:30.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:55:26, diff=4.615516s, valid=True
2026-06-03T19:55:30.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:55:30.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:55:30.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:55:30.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:55:30.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:55:30.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:55:30.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:55:12, diff=18.619014s, valid=True
2026-06-03T19:55:30.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:55:30.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:55:30.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:55:30.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83527.619773s, valid=False
2026-06-03T19:55:30.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:55:30.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:55:30.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:55:30.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:55:30.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:55:30.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:55:30.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:55:30.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:55:30.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:55:30.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:55:30.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:55:30.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:55:30.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:55:30.936 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:55:31.141 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:55:31.481 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:55:31.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:55:31.583 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:55:31.583 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:55:32.440 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:55:32.440 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:56:02.470 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:56:02.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:56:02.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:56:02.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:56:02.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:56:03.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:56:03.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:56:03.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:56:03.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:56:03.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:56:03.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:56:03.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:56:03.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:56:06.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:56:06.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:56:06.021 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:56:06.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:56:06.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:56:06.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:56:06.046 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:56:06.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:56:06.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:56:06.047 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:56:06.047 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:56:06.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:56:06.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:56:06.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:56:06.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:56:06.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:56:06.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:56:06.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:56:06.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:56:06.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:56:06.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:56:06.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:56:06.380 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:56:06.451 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:55:56
2026-06-03T19:56:06.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86911, datetime.datetime(2026, 6, 3, 19, 55, 56), datetime.datetime(2026, 6, 3, 19, 55, 55), 'salt', 3.51, 100.24, None, 58.57, 121.7, -0.03, 821.7, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:56:06.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:56:06.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:56:06.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:55:55, diff=11.458482s, valid=True
2026-06-03T19:56:06.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:56:06.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:56:06.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:56:12, diff=-5.538031s, valid=True
2026-06-03T19:56:06.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:56:06.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:56:06.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:55:56, diff=10.470065s, valid=True
2026-06-03T19:56:06.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:56:06.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:56:06.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:56:06.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:56:06.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:56:06.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:56:06.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:56:12, diff=-5.526204s, valid=True
2026-06-03T19:56:06.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:56:06.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:56:06.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:56:06.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83563.474617s, valid=False
2026-06-03T19:56:06.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:56:06.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:56:06.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:56:06.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:56:06.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:56:06.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:56:06.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:56:06.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:56:06.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:56:06.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:56:06.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:56:06.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:56:06.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:56:06.863 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:56:07.087 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:56:07.431 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:56:07.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:56:07.534 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:56:07.534 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:56:07.812 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:56:07.813 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:56:37.843 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:56:37.843 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:56:37.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:56:38.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:56:38.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:56:38.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:56:38.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:56:38.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:56:38.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:56:38.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:56:38.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:56:38.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:56:38.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:56:41.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:56:41.337 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:56:41.338 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:56:41.338 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:56:41.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:56:41.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:56:41.361 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:56:41.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:56:41.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:56:41.362 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:56:41.363 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:56:41.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:56:41.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:56:41.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:56:41.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:56:41.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:56:41.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:56:41.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:56:41.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:56:41.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:56:41.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:56:41.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:56:41.696 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:56:41.769 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:56:26
2026-06-03T19:56:41.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86912, datetime.datetime(2026, 6, 3, 19, 56, 26), datetime.datetime(2026, 6, 3, 19, 56, 26), 'salt', 3.41, 100.21, None, 50.28, 120.55, -0.03, 821.83, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:56:41.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:56:41.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:56:41.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:56:26, diff=15.776552s, valid=True
2026-06-03T19:56:41.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:56:41.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:56:41.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:56:12, diff=29.7798s, valid=True
2026-06-03T19:56:41.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:56:41.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:56:41.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:56:26, diff=15.78763s, valid=True
2026-06-03T19:56:41.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:56:41.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:56:41.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:56:41.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:56:41.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:56:41.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:56:41.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:56:12, diff=29.791289s, valid=True
2026-06-03T19:56:41.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:56:41.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:56:41.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:56:41.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83598.79208s, valid=False
2026-06-03T19:56:41.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:56:41.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:56:41.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:56:41.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:56:41.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:56:41.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:56:41.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:56:41.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:56:41.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:56:41.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:56:41.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:56:42.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:56:42.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:56:42.115 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:56:42.322 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:56:42.665 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:56:42.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:56:42.768 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:56:42.768 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:56:42.994 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:56:42.994 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:57:13.025 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:57:13.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:57:13.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:57:13.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:57:13.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:57:13.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:57:13.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:57:13.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:57:13.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:57:13.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:57:13.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:57:13.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:57:13.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:57:16.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:57:16.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:57:16.436 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:57:16.436 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:57:16.447 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:57:16.460 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:57:16.460 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:57:16.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:57:16.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:57:16.461 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:57:16.461 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:57:16.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:57:16.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:57:16.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:57:16.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:57:16.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:57:16.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:57:16.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:57:16.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:57:16.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:57:16.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:57:16.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:57:16.799 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:57:16.869 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:56:57
2026-06-03T19:57:16.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86913, datetime.datetime(2026, 6, 3, 19, 56, 57), datetime.datetime(2026, 6, 3, 19, 56, 56), 'salt', 3.47, 100.28, None, 38.78, 111.62, -0.05, 821.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:57:16.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:57:16.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:57:16.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:56:56, diff=20.875719s, valid=True
2026-06-03T19:57:16.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:57:16.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:57:16.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:57:12, diff=4.878679s, valid=True
2026-06-03T19:57:16.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:57:16.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:57:16.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:56:56, diff=20.885418s, valid=True
2026-06-03T19:57:16.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:57:16.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:57:16.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:57:16.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:57:16.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:57:16.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:57:16.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:57:12, diff=4.888447s, valid=True
2026-06-03T19:57:16.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:57:16.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:57:16.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:57:16.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83633.889108s, valid=False
2026-06-03T19:57:16.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:57:16.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:57:16.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:57:16.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:57:16.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:57:16.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:57:16.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:57:16.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:57:16.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:57:17.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:57:17.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:57:17.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:57:17.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:57:17.201 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:57:17.407 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:57:17.746 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:57:17.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:57:17.850 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:57:17.850 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:57:18.117 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:57:18.117 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:57:48.147 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:57:48.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:57:48.147 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:57:48.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:57:48.485 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:57:48.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:57:48.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:57:48.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:57:48.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:57:48.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:57:48.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:57:48.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:57:48.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:57:51.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:57:51.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:57:51.686 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:57:51.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:57:51.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:57:51.710 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:57:51.711 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:57:51.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:57:51.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:57:51.712 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:57:51.712 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:57:51.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:57:51.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:57:51.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:57:51.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:57:51.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:57:51.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:57:51.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:57:52.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:57:52.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:57:52.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:57:52.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:57:52.043 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:57:52.119 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:57:27
2026-06-03T19:57:52.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86914, datetime.datetime(2026, 6, 3, 19, 57, 27), datetime.datetime(2026, 6, 3, 19, 57, 26), 'salt', 3.47, 100.24, None, 46.43, 120.78, -0.04, 821.83, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:57:52.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:57:52.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:57:52.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:57:26, diff=26.126975s, valid=True
2026-06-03T19:57:52.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:57:52.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:57:52.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:57:12, diff=40.130452s, valid=True
2026-06-03T19:57:52.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:57:52.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:57:52.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:57:18, diff=34.138639s, valid=True
2026-06-03T19:57:52.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:57:52.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:57:52.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:57:52.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:57:52.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:57:52.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:57:52.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:57:12, diff=40.142373s, valid=True
2026-06-03T19:57:52.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:57:52.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:57:52.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:57:52.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83669.1432s, valid=False
2026-06-03T19:57:52.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:57:52.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:57:52.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:57:52.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:57:52.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:57:52.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:57:52.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:57:52.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:57:52.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:57:52.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:57:52.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:57:52.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:57:52.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:57:52.463 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:57:52.667 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:57:53.064 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:57:53.168 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:57:53.168 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:57:53.168 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:57:53.429 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:57:53.429 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:58:23.459 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:58:23.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:58:23.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:58:23.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:58:23.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:58:24.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:58:24.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:58:24.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:58:24.019 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:58:24.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:58:24.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:58:24.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:58:24.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:58:26.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:58:27.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:58:27.001 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:58:27.001 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:58:27.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:58:27.026 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:58:27.027 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:58:27.027 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:58:27.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:58:27.028 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:58:27.028 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:58:27.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:58:27.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T19:58:27.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:58:27.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T19:58:27.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:58:27.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:58:27.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:58:27.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:58:27.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:58:27.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:58:27.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:58:27.362 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:58:27.431 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:57:57
2026-06-03T19:58:27.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86915, datetime.datetime(2026, 6, 3, 19, 57, 57), datetime.datetime(2026, 6, 3, 19, 57, 56), 'salt', 3.44, 100.24, None, 35.14, 113.64, -0.04, 821.83, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:58:27.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:58:27.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T19:58:27.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:57:56, diff=31.438407s, valid=True
2026-06-03T19:58:27.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:58:27.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:58:27.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:58:12, diff=15.441944s, valid=True
2026-06-03T19:58:27.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:58:27.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T19:58:27.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:57:49, diff=38.450252s, valid=True
2026-06-03T19:58:27.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:58:27.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:58:27.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:58:27.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:58:27.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:58:27.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:58:27.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:58:12, diff=15.453966s, valid=True
2026-06-03T19:58:27.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:58:27.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:58:27.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:58:27.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83704.454769s, valid=False
2026-06-03T19:58:27.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:58:27.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:58:27.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:58:27.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:58:27.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:58:27.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:58:27.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:58:27.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:58:27.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:58:27.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:58:27.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:58:27.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:58:27.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:58:27.775 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:58:27.993 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:58:28.334 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:58:28.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:58:28.436 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:58:28.436 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:58:28.627 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:58:28.627 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:58:58.658 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:58:58.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:58:58.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:58:58.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:58:59.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:58:59.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:58:59.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:58:59.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:58:59.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:58:59.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:58:59.274 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:58:59.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:58:59.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:59:02.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:59:02.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:59:02.239 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:59:02.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:59:02.249 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:59:02.262 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:59:02.262 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:59:02.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:59:02.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:59:02.263 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:59:02.264 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:59:02.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:59:02.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:59:02.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:59:02.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:59:02.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:59:02.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:59:02.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:59:02.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:59:02.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:59:02.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:59:02.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:59:02.597 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:59:02.669 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:58:58
2026-06-03T19:59:02.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86917, datetime.datetime(2026, 6, 3, 19, 58, 58), datetime.datetime(2026, 6, 3, 19, 58, 57), 'salt', 3.37, 100.21, None, 53.77, 120.99, -0.04, 821.77, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T19:59:02.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:59:02.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:59:02.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:58:57, diff=5.677171s, valid=True
2026-06-03T19:59:02.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:59:02.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:59:02.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:59:12, diff=-9.319333s, valid=True
2026-06-03T19:59:02.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:59:02.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:59:02.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:58:52, diff=10.688839s, valid=True
2026-06-03T19:59:02.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:59:02.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:59:02.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:59:02.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:59:02.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:59:02.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:59:02.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:59:12, diff=-9.307468s, valid=True
2026-06-03T19:59:02.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:59:02.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:59:02.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:59:02.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83739.693371s, valid=False
2026-06-03T19:59:02.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:59:02.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:59:02.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:59:02.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:59:02.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:59:02.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:59:02.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:59:02.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:59:02.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:59:02.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:59:02.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:59:02.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:59:03.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:59:03.087 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:59:03.294 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:59:03.643 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:59:03.746 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:59:03.746 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:59:03.746 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:59:03.937 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:59:03.937 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T19:59:33.951 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T19:59:33.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T19:59:33.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T19:59:34.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T19:59:34.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T19:59:34.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T19:59:34.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T19:59:34.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T19:59:34.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T19:59:34.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T19:59:34.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T19:59:34.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T19:59:34.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T19:59:37.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T19:59:37.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T19:59:37.295 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T19:59:37.295 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T19:59:37.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T19:59:37.317 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T19:59:37.318 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T19:59:37.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T19:59:37.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T19:59:37.319 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T19:59:37.319 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T19:59:37.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T19:59:37.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T19:59:37.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T19:59:37.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T19:59:37.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:59:37.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:59:37.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T19:59:37.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T19:59:37.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T19:59:37.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T19:59:37.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T19:59:37.627 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T19:59:37.702 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:59:28
2026-06-03T19:59:37.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86918, datetime.datetime(2026, 6, 3, 19, 59, 28), datetime.datetime(2026, 6, 3, 19, 59, 27), 'salt', 3.34, 100.31, None, 42.34, 117.68, -0.05, 821.89, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T19:59:37.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T19:59:37.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T19:59:37.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:59:27, diff=10.708568s, valid=True
2026-06-03T19:59:37.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T19:59:37.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:59:37.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:59:12, diff=25.711452s, valid=True
2026-06-03T19:59:37.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T19:59:37.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T19:59:37.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:59:24, diff=13.718108s, valid=True
2026-06-03T19:59:37.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T19:59:37.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:59:37.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T19:59:37.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T19:59:37.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T19:59:37.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T19:59:37.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:59:12, diff=25.721133s, valid=True
2026-06-03T19:59:37.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T19:59:37.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T19:59:37.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T19:59:37.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83774.721787s, valid=False
2026-06-03T19:59:37.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T19:59:37.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T19:59:37.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T19:59:37.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T19:59:37.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T19:59:37.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T19:59:37.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T19:59:37.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T19:59:37.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T19:59:37.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T19:59:37.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T19:59:37.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T19:59:38.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T19:59:38.040 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T19:59:38.263 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:59:38.604 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T19:59:38.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T19:59:38.706 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T19:59:38.706 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T19:59:38.904 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T19:59:38.905 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:00:08.935 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:00:08.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:00:08.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:00:09.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:00:09.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:00:09.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:00:09.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:00:09.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:00:09.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:00:09.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:00:09.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:00:09.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:00:09.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:00:12.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:00:12.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:00:12.695 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:00:12.696 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:00:12.706 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:00:12.719 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:00:12.719 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:00:12.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:00:12.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:00:12.720 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:00:12.721 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:00:12.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:00:12.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:00:12.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:00:12.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:00:12.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:00:13.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:00:13.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:00:13.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:00:13.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:00:13.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:00:13.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:00:13.048 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:00:13.129 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 19:59:58
2026-06-03T20:00:13.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86919, datetime.datetime(2026, 6, 3, 19, 59, 58), datetime.datetime(2026, 6, 3, 19, 59, 57), 'salt', 3.41, 100.28, None, 50.31, 117.68, -0.04, 821.83, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:00:13.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:00:13.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:00:13.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:59:57, diff=16.137183s, valid=True
2026-06-03T20:00:13.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:00:13.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:00:13.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:00:12, diff=1.140723s, valid=True
2026-06-03T20:00:13.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:00:13.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:00:13.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 19:59:55, diff=18.148967s, valid=True
2026-06-03T20:00:13.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:00:13.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:00:13.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:00:13.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:00:13.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:00:13.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:00:13.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:00:12, diff=1.152738s, valid=True
2026-06-03T20:00:13.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:00:13.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:00:13.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:00:13.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83810.153546s, valid=False
2026-06-03T20:00:13.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:00:13.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:00:13.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:00:13.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:00:13.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:00:13.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:00:13.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:00:13.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:00:13.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:00:13.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:00:13.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:00:13.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:00:13.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:00:13.547 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:00:13.755 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:00:14.099 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:00:14.203 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:00:14.203 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:00:14.203 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:00:14.391 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:00:14.391 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:00:44.399 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:00:44.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:00:44.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:00:44.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:00:44.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:00:44.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:00:44.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:00:44.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:00:44.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:00:44.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:00:44.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:00:45.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:00:45.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:00:48.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:00:48.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:00:48.251 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:00:48.252 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:00:48.261 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:00:48.274 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:00:48.274 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:00:48.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:00:48.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:00:48.276 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:00:48.276 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:00:48.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:00:48.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:00:48.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:00:48.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:00:48.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:00:48.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:00:48.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:00:48.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:00:48.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:00:48.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:00:48.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:00:48.611 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:00:48.682 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:00:28
2026-06-03T20:00:48.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86920, datetime.datetime(2026, 6, 3, 20, 0, 28), datetime.datetime(2026, 6, 3, 20, 0, 28), 'salt', 3.37, 100.14, None, 45.73, 115.36, -0.03, 821.95, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:00:48.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:00:48.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:00:48.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:00:28, diff=20.690055s, valid=True
2026-06-03T20:00:48.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:00:48.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:00:48.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:00:12, diff=36.693562s, valid=True
2026-06-03T20:00:48.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:00:48.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:00:48.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:00:26, diff=22.701718s, valid=True
2026-06-03T20:00:48.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:00:48.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:00:48.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:00:48.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:00:48.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:00:48.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:00:48.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:00:12, diff=36.705627s, valid=True
2026-06-03T20:00:48.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:00:48.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:00:48.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:00:48.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83845.70646s, valid=False
2026-06-03T20:00:48.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:00:48.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:00:48.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:00:48.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:00:48.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:00:48.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:00:48.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:00:48.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:00:48.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:00:48.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:00:48.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:00:48.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:00:48.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:00:49.027 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:00:49.248 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:00:49.609 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:00:49.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:00:49.712 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:00:49.712 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:00:49.901 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:00:49.901 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:01:19.930 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:01:19.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:01:19.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:01:20.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:01:20.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:01:20.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:01:20.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:01:20.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:01:20.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:01:20.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:01:20.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:01:20.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:01:20.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:01:23.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:01:23.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:01:23.252 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:01:23.252 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:01:23.261 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:01:23.272 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:01:23.273 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:01:23.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:01:23.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:01:23.273 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:01:23.273 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:01:23.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:01:23.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:01:23.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:01:23.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:01:23.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:01:23.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:01:23.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:01:23.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:01:23.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:01:23.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:01:23.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:01:23.581 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:01:23.653 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:00:59
2026-06-03T20:01:23.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86921, datetime.datetime(2026, 6, 3, 20, 0, 59), datetime.datetime(2026, 6, 3, 20, 0, 58), 'salt', 3.34, 100.24, None, 39.87, 111.98, -0.04, 821.83, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:01:23.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:01:23.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:01:23.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:00:58, diff=25.660181s, valid=True
2026-06-03T20:01:23.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:01:23.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:01:23.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:01:12, diff=11.663553s, valid=True
2026-06-03T20:01:23.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:01:23.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:01:23.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:00:58, diff=25.671495s, valid=True
2026-06-03T20:01:23.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:01:23.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:01:23.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:01:23.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:01:23.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:01:23.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:01:23.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:01:12, diff=11.675114s, valid=True
2026-06-03T20:01:23.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:01:23.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:01:23.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:01:23.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83880.675907s, valid=False
2026-06-03T20:01:23.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:01:23.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:01:23.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:01:23.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:01:23.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:01:23.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:01:23.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:01:23.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:01:23.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:01:23.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:01:23.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:01:23.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:01:24.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:01:24.068 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:01:24.274 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:01:24.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:01:24.718 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:01:24.718 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:01:24.718 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:01:24.905 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:01:24.905 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:01:54.920 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:01:54.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:01:54.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:01:55.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:01:55.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:01:55.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:01:55.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:01:55.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:01:55.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:01:55.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:01:55.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:01:55.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:01:55.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:01:58.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:01:58.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:01:58.456 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:01:58.457 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:01:58.466 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:01:58.479 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:01:58.480 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:01:58.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:01:58.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:01:58.481 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:01:58.481 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:01:58.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:01:58.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T20:01:58.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:01:58.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T20:01:58.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:01:58.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T20:01:58.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:01:58.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T20:01:58.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:01:58.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:01:58.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:01:58.905 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:01:58.975 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:01:29
2026-06-03T20:01:58.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86922, datetime.datetime(2026, 6, 3, 20, 1, 29), datetime.datetime(2026, 6, 3, 20, 1, 28), 'salt', 3.34, 100.21, None, 50.31, 116.51, -0.03, 821.71, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:01:58.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:01:58.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T20:01:58.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:01:28, diff=30.983069s, valid=True
2026-06-03T20:01:58.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:01:58.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T20:01:58.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:01:12, diff=46.986692s, valid=True
2026-06-03T20:01:58.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:01:58.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T20:01:58.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:01:19, diff=39.995306s, valid=True
2026-06-03T20:01:58.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:01:58.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:01:58.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:01:58.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:01:58.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:01:58.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T20:01:58.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:01:12, diff=46.999255s, valid=True
2026-06-03T20:01:58.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:01:58.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:01:58.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:01:59.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83916.000077s, valid=False
2026-06-03T20:01:59.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:01:59.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:01:59.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:01:59.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:01:59.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:01:59.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:01:59.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:01:59.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:01:59.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:01:59.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:01:59.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:01:59.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:01:59.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:01:59.324 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:01:59.529 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:01:59.888 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:01:59.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:01:59.995 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:01:59.995 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:02:00.171 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:02:00.171 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:02:30.201 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:02:30.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:02:30.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:02:30.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:02:30.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:02:30.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:02:30.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:02:30.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:02:30.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:02:31.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:02:31.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:02:31.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:02:31.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:02:34.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:02:34.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:02:34.755 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:02:34.756 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:02:34.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:02:34.777 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:02:34.778 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:02:34.778 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:02:34.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:02:34.779 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:02:34.779 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:02:34.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:02:34.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:02:34.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:02:35.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:02:35.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:02:35.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:02:35.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:02:35.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:02:35.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:02:35.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:02:35.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:02:35.115 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:02:35.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:02:29
2026-06-03T20:02:35.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86924, datetime.datetime(2026, 6, 3, 20, 2, 29), datetime.datetime(2026, 6, 3, 20, 2, 29), 'salt', 3.28, 100.24, None, 53.63, 123.46, -0.03, 821.64, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:02:35.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:02:35.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:02:35.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:02:29, diff=6.194531s, valid=True
2026-06-03T20:02:35.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:02:35.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:02:35.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:02:12, diff=23.198049s, valid=True
2026-06-03T20:02:35.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:02:35.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:02:35.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:02:22, diff=13.206065s, valid=True
2026-06-03T20:02:35.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:02:35.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:02:35.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:02:35.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:02:35.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:02:35.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:02:35.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:02:12, diff=23.209797s, valid=True
2026-06-03T20:02:35.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:02:35.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:02:35.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:02:35.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83952.210601s, valid=False
2026-06-03T20:02:35.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:02:35.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:02:35.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:02:35.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:02:35.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:02:35.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:02:35.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:02:35.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:02:35.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:02:35.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:02:35.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:02:35.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:02:35.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:02:35.529 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:02:35.736 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:02:36.077 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:02:36.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:02:36.180 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:02:36.180 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:02:36.365 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:02:36.365 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:03:06.395 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:03:06.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:03:06.396 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:03:06.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:03:06.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:03:06.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:03:06.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:03:06.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:03:06.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:03:06.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:03:06.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:03:06.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:03:06.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:03:09.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:03:09.953 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:03:09.953 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:03:09.953 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:03:09.962 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:03:09.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:03:09.975 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:03:09.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:03:09.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:03:09.975 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:03:09.975 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:03:09.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:03:10.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:03:10.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:03:10.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:03:10.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:03:10.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:03:10.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:03:10.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:03:10.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:03:10.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:03:10.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:03:10.274 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:03:10.344 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:03:00
2026-06-03T20:03:10.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86925, datetime.datetime(2026, 6, 3, 20, 3), datetime.datetime(2026, 6, 3, 20, 2, 59), 'salt', 3.24, 100.28, None, 53.35, 117.94, -0.04, 821.89, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:03:10.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:03:10.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:03:10.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:02:59, diff=11.35159s, valid=True
2026-06-03T20:03:10.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:03:10.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:03:10.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:03:12, diff=-1.645171s, valid=True
2026-06-03T20:03:10.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:03:10.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:03:10.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:02:53, diff=17.362688s, valid=True
2026-06-03T20:03:10.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:03:10.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:03:10.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:03:10.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:03:10.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:03:10.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:03:10.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:03:12, diff=-1.633653s, valid=True
2026-06-03T20:03:10.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:03:10.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:03:10.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:03:10.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=83987.367207s, valid=False
2026-06-03T20:03:10.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:03:10.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:03:10.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:03:10.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:03:10.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:03:10.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:03:10.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:03:10.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:03:10.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:03:10.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:03:10.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:03:10.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:03:10.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:03:10.718 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:03:10.922 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:03:11.337 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:03:11.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:03:11.443 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:03:11.443 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:03:11.633 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:03:11.633 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:03:41.647 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:03:41.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:03:41.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:03:41.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:03:41.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:03:42.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:03:42.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:03:42.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:03:42.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:03:42.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:03:42.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:03:42.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:03:42.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:03:55.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:03:55.822 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:03:55.823 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:03:55.824 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:03:55.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:03:55.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:03:55.847 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:03:55.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:03:55.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:03:55.848 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:03:55.848 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:03:55.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:03:55.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:03:55.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:03:56.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:03:56.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:03:56.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:03:56.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:03:56.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:03:56.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:03:56.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:03:56.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:03:56.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:03:56.271 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:03:30
2026-06-03T20:03:56.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86926, datetime.datetime(2026, 6, 3, 20, 3, 30), datetime.datetime(2026, 6, 3, 20, 3, 29), 'salt', 3.24, 100.24, None, 43.01, 114.42, -0.04, 821.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:03:56.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:03:56.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:03:56.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:03:29, diff=27.278511s, valid=True
2026-06-03T20:03:56.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:03:56.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:03:56.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:03:12, diff=44.282036s, valid=True
2026-06-03T20:03:56.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:03:56.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:03:56.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:03:25, diff=31.290081s, valid=True
2026-06-03T20:03:56.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:03:56.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:03:56.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:03:56.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:03:56.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:03:56.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:03:56.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:03:12, diff=44.293778s, valid=True
2026-06-03T20:03:56.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:03:56.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:03:56.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:03:56.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84033.294578s, valid=False
2026-06-03T20:03:56.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:03:56.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:03:56.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:03:56.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:03:56.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:03:56.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:03:56.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:03:56.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:03:56.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:03:56.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:03:56.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:03:56.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:03:56.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:03:56.617 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:03:56.825 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:03:57.169 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:03:57.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:03:57.272 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:03:57.272 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:03:57.477 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:03:57.477 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:04:27.504 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:04:27.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:04:27.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:04:27.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:04:27.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:04:27.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:04:27.926 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:04:27.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:04:27.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:04:27.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:04:27.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:04:27.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:04:27.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:04:31.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:04:31.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:04:31.159 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:04:31.159 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:04:31.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:04:31.178 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:04:31.178 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:04:31.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:04:31.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:04:31.178 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:04:31.178 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:04:31.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:04:31.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:04:31.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:04:31.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:04:31.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:04:31.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:04:31.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:04:31.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:04:31.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:04:31.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:04:31.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:04:31.473 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:04:31.547 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:04:30
2026-06-03T20:04:31.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86928, datetime.datetime(2026, 6, 3, 20, 4, 30), datetime.datetime(2026, 6, 3, 20, 4, 30), 'salt', 3.21, 100.24, None, 45.8, 116.6, -0.04, 821.95, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:04:31.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:04:31.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:04:31.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:04:30, diff=1.55415s, valid=True
2026-06-03T20:04:31.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:04:31.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:04:31.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:04:12, diff=19.557416s, valid=True
2026-06-03T20:04:31.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:04:31.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:04:31.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:04:28, diff=3.56503s, valid=True
2026-06-03T20:04:31.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:04:31.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:04:31.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:04:31.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:04:31.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:04:31.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:04:31.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:04:12, diff=19.572283s, valid=True
2026-06-03T20:04:31.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:04:31.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:04:31.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:04:31.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84068.573283s, valid=False
2026-06-03T20:04:31.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:04:31.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:04:31.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:04:31.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:04:31.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:04:31.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:04:31.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:04:31.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:04:31.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:04:31.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:04:31.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:04:31.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:04:31.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:04:31.975 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:04:32.182 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:04:32.524 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:04:32.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:04:32.630 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:04:32.630 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:04:32.818 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:04:32.819 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:05:02.849 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:05:02.849 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:05:02.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:05:03.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:05:03.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:05:03.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:05:03.437 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:05:03.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:05:03.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:05:03.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:05:03.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:05:03.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:05:03.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:05:06.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:05:06.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:05:06.300 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:05:06.300 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:05:06.311 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:05:06.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:05:06.324 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:05:06.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:05:06.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:05:06.325 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:05:06.325 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:05:06.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:05:06.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:05:06.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:05:06.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:05:06.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:05:06.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:05:06.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:05:06.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:05:06.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:05:06.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:05:06.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:05:06.652 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:05:06.733 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:05:01
2026-06-03T20:05:06.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86929, datetime.datetime(2026, 6, 3, 20, 5, 1), datetime.datetime(2026, 6, 3, 20, 5), 'salt', 3.11, 100.18, None, 40.68, 118.43, -0.03, 821.77, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:05:06.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:05:06.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:05:06.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:05:00, diff=6.740302s, valid=True
2026-06-03T20:05:06.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:05:06.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:05:06.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:05:12, diff=-5.256425s, valid=True
2026-06-03T20:05:06.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:05:06.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:05:06.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:04:59, diff=7.751175s, valid=True
2026-06-03T20:05:06.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:05:06.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:05:06.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:05:06.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:05:06.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:05:06.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:05:06.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:05:12, diff=-5.245366s, valid=True
2026-06-03T20:05:06.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:05:06.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:05:06.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:05:06.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84103.755373s, valid=False
2026-06-03T20:05:06.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:05:06.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:05:06.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:05:06.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:05:06.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:05:06.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:05:06.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:05:06.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:05:06.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:05:06.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:05:06.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:05:06.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:05:07.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:05:07.080 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:05:07.288 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:05:07.633 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:05:07.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:05:07.735 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:05:07.735 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:05:07.971 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:05:07.971 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:05:37.971 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:05:37.972 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:05:37.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:05:38.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:05:38.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:05:38.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:05:38.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:05:38.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:05:38.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:05:38.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:05:38.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:05:38.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:05:38.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:05:41.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:05:41.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:05:41.667 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:05:41.667 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:05:41.677 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:05:41.689 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:05:41.690 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:05:41.690 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:05:41.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:05:41.691 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:05:41.691 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:05:41.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:05:41.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:05:41.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:05:41.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:05:41.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:05:42.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:05:42.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:05:42.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:05:42.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:05:42.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:05:42.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:05:42.053 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:05:42.138 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:05:31
2026-06-03T20:05:42.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86930, datetime.datetime(2026, 6, 3, 20, 5, 31), datetime.datetime(2026, 6, 3, 20, 5, 30), 'salt', 3.28, 100.31, None, 44.24, 110.68, -0.04, 821.83, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:05:42.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:05:42.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:05:42.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:05:30, diff=12.145809s, valid=True
2026-06-03T20:05:42.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:05:42.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:05:42.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:05:12, diff=30.149471s, valid=True
2026-06-03T20:05:42.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:05:42.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:05:42.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:05:21, diff=21.15802s, valid=True
2026-06-03T20:05:42.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:05:42.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:05:42.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:05:42.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:05:42.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:05:42.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:05:42.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:05:12, diff=30.161927s, valid=True
2026-06-03T20:05:42.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:05:42.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:05:42.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:05:42.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84139.162774s, valid=False
2026-06-03T20:05:42.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:05:42.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:05:42.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:05:42.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:05:42.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:05:42.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:05:42.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:05:42.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:05:42.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:05:42.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:05:42.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:05:42.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:05:42.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:05:42.552 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:05:42.757 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:05:43.096 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:05:43.198 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:05:43.198 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:05:43.198 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:05:43.387 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:05:43.387 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:06:13.406 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:06:13.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:06:13.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:06:13.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:06:13.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:06:13.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:06:13.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:06:13.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:06:13.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:06:14.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:06:14.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:06:14.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:06:14.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:06:17.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:06:17.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:06:17.732 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:06:17.733 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:06:17.742 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:06:17.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:06:17.755 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:06:17.756 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:06:17.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:06:17.757 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:06:17.757 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:06:17.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:06:17.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:06:17.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:06:17.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:06:17.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:06:18.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:06:18.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:06:18.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:06:18.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:06:18.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:06:18.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:06:18.094 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:06:18.166 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:06:01
2026-06-03T20:06:18.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86931, datetime.datetime(2026, 6, 3, 20, 6, 1), datetime.datetime(2026, 6, 3, 20, 6), 'salt', 3.21, 100.21, None, 38.35, 120.81, -0.03, 821.89, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:06:18.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:06:18.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:06:18.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:06:00, diff=18.174049s, valid=True
2026-06-03T20:06:18.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:06:18.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:06:18.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:06:12, diff=6.177557s, valid=True
2026-06-03T20:06:18.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:06:18.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:06:18.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:05:52, diff=26.185742s, valid=True
2026-06-03T20:06:18.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:06:18.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:06:18.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:06:18.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:06:18.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:06:18.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:06:18.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:06:12, diff=6.189532s, valid=True
2026-06-03T20:06:18.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:06:18.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:06:18.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:06:18.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84175.190354s, valid=False
2026-06-03T20:06:18.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:06:18.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:06:18.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:06:18.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:06:18.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:06:18.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:06:18.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:06:18.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:06:18.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:06:18.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:06:18.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:06:18.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:06:18.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:06:18.510 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:06:18.715 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:06:19.055 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:06:19.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:06:19.159 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:06:19.159 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:06:19.241 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:06:19.241 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:06:49.271 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:06:49.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:06:49.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:06:49.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:06:49.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:06:49.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:06:49.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:06:49.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:06:49.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:06:49.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:06:49.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:06:49.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:06:49.661 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:06:53.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:06:53.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:06:53.117 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:06:53.117 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:06:53.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:06:53.140 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:06:53.140 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:06:53.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:06:53.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:06:53.141 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:06:53.142 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:06:53.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:06:53.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:06:53.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:06:53.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:06:53.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:06:53.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:06:53.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:06:53.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:06:53.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:06:53.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:06:53.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:06:53.489 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:06:53.566 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:06:31
2026-06-03T20:06:53.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86932, datetime.datetime(2026, 6, 3, 20, 6, 31), datetime.datetime(2026, 6, 3, 20, 6, 31), 'salt', 3.14, 100.14, None, 44.92, 106.34, -0.03, 821.83, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:06:53.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:06:53.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:06:53.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:06:31, diff=22.572914s, valid=True
2026-06-03T20:06:53.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:06:53.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:06:53.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:06:12, diff=41.57578s, valid=True
2026-06-03T20:06:53.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:06:53.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:06:53.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:06:24, diff=29.582449s, valid=True
2026-06-03T20:06:53.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:06:53.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:06:53.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:06:53.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:06:53.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:06:53.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:06:53.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:06:12, diff=41.585522s, valid=True
2026-06-03T20:06:53.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:06:53.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:06:53.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:06:53.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84210.586189s, valid=False
2026-06-03T20:06:53.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:06:53.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:06:53.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:06:53.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:06:53.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:06:53.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:06:53.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:06:53.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:06:53.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:06:53.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:06:53.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:06:53.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:06:53.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:06:53.972 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:06:54.177 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:06:54.516 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:06:54.618 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:06:54.618 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:06:54.618 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:06:54.793 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:06:54.793 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:07:24.823 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:07:24.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:07:24.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:07:24.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:07:24.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:07:25.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:07:25.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:07:25.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:07:25.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:07:25.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:07:25.199 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:07:25.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:07:25.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:07:28.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:07:28.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:07:28.190 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:07:28.190 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:07:28.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:07:28.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:07:28.214 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:07:28.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:07:28.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:07:28.215 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:07:28.215 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:07:28.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:07:28.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:07:28.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:07:28.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:07:28.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:07:28.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T20:07:28.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:07:28.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T20:07:28.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:07:28.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:07:28.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:07:28.558 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:07:28.633 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:07:02
2026-06-03T20:07:28.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86933, datetime.datetime(2026, 6, 3, 20, 7, 2), datetime.datetime(2026, 6, 3, 20, 7, 1), 'salt', 3.11, 100.24, None, 42.45, 119.19, -0.04, 821.89, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:07:28.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:07:28.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:07:28.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:07:01, diff=27.640561s, valid=True
2026-06-03T20:07:28.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:07:28.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T20:07:28.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:06:12, diff=76.64416s, valid=True
2026-06-03T20:07:28.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:07:28.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:07:28.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:06:55, diff=33.652263s, valid=True
2026-06-03T20:07:28.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:07:28.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:07:28.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:07:28.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:07:28.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:07:28.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T20:07:28.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:06:12, diff=76.655995s, valid=True
2026-06-03T20:07:28.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:07:28.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:07:28.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:07:28.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84245.656807s, valid=False
2026-06-03T20:07:28.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:07:28.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:07:28.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:07:28.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:07:28.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:07:28.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:07:28.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:07:28.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:07:28.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:07:28.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:07:28.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:07:28.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:07:28.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:07:28.977 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:07:29.181 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:07:29.521 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:07:29.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:07:29.624 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:07:29.624 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:07:29.885 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:07:29.885 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:07:59.915 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:07:59.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:07:59.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:08:00.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:08:00.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:08:00.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:08:00.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:08:00.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:08:00.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:08:00.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:08:00.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:08:00.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:08:00.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:08:04.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:08:04.017 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:08:04.019 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:08:04.019 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:08:04.030 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:08:04.043 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:08:04.043 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:08:04.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:08:04.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:08:04.044 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:08:04.045 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:08:04.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:08:04.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:08:04.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:08:04.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:08:04.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:08:04.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:08:04.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:08:04.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:08:04.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:08:04.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:08:04.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:08:04.387 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:08:04.460 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:08:03
2026-06-03T20:08:04.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86935, datetime.datetime(2026, 6, 3, 20, 8, 3), datetime.datetime(2026, 6, 3, 20, 8, 2), 'salt', 3.04, 100.24, None, 54.51, 121.42, -0.04, 821.71, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:08:04.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:08:04.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:08:04.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:08:02, diff=2.467629s, valid=True
2026-06-03T20:08:04.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:08:04.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:08:04.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:06:12, diff=112.471151s, valid=True
2026-06-03T20:08:04.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:08:04.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:08:04.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:08:02, diff=2.479385s, valid=True
2026-06-03T20:08:04.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:08:04.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:08:04.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:08:04.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:08:04.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:08:04.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:08:04.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:06:12, diff=112.483143s, valid=True
2026-06-03T20:08:04.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:08:04.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:08:04.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:08:04.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84281.48396s, valid=False
2026-06-03T20:08:04.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:08:04.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:08:04.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:08:04.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:08:04.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:08:04.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:08:04.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:08:04.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:08:04.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:08:04.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:08:04.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:08:04.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:08:04.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:08:04.806 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:08:05.017 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:08:05.362 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:08:05.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:08:05.466 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:08:05.466 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:08:05.638 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:08:05.638 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:08:35.662 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:08:35.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:08:35.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:08:35.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:08:35.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:08:36.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:08:36.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:08:36.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:08:36.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:08:36.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:08:36.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:08:36.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:08:36.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:08:39.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:08:39.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:08:39.343 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:08:39.343 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:08:39.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:08:39.366 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:08:39.366 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:08:39.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:08:39.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:08:39.367 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:08:39.367 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:08:39.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:08:39.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:08:39.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:08:39.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:08:39.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:08:39.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:08:39.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:08:39.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:08:39.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:08:39.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:08:39.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:08:39.710 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:08:39.785 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:08:33
2026-06-03T20:08:39.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86936, datetime.datetime(2026, 6, 3, 20, 8, 33), datetime.datetime(2026, 6, 3, 20, 8, 32), 'salt', 3.08, 100.24, None, 51.79, 116.67, -0.03, 821.65, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:08:39.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:08:39.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:08:39.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:08:32, diff=7.792776s, valid=True
2026-06-03T20:08:39.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:08:39.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:08:39.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:06:12, diff=147.796268s, valid=True
2026-06-03T20:08:39.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:08:39.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:08:39.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:08:32, diff=7.804549s, valid=True
2026-06-03T20:08:39.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:08:39.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:08:39.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:08:39.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:08:39.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:08:39.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:08:39.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:06:12, diff=147.808252s, valid=True
2026-06-03T20:08:39.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:08:39.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:08:39.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:08:39.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84316.809058s, valid=False
2026-06-03T20:08:39.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:08:39.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:08:39.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:08:39.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:08:39.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:08:39.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:08:39.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:08:39.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:08:39.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:08:39.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:08:40.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:08:40.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:08:40.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:08:40.161 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:08:40.366 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:08:40.705 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:08:40.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:08:40.809 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:08:40.809 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:08:41.475 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:08:41.476 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:09:11.506 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:09:11.506 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:09:11.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:09:11.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:09:11.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:09:12.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:09:12.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:09:12.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:09:12.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:09:12.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:09:12.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:09:12.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:09:12.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:09:15.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:09:15.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:09:15.320 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:09:15.321 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:09:15.331 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:09:15.344 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:09:15.344 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:09:15.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:09:15.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:09:15.345 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:09:15.346 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:09:15.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:09:15.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:09:15.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:09:15.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:09:15.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:09:15.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:09:15.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:09:15.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:09:15.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:09:15.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:09:15.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:09:15.703 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:09:15.776 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:09:03
2026-06-03T20:09:15.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86937, datetime.datetime(2026, 6, 3, 20, 9, 3), datetime.datetime(2026, 6, 3, 20, 9, 2), 'salt', 3.04, 100.21, None, 49.75, 109.04, -0.04, 821.77, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:09:15.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:09:15.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:09:15.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:09:02, diff=13.783783s, valid=True
2026-06-03T20:09:15.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:09:15.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:09:15.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:06:12, diff=183.787348s, valid=True
2026-06-03T20:09:15.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:09:15.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:09:15.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:09:03, diff=12.795733s, valid=True
2026-06-03T20:09:15.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:09:15.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:09:15.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:09:15.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:09:15.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:09:15.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:09:15.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:06:12, diff=183.799534s, valid=True
2026-06-03T20:09:15.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:09:15.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:09:15.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:09:15.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84352.800369s, valid=False
2026-06-03T20:09:15.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:09:15.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:09:15.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:09:15.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:09:15.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:09:15.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:09:15.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:09:15.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:09:15.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:09:15.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:09:15.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:09:16.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:09:16.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:09:16.119 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:09:16.324 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:09:16.664 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:09:16.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:09:16.766 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:09:16.766 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:09:16.923 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:09:16.924 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:09:46.954 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:09:46.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:09:46.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:09:47.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:09:47.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:09:47.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:09:47.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:09:47.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:09:47.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:09:47.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:09:47.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:09:47.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:09:47.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:09:51.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:09:51.008 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:09:51.009 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:09:51.009 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:09:51.020 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:09:51.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:09:51.034 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:09:51.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:09:51.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:09:51.035 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:09:51.035 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:09:51.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:09:51.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:09:51.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:09:51.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:09:51.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:09:51.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:09:51.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:09:51.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:09:51.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:09:51.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:09:51.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:09:51.391 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:09:51.482 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:09:34
2026-06-03T20:09:51.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86938, datetime.datetime(2026, 6, 3, 20, 9, 34), datetime.datetime(2026, 6, 3, 20, 9, 33), 'salt', 2.98, 100.21, None, 48.3, 116.58, -0.03, 821.77, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:09:51.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:09:51.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:09:51.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:09:33, diff=18.490237s, valid=True
2026-06-03T20:09:51.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:09:51.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:09:51.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:10:12, diff=-20.506268s, valid=True
2026-06-03T20:09:51.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:09:51.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:09:51.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:09:33, diff=18.501979s, valid=True
2026-06-03T20:09:51.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:09:51.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:09:51.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:09:51.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:09:51.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:09:51.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:09:51.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:10:12, diff=-20.494264s, valid=True
2026-06-03T20:09:51.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:09:51.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:09:51.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:09:51.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84388.506538s, valid=False
2026-06-03T20:09:51.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:09:51.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:09:51.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:09:51.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:09:51.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:09:51.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:09:51.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:09:51.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:09:51.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:09:51.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:09:51.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:09:51.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:09:51.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:09:51.829 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:09:52.096 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:09:52.441 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:09:52.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:09:52.544 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:09:52.544 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:09:52.831 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:09:52.831 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:10:22.862 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:10:22.862 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:10:22.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:10:23.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:10:23.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:10:23.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:10:23.274 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:10:23.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:10:23.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:10:23.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:10:23.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:10:23.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:10:23.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:10:26.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:10:26.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:10:26.306 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:10:26.306 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:10:26.318 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:10:26.334 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:10:26.334 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:10:26.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:10:26.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:10:26.336 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:10:26.336 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:10:26.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:10:26.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:10:26.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:10:26.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:10:26.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:10:26.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:10:26.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:10:26.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:10:26.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:10:26.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:10:26.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:10:26.671 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:10:26.741 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:10:04
2026-06-03T20:10:26.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86939, datetime.datetime(2026, 6, 3, 20, 10, 4), datetime.datetime(2026, 6, 3, 20, 10, 3), 'salt', 2.94, 100.21, None, 44.67, 113.32, -0.04, 821.95, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:10:26.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:10:26.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:10:26.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:10:03, diff=23.748914s, valid=True
2026-06-03T20:10:26.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:10:26.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:10:26.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:10:12, diff=14.752296s, valid=True
2026-06-03T20:10:26.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:10:26.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:10:26.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:10:04, diff=22.76033s, valid=True
2026-06-03T20:10:26.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:10:26.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:10:26.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:10:26.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:10:26.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:10:26.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:10:26.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:10:12, diff=14.763958s, valid=True
2026-06-03T20:10:26.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:10:26.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:10:26.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:10:26.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84423.764753s, valid=False
2026-06-03T20:10:26.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:10:26.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:10:26.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:10:26.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:10:26.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:10:26.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:10:26.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:10:26.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:10:26.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:10:26.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:10:26.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:10:26.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:10:27.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:10:27.086 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:10:27.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:10:27.630 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:10:27.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:10:27.732 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:10:27.732 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:10:27.823 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:10:27.824 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:10:57.854 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:10:57.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:10:57.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:10:58.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:10:58.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:10:58.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:10:58.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:10:58.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:10:58.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:10:58.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:10:58.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:10:58.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:10:58.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:11:01.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:11:01.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:11:01.229 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:11:01.229 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:11:01.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:11:01.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:11:01.255 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:11:01.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:11:01.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:11:01.256 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:11:01.256 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:11:01.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:11:01.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:11:01.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:11:01.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:11:01.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:11:01.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:11:01.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:11:01.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:11:01.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:11:01.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:11:01.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:11:01.612 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:11:01.688 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:10:34
2026-06-03T20:11:01.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86940, datetime.datetime(2026, 6, 3, 20, 10, 34), datetime.datetime(2026, 6, 3, 20, 10, 33), 'salt', 2.91, 100.15, None, 45.27, 124.63, -0.02, 821.95, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:11:01.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:11:01.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:11:01.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:10:33, diff=28.694417s, valid=True
2026-06-03T20:11:01.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:11:01.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:11:01.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:11:12, diff=-10.302591s, valid=True
2026-06-03T20:11:01.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:11:01.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:11:01.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:10:33, diff=28.704372s, valid=True
2026-06-03T20:11:01.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:11:01.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:11:01.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:11:01.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:11:01.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:11:01.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:11:01.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:11:12, diff=-10.292474s, valid=True
2026-06-03T20:11:01.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:11:01.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:11:01.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:11:01.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84458.70821s, valid=False
2026-06-03T20:11:01.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:11:01.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:11:01.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:11:01.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:11:01.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:11:01.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:11:01.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:11:01.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:11:01.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:11:01.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:11:01.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:11:01.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:11:02.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:11:02.097 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:11:02.304 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:11:02.647 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:11:02.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:11:02.750 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:11:02.750 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:11:03.037 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:11:03.038 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:11:33.068 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:11:33.068 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:11:33.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:11:33.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:11:33.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:11:33.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:11:33.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:11:33.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:11:33.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:11:33.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:11:33.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:11:33.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:11:33.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:11:37.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:11:37.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:11:37.465 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:11:37.465 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:11:37.474 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:11:37.485 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:11:37.485 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:11:37.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:11:37.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:11:37.486 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:11:37.486 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:11:37.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:11:37.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:11:37.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:11:37.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:11:37.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:11:37.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:11:37.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:11:37.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:11:37.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:11:37.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:11:37.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:11:37.760 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:11:37.830 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:11:35
2026-06-03T20:11:37.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86942, datetime.datetime(2026, 6, 3, 20, 11, 35), datetime.datetime(2026, 6, 3, 20, 11, 34), 'salt', 3.01, 100.24, None, 43.4, 113.08, -0.04, 821.77, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:11:37.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:11:37.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:11:37.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:11:34, diff=3.836053s, valid=True
2026-06-03T20:11:37.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:11:37.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:11:37.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:12:12, diff=-34.161122s, valid=True
2026-06-03T20:11:37.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:11:37.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:11:37.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:11:34, diff=3.845542s, valid=True
2026-06-03T20:11:37.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:11:37.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:11:37.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:11:37.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:11:37.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:11:37.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:11:37.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:12:12, diff=-34.151446s, valid=True
2026-06-03T20:11:37.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:11:37.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:11:37.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:11:37.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84494.849223s, valid=False
2026-06-03T20:11:37.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:11:37.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:11:37.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:11:37.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:11:37.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:11:37.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:11:37.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:11:37.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:11:37.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:11:37.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:11:38.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:11:38.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:11:38.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:11:38.180 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:11:38.388 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:11:38.732 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:11:38.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:11:38.835 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:11:38.836 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:11:39.121 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:11:39.121 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:12:09.151 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:12:09.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:12:09.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:12:09.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:12:09.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:12:09.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:12:09.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:12:09.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:12:09.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:12:09.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:12:09.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:12:09.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:12:09.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:12:12.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:12:12.703 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:12:12.704 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:12:12.704 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:12:12.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:12:12.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:12:12.729 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:12:12.729 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:12:12.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:12:12.730 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:12:12.730 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:12:12.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:12:12.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:12:12.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:12:12.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:12:12.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:12:13.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:12:13.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:12:13.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:12:13.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:12:13.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:12:13.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:12:13.076 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:12:13.147 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:12:05
2026-06-03T20:12:13.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86943, datetime.datetime(2026, 6, 3, 20, 12, 5), datetime.datetime(2026, 6, 3, 20, 12, 4), 'salt', 3.04, 100.28, None, 48.48, 115.52, -0.05, 821.58, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:12:13.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:12:13.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:12:13.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:12:04, diff=9.153901s, valid=True
2026-06-03T20:12:13.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:12:13.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:12:13.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:12:12, diff=1.156771s, valid=True
2026-06-03T20:12:13.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:12:13.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:12:13.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:12:05, diff=8.163507s, valid=True
2026-06-03T20:12:13.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:12:13.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:12:13.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:12:13.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:12:13.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:12:13.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:12:13.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:12:12, diff=1.166591s, valid=True
2026-06-03T20:12:13.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:12:13.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:12:13.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:12:13.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84530.167281s, valid=False
2026-06-03T20:12:13.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:12:13.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:12:13.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:12:13.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:12:13.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:12:13.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:12:13.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:12:13.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:12:13.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:12:13.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:12:13.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:12:13.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:12:13.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:12:13.552 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:12:13.761 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:12:14.114 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:12:14.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:12:14.220 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:12:14.220 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:12:14.536 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:12:14.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:12:44.565 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:12:44.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:12:44.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:12:44.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:12:44.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:12:44.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:12:44.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:12:44.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:12:44.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:12:45.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:12:45.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:12:45.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:12:45.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:12:48.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:12:48.325 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:12:48.326 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:12:48.327 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:12:48.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:12:48.350 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:12:48.350 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:12:48.351 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:12:48.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:12:48.351 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:12:48.352 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:12:48.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:12:48.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:12:48.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:12:48.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:12:48.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:12:48.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:12:48.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:12:48.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:12:48.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:12:48.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:12:48.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:12:48.705 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:12:48.776 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:12:35
2026-06-03T20:12:48.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86944, datetime.datetime(2026, 6, 3, 20, 12, 35), datetime.datetime(2026, 6, 3, 20, 12, 34), 'salt', 2.88, 100.18, None, 40.51, 112.75, -0.03, 821.77, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:12:48.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:12:48.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:12:48.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:12:34, diff=14.784229s, valid=True
2026-06-03T20:12:48.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:12:48.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:12:48.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:13:12, diff=-23.212244s, valid=True
2026-06-03T20:12:48.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:12:48.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:12:48.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:12:35, diff=13.795851s, valid=True
2026-06-03T20:12:48.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:12:48.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:12:48.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:12:48.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:12:48.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:12:48.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:12:48.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:13:12, diff=-23.200451s, valid=True
2026-06-03T20:12:48.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:12:48.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:12:48.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:12:48.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84565.800358s, valid=False
2026-06-03T20:12:48.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:12:48.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:12:48.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:12:48.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:12:48.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:12:48.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:12:48.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:12:48.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:12:48.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:12:48.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:12:48.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:12:49.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:12:49.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:12:49.119 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:12:49.324 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:12:49.663 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:12:49.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:12:49.765 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:12:49.765 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:12:49.994 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:12:49.995 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:13:20.024 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:13:20.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:13:20.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:13:20.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:13:20.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:13:20.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:13:20.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:13:20.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:13:20.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:13:20.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:13:20.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:13:20.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:13:20.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:13:24.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:13:24.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:13:24.066 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:13:24.066 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:13:24.078 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:13:24.091 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:13:24.091 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:13:24.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:13:24.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:13:24.092 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:13:24.092 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:13:24.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:13:24.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:13:24.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:13:24.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:13:24.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:13:24.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:13:24.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:13:24.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:13:24.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:13:24.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:13:24.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:13:24.445 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:13:24.518 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:13:05
2026-06-03T20:13:24.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86945, datetime.datetime(2026, 6, 3, 20, 13, 5), datetime.datetime(2026, 6, 3, 20, 13, 5), 'salt', 2.94, 100.18, None, 39.2, 112.38, -0.03, 821.71, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:13:24.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:13:24.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:13:24.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:13:05, diff=19.525691s, valid=True
2026-06-03T20:13:24.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:13:24.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:13:24.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:13:12, diff=12.529157s, valid=True
2026-06-03T20:13:24.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:13:24.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:13:24.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:13:05, diff=19.537384s, valid=True
2026-06-03T20:13:24.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:13:24.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:13:24.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:13:24.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:13:24.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:13:24.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:13:24.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:13:12, diff=12.541129s, valid=True
2026-06-03T20:13:24.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:13:24.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:13:24.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:13:24.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84601.541942s, valid=False
2026-06-03T20:13:24.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:13:24.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:13:24.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:13:24.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:13:24.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:13:24.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:13:24.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:13:24.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:13:24.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:13:24.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:13:24.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:13:24.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:13:24.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:13:24.931 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:13:25.139 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:13:25.486 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:13:25.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:13:25.590 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:13:25.590 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:13:25.782 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:13:25.782 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:13:55.800 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:13:55.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:13:55.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:13:56.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:13:56.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:13:56.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:13:56.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:13:56.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:13:56.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:13:56.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:13:56.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:13:56.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:13:56.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:13:59.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:13:59.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:13:59.349 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:13:59.349 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:13:59.360 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:13:59.372 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:13:59.373 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:13:59.373 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:13:59.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:13:59.374 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:13:59.374 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:13:59.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:13:59.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:13:59.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:13:59.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:13:59.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:13:59.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:13:59.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:13:59.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:13:59.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:13:59.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:13:59.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:13:59.715 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:13:59.794 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:13:36
2026-06-03T20:13:59.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86946, datetime.datetime(2026, 6, 3, 20, 13, 36), datetime.datetime(2026, 6, 3, 20, 13, 35), 'salt', 3.01, 100.18, None, 44.32, 103.52, -0.03, 821.83, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:13:59.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:13:59.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:13:59.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:13:35, diff=24.801696s, valid=True
2026-06-03T20:13:59.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:13:59.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:13:59.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:14:12, diff=-12.194846s, valid=True
2026-06-03T20:13:59.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:13:59.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:13:59.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:13:35, diff=24.813208s, valid=True
2026-06-03T20:13:59.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:13:59.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:13:59.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:13:59.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:13:59.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:13:59.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:13:59.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:14:12, diff=-12.183184s, valid=True
2026-06-03T20:13:59.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:13:59.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:13:59.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:13:59.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84636.81761s, valid=False
2026-06-03T20:13:59.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:13:59.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:13:59.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:13:59.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:13:59.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:13:59.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:13:59.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:13:59.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:13:59.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:13:59.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:14:00.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:14:00.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:14:00.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:14:00.166 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:14:00.373 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:14:00.714 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:14:00.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:14:00.818 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:14:00.818 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:14:00.973 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:14:00.973 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:14:30.979 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:14:30.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:14:30.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:14:31.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:14:31.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:14:31.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:14:31.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:14:31.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:14:31.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:14:31.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:14:31.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:14:31.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:14:31.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:14:34.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:14:34.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:14:34.495 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:14:34.495 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:14:34.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:14:34.517 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:14:34.518 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:14:34.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:14:34.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:14:34.519 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:14:34.519 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:14:34.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:14:34.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T20:14:34.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:14:34.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T20:14:34.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:14:34.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:14:34.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:14:34.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:14:34.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:14:34.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:14:34.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:14:34.870 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:14:34.961 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:14:06
2026-06-03T20:14:34.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86947, datetime.datetime(2026, 6, 3, 20, 14, 6), datetime.datetime(2026, 6, 3, 20, 14, 5), 'salt', 2.94, 100.11, None, 42.55, 104.63, -0.02, 821.95, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:14:34.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:14:34.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T20:14:34.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:14:05, diff=29.968785s, valid=True
2026-06-03T20:14:34.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:14:34.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:14:34.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:14:12, diff=22.972253s, valid=True
2026-06-03T20:14:34.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:14:34.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T20:14:34.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:14:06, diff=28.980468s, valid=True
2026-06-03T20:14:34.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:14:34.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:14:34.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:14:34.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:14:34.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:14:34.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:14:34.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:14:12, diff=22.984168s, valid=True
2026-06-03T20:14:34.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:14:34.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:14:34.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:14:34.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84671.984978s, valid=False
2026-06-03T20:14:34.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:14:34.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:14:34.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:14:34.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:14:34.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:14:35.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:14:35.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:14:35.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:14:35.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:14:35.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:14:35.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:14:35.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:14:35.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:14:35.305 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:14:35.513 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:14:35.858 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:14:35.961 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:14:35.962 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:14:35.962 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:14:36.256 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:14:36.256 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:15:06.286 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:15:06.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:15:06.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:15:06.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:15:06.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:15:06.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:15:06.728 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:15:06.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:15:06.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:15:06.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:15:06.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:15:06.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:15:06.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:15:09.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:15:09.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:15:09.620 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:15:09.621 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:15:09.631 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:15:09.643 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:15:09.644 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:15:09.644 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:15:09.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:15:09.645 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:15:09.645 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:15:09.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:15:09.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:15:09.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:15:09.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:15:09.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:15:09.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:15:09.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:15:09.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:15:09.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:15:09.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:15:09.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:15:09.974 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:15:10.044 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:15:07
2026-06-03T20:15:10.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86949, datetime.datetime(2026, 6, 3, 20, 15, 7), datetime.datetime(2026, 6, 3, 20, 15, 6), 'salt', 2.94, 100.21, None, 42.34, 109.14, -0.04, 821.95, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:15:10.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:15:10.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:15:10.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:15:06, diff=4.051062s, valid=True
2026-06-03T20:15:10.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:15:10.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:15:10.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:15:12, diff=-1.945615s, valid=True
2026-06-03T20:15:10.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:15:10.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:15:10.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:15:06, diff=4.061873s, valid=True
2026-06-03T20:15:10.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:15:10.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:15:10.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:15:10.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:15:10.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:15:10.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:15:10.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:15:12, diff=-1.934516s, valid=True
2026-06-03T20:15:10.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:15:10.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:15:10.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:15:10.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84707.066268s, valid=False
2026-06-03T20:15:10.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:15:10.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:15:10.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:15:10.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:15:10.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:15:10.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:15:10.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:15:10.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:15:10.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:15:10.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:15:10.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:15:10.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:15:10.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:15:10.390 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:15:10.598 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:15:11.004 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:15:11.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:15:11.114 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:15:11.114 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:15:12.890 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:15:12.890 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:15:42.898 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:15:42.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:15:42.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:15:43.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:15:43.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:15:43.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:15:43.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:15:43.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:15:43.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:15:43.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:15:43.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:15:43.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:15:43.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:15:46.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:15:46.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:15:46.304 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:15:46.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:15:46.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:15:46.326 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:15:46.327 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:15:46.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:15:46.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:15:46.328 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:15:46.328 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:15:46.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:15:46.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:15:46.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:15:46.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:15:46.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:15:46.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:15:46.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:15:46.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:15:46.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:15:46.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:15:46.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:15:46.677 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:15:46.761 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:15:37
2026-06-03T20:15:46.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86950, datetime.datetime(2026, 6, 3, 20, 15, 37), datetime.datetime(2026, 6, 3, 20, 15, 36), 'salt', 2.78, 100.08, None, 46.61, 115.1, -0.01, 821.65, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:15:46.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:15:46.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:15:46.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:15:36, diff=10.768546s, valid=True
2026-06-03T20:15:46.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:15:46.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:15:46.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:16:12, diff=-25.227869s, valid=True
2026-06-03T20:15:46.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:15:46.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:15:46.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:15:37, diff=9.780565s, valid=True
2026-06-03T20:15:46.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:15:46.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:15:46.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:15:46.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:15:46.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:15:46.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:15:46.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:16:12, diff=-25.215665s, valid=True
2026-06-03T20:15:46.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:15:46.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:15:46.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:15:46.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84743.785178s, valid=False
2026-06-03T20:15:46.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:15:46.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:15:46.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:15:46.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:15:46.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:15:46.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:15:46.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:15:46.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:15:46.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:15:46.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:15:46.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:15:47.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:15:47.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:15:47.107 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:15:47.316 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:15:47.658 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:15:47.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:15:47.762 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:15:47.762 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:15:48.048 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:15:48.048 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:16:18.051 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:16:18.051 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:16:18.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:16:18.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:16:18.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:16:18.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:16:18.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:16:18.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:16:18.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:16:18.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:16:18.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:16:18.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:16:18.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:16:21.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:16:21.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:16:21.372 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:16:21.372 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:16:21.383 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:16:21.396 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:16:21.397 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:16:21.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:16:21.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:16:21.398 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:16:21.398 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:16:21.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:16:21.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:16:21.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:16:21.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:16:21.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:16:21.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:16:21.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:16:21.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:16:21.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:16:21.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:16:21.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:16:21.750 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:16:21.834 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:16:07
2026-06-03T20:16:21.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86951, datetime.datetime(2026, 6, 3, 20, 16, 7), datetime.datetime(2026, 6, 3, 20, 16, 6), 'salt', 2.88, 100.21, None, 48.16, 119.14, -0.03, 821.77, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:16:21.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:16:21.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:16:21.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:16:06, diff=15.841432s, valid=True
2026-06-03T20:16:21.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:16:21.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:16:21.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:16:12, diff=9.844804s, valid=True
2026-06-03T20:16:21.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:16:21.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:16:21.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:16:07, diff=14.852837s, valid=True
2026-06-03T20:16:21.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:16:21.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:16:21.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:16:21.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:16:21.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:16:21.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:16:21.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:16:12, diff=9.856451s, valid=True
2026-06-03T20:16:21.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:16:21.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:16:21.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:16:21.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84778.857263s, valid=False
2026-06-03T20:16:21.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:16:21.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:16:21.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:16:21.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:16:21.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:16:21.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:16:21.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:16:21.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:16:21.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:16:21.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:16:22.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:16:22.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:16:22.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:16:22.248 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:16:22.469 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:16:22.809 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:16:22.911 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:16:22.911 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:16:22.911 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:16:23.112 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:16:23.112 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:16:53.142 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:16:53.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:16:53.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:16:53.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:16:53.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:16:53.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:16:53.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:16:53.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:16:53.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:16:53.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:16:53.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:16:53.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:16:53.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:16:57.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:16:57.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:16:57.591 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:16:57.591 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:16:57.601 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:16:57.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:16:57.614 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:16:57.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:16:57.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:16:57.615 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:16:57.615 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:16:57.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:16:57.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:16:57.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:16:57.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:16:57.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:16:57.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:16:57.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:16:57.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:16:57.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:16:57.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:16:57.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:16:57.976 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:16:58.053 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:16:37
2026-06-03T20:16:58.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86952, datetime.datetime(2026, 6, 3, 20, 16, 37), datetime.datetime(2026, 6, 3, 20, 16, 37), 'salt', 2.85, 100.18, None, 48.27, 113.06, -0.02, 821.65, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:16:58.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:16:58.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:16:58.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:16:37, diff=21.061634s, valid=True
2026-06-03T20:16:58.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:16:58.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:16:58.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:17:12, diff=-13.934751s, valid=True
2026-06-03T20:16:58.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:16:58.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:16:58.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:16:37, diff=21.0736s, valid=True
2026-06-03T20:16:58.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:16:58.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:16:58.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:16:58.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:16:58.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:16:58.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:16:58.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:17:12, diff=-13.922642s, valid=True
2026-06-03T20:16:58.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:16:58.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:16:58.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:16:58.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84815.07818s, valid=False
2026-06-03T20:16:58.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:16:58.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:16:58.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:16:58.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:16:58.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:16:58.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:16:58.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:16:58.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:16:58.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:16:58.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:16:58.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:16:58.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:16:58.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:16:58.398 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:16:58.603 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:16:58.950 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:16:59.052 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:16:59.052 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:16:59.052 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:16:59.250 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:16:59.250 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:17:29.261 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:17:29.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:17:29.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:17:29.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:17:29.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:17:29.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:17:29.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:17:29.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:17:29.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:17:29.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:17:29.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:17:29.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:17:29.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:17:32.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:17:32.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:17:32.817 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:17:32.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:17:32.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:17:32.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:17:32.840 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:17:32.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:17:32.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:17:32.841 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:17:32.841 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:17:32.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:17:32.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:17:32.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:17:33.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:17:33.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:17:33.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:17:33.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:17:33.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:17:33.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:17:33.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:17:33.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:17:33.190 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:17:33.275 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:17:08
2026-06-03T20:17:33.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86953, datetime.datetime(2026, 6, 3, 20, 17, 8), datetime.datetime(2026, 6, 3, 20, 17, 7), 'salt', 2.85, 100.18, None, 42.76, 119.61, -0.02, 821.77, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:17:33.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:17:33.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:17:33.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:17:07, diff=26.283643s, valid=True
2026-06-03T20:17:33.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:17:33.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:17:33.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:17:12, diff=21.287137s, valid=True
2026-06-03T20:17:33.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:17:33.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:17:33.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:17:07, diff=26.29524s, valid=True
2026-06-03T20:17:33.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:17:33.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:17:33.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:17:33.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:17:33.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:17:33.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:17:33.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:17:12, diff=21.298958s, valid=True
2026-06-03T20:17:33.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:17:33.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:17:33.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:17:33.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84850.299766s, valid=False
2026-06-03T20:17:33.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:17:33.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:17:33.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:17:33.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:17:33.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:17:33.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:17:33.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:17:33.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:17:33.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:17:33.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:17:33.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:17:33.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:17:33.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:17:33.689 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:17:33.895 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:17:34.235 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:17:34.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:17:34.338 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:17:34.338 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:17:34.538 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:17:34.538 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:18:04.569 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:18:04.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:18:04.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:18:04.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:18:04.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:18:05.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:18:05.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:18:05.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:18:05.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:18:05.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:18:05.163 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:18:05.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:18:05.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:18:08.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:18:08.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:18:08.119 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:18:08.120 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:18:08.130 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:18:08.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:18:08.144 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:18:08.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:18:08.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:18:08.145 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:18:08.145 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:18:08.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:18:08.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:18:08.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:18:08.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:18:08.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:18:08.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:18:08.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:18:08.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:18:08.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:18:08.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:18:08.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:18:08.451 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:18:08.523 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:18:08
2026-06-03T20:18:08.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86955, datetime.datetime(2026, 6, 3, 20, 18, 8), datetime.datetime(2026, 6, 3, 20, 18, 7), 'salt', 2.81, 100.21, None, 44.42, 116.65, -0.03, 821.89, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:18:08.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:18:08.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:18:08.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:18:07, diff=1.530639s, valid=True
2026-06-03T20:18:08.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:18:08.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:18:08.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:18:12, diff=-3.466199s, valid=True
2026-06-03T20:18:08.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:18:08.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:18:08.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:18:04, diff=4.541278s, valid=True
2026-06-03T20:18:08.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:18:08.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:18:08.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:18:08.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:18:08.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:18:08.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:18:08.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:18:12, diff=-3.455477s, valid=True
2026-06-03T20:18:08.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:18:08.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:18:08.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:18:08.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84885.545219s, valid=False
2026-06-03T20:18:08.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:18:08.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:18:08.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:18:08.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:18:08.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:18:08.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:18:08.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:18:08.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:18:08.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:18:08.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:18:08.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:18:08.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:18:08.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:18:08.862 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:18:09.070 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:18:09.410 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:18:09.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:18:09.515 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:18:09.515 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:18:09.714 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:18:09.714 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:18:39.745 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:18:39.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:18:39.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:18:40.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:18:40.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:18:40.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:18:40.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:18:40.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:18:40.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:18:40.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:18:40.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:18:40.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:18:40.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:18:43.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:18:43.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:18:43.397 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:18:43.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:18:43.406 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:18:43.419 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:18:43.420 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:18:43.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:18:43.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:18:43.421 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:18:43.421 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:18:43.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:18:43.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:18:43.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:18:43.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:18:43.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:18:43.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:18:43.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:18:43.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:18:43.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:18:43.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:18:43.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:18:43.786 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:18:43.872 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:18:38
2026-06-03T20:18:43.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86956, datetime.datetime(2026, 6, 3, 20, 18, 38), datetime.datetime(2026, 6, 3, 20, 18, 38), 'salt', 2.81, 100.15, None, 47.03, 108.24, -0.02, 821.77, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:18:43.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:18:43.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:18:43.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:18:38, diff=5.880034s, valid=True
2026-06-03T20:18:43.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:18:43.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:18:43.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:19:12, diff=-28.116297s, valid=True
2026-06-03T20:18:43.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:18:43.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:18:43.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:18:36, diff=7.892438s, valid=True
2026-06-03T20:18:43.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:18:43.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:18:43.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:18:43.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:18:43.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:18:43.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:18:43.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:19:12, diff=-28.10366s, valid=True
2026-06-03T20:18:43.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:18:43.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:18:43.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:18:43.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84920.897228s, valid=False
2026-06-03T20:18:43.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:18:43.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:18:43.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:18:43.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:18:43.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:18:43.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:18:43.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:18:43.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:18:44.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:18:44.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:18:44.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:18:44.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:18:44.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:18:44.298 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:18:44.508 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:18:44.862 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:18:44.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:18:44.966 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:18:44.966 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:18:45.200 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:18:45.200 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:19:15.230 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:19:15.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:19:15.230 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:19:15.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:19:15.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:19:15.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:19:15.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:19:15.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:19:15.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:19:15.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:19:15.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:19:15.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:19:15.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:19:19.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:19:19.309 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:19:19.309 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:19:19.310 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:19:19.320 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:19:19.333 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:19:19.333 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:19:19.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:19:19.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:19:19.334 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:19:19.335 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:19:19.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:19:19.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:19:19.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:19:19.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:19:19.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:19:19.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:19:19.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:19:19.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:19:19.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:19:19.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:19:19.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:19:19.678 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:19:19.763 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:19:09
2026-06-03T20:19:19.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86957, datetime.datetime(2026, 6, 3, 20, 19, 9), datetime.datetime(2026, 6, 3, 20, 19, 8), 'salt', 2.81, 100.15, None, 45.27, 117.52, -0.03, 821.77, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:19:19.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:19:19.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:19:19.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:19:08, diff=11.771175s, valid=True
2026-06-03T20:19:19.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:19:19.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:19:19.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:19:12, diff=7.774653s, valid=True
2026-06-03T20:19:19.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:19:19.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:19:19.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:19:07, diff=12.782784s, valid=True
2026-06-03T20:19:19.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:19:19.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:19:19.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:19:19.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:19:19.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:19:19.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:19:19.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:19:12, diff=7.786497s, valid=True
2026-06-03T20:19:19.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:19:19.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:19:19.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:19:19.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84956.787308s, valid=False
2026-06-03T20:19:19.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:19:19.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:19:19.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:19:19.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:19:19.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:19:19.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:19:19.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:19:19.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:19:19.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:19:19.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:19:20.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:19:20.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:19:20.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:19:20.146 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:19:20.353 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:19:20.695 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:19:20.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:19:20.797 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:19:20.798 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:19:20.899 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:19:20.899 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:19:50.924 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:19:50.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:19:50.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:19:51.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:19:51.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:19:51.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:19:51.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:19:51.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:19:51.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:19:51.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:19:51.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:19:51.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:19:51.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:19:54.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:19:54.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:19:54.666 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:19:54.667 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:19:54.676 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:19:54.690 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:19:54.691 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:19:54.691 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:19:54.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:19:54.692 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:19:54.693 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:19:54.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:19:54.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:19:54.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:19:54.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:19:54.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:19:54.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:19:54.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:19:55.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:19:55.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:19:55.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:19:55.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:19:55.022 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:19:55.100 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:19:39
2026-06-03T20:19:55.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86958, datetime.datetime(2026, 6, 3, 20, 19, 39), datetime.datetime(2026, 6, 3, 20, 19, 38), 'salt', 3.14, 100.58, None, 40.01, 100.94, -0.09, 821.83, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:19:55.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:19:55.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:19:55.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:19:38, diff=17.107952s, valid=True
2026-06-03T20:19:55.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:19:55.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:19:55.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:20:12, diff=-16.888689s, valid=True
2026-06-03T20:19:55.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:19:55.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:19:55.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:19:29, diff=26.119224s, valid=True
2026-06-03T20:19:55.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:19:55.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:19:55.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:19:55.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:19:55.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:19:55.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:19:55.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:20:12, diff=-16.877197s, valid=True
2026-06-03T20:19:55.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:19:55.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:19:55.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:19:55.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=84992.123565s, valid=False
2026-06-03T20:19:55.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:19:55.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:19:55.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:19:55.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:19:55.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:19:55.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:19:55.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:19:55.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:19:55.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:19:55.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:19:55.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:19:55.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:19:55.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:19:55.445 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:19:55.653 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:19:55.996 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:19:56.098 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:19:56.098 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:19:56.098 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:19:56.294 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:19:56.294 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:20:26.324 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:20:26.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:20:26.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:20:26.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:20:26.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:20:26.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:20:26.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:20:26.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:20:26.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:20:27.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:20:27.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:20:27.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:20:27.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:20:29.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:20:29.962 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:20:29.963 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:20:29.963 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:20:29.972 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:20:29.984 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:20:29.984 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:20:29.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:20:29.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:20:29.985 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:20:29.985 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:20:29.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:20:30.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:20:30.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:20:30.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:20:30.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:20:30.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:20:30.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:20:30.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:20:30.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:20:30.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:20:30.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:20:30.294 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:20:30.380 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:20:09
2026-06-03T20:20:30.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86959, datetime.datetime(2026, 6, 3, 20, 20, 9), datetime.datetime(2026, 6, 3, 20, 20, 8), 'salt', 2.78, 100.11, None, 48.34, 111.25, -0.02, 821.71, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:20:30.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:20:30.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:20:30.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:20:08, diff=22.38732s, valid=True
2026-06-03T20:20:30.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:20:30.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:20:30.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:20:12, diff=18.390528s, valid=True
2026-06-03T20:20:30.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:20:30.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:20:30.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:20:00, diff=30.398206s, valid=True
2026-06-03T20:20:30.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:20:30.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:20:30.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:20:30.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:20:30.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:20:30.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:20:30.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:20:12, diff=18.401669s, valid=True
2026-06-03T20:20:30.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:20:30.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:20:30.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:20:30.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85027.402422s, valid=False
2026-06-03T20:20:30.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:20:30.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:20:30.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:20:30.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:20:30.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:20:30.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:20:30.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:20:30.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:20:30.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:20:30.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:20:30.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:20:30.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:20:30.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:20:30.719 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:20:30.923 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:20:31.320 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:20:31.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:20:31.424 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:20:31.424 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:20:31.580 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:20:31.580 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:21:01.601 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:21:01.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:21:01.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:21:01.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:21:01.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:21:02.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:21:02.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:21:02.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:21:02.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:21:02.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:21:02.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:21:02.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:21:02.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:21:04.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:21:04.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:21:04.822 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:21:04.822 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:21:04.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:21:04.847 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:21:04.847 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:21:04.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:21:04.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:21:04.848 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:21:04.849 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:21:04.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:21:05.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:21:05.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:21:05.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:21:05.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:21:05.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:21:05.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:21:05.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:21:05.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:21:05.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:21:05.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:21:05.210 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:21:05.286 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:20:39
2026-06-03T20:21:05.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86960, datetime.datetime(2026, 6, 3, 20, 20, 39), datetime.datetime(2026, 6, 3, 20, 20, 39), 'salt', 2.85, 100.21, None, 50.45, 119.68, -0.03, 821.77, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:21:05.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:21:05.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:21:05.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:20:39, diff=26.29393s, valid=True
2026-06-03T20:21:05.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:21:05.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:21:05.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:21:12, diff=-6.70273s, valid=True
2026-06-03T20:21:05.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:21:05.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:21:05.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:20:30, diff=35.305092s, valid=True
2026-06-03T20:21:05.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:21:05.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:21:05.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:21:05.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:21:05.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:21:05.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:21:05.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:21:12, diff=-6.691282s, valid=True
2026-06-03T20:21:05.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:21:05.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:21:05.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:21:05.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85062.309486s, valid=False
2026-06-03T20:21:05.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:21:05.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:21:05.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:21:05.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:21:05.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:21:05.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:21:05.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:21:05.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:21:05.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:21:05.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:21:05.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:21:05.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:21:05.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:21:05.636 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:21:05.842 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:21:06.183 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:21:06.284 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:21:06.284 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:21:06.284 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:21:08.684 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:21:08.684 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:21:38.714 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:21:38.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:21:38.715 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:21:39.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:21:39.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:21:39.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:21:39.427 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:21:39.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:21:39.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:21:39.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:21:39.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:21:39.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:21:39.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:21:42.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:21:42.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:21:42.566 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:21:42.566 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:21:42.576 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:21:42.589 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:21:42.589 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:21:42.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:21:42.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:21:42.591 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:21:42.591 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:21:42.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:21:42.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:21:42.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:21:42.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:21:42.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:21:42.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:21:42.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:21:42.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:21:42.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:21:42.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:21:42.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:21:42.953 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:21:43.036 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:21:40
2026-06-03T20:21:43.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86962, datetime.datetime(2026, 6, 3, 20, 21, 40), datetime.datetime(2026, 6, 3, 20, 21, 39), 'salt', 2.68, 100.18, None, 50.38, 116.77, -0.03, 821.65, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:21:43.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:21:43.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:21:43.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:21:39, diff=4.043599s, valid=True
2026-06-03T20:21:43.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:21:43.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:21:43.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:22:12, diff=-28.952924s, valid=True
2026-06-03T20:21:43.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:21:43.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:21:43.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:21:33, diff=10.055082s, valid=True
2026-06-03T20:21:43.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:21:43.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:21:43.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:21:43.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:21:43.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:21:43.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:21:43.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:22:12, diff=-28.941216s, valid=True
2026-06-03T20:21:43.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:21:43.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:21:43.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:21:43.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85100.059581s, valid=False
2026-06-03T20:21:43.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:21:43.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:21:43.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:21:43.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:21:43.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:21:43.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:21:43.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:21:43.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:21:43.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:21:43.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:21:43.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:21:43.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:21:43.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:21:43.452 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:21:43.657 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:21:43.996 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:21:44.098 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:21:44.098 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:21:44.098 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:21:44.192 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:21:44.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:22:14.222 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:22:14.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:22:14.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:22:14.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:22:14.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:22:14.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:22:14.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:22:14.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:22:14.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:22:14.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:22:14.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:22:14.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:22:14.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:22:17.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:22:17.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:22:17.572 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:22:17.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:22:17.584 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:22:17.597 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:22:17.597 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:22:17.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:22:17.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:22:17.598 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:22:17.599 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:22:17.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:22:17.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:22:17.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:22:17.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:22:17.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:22:17.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:22:17.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:22:17.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:22:17.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:22:17.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:22:17.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:22:17.942 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:22:18.014 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:22:10
2026-06-03T20:22:18.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86963, datetime.datetime(2026, 6, 3, 20, 22, 10), datetime.datetime(2026, 6, 3, 20, 22, 9), 'salt', 2.75, 100.15, None, 46.11, 113.41, -0.02, 822.01, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:22:18.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:22:18.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:22:18.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:22:09, diff=9.021605s, valid=True
2026-06-03T20:22:18.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:22:18.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:22:18.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:22:12, diff=6.025098s, valid=True
2026-06-03T20:22:18.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:22:18.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:22:18.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:22:04, diff=14.033234s, valid=True
2026-06-03T20:22:18.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:22:18.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:22:18.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:22:18.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:22:18.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:22:18.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:22:18.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:22:12, diff=6.037429s, valid=True
2026-06-03T20:22:18.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:22:18.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:22:18.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:22:18.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85135.038256s, valid=False
2026-06-03T20:22:18.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:22:18.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:22:18.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:22:18.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:22:18.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:22:18.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:22:18.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:22:18.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:22:18.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:22:18.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:22:18.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:22:18.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:22:18.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:22:18.368 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:22:18.581 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:22:18.928 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:22:19.032 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:22:19.032 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:22:19.032 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:22:19.220 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:22:19.221 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:22:49.251 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:22:49.251 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:22:49.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:22:49.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:22:49.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:22:50.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:22:50.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:22:50.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:22:50.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:22:50.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:22:50.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:22:50.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:22:50.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:22:53.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:22:53.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:22:53.031 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:22:53.032 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:22:53.042 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:22:53.055 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:22:53.055 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:22:53.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:22:53.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:22:53.056 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:22:53.056 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:22:53.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:22:53.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:22:53.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:22:53.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:22:53.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:22:53.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:22:53.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:22:53.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:22:53.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:22:53.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:22:53.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:22:53.413 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:22:53.486 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:22:40
2026-06-03T20:22:53.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86964, datetime.datetime(2026, 6, 3, 20, 22, 40), datetime.datetime(2026, 6, 3, 20, 22, 39), 'salt', 2.68, 100.11, None, 39.45, 110.45, -0.02, 821.83, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:22:53.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:22:53.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:22:53.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:22:39, diff=14.493381s, valid=True
2026-06-03T20:22:53.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:22:53.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:22:53.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:23:12, diff=-18.503111s, valid=True
2026-06-03T20:22:53.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:22:53.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:22:53.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:22:36, diff=17.505189s, valid=True
2026-06-03T20:22:53.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:22:53.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:22:53.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:22:53.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:22:53.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:22:53.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:22:53.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:23:12, diff=-18.491073s, valid=True
2026-06-03T20:22:53.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:22:53.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:22:53.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:22:53.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85170.509739s, valid=False
2026-06-03T20:22:53.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:22:53.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:22:53.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:22:53.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:22:53.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:22:53.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:22:53.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:22:53.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:22:53.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:22:53.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:22:53.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:22:53.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:22:53.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:22:53.898 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:22:54.106 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:22:54.448 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:22:54.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:22:54.550 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:22:54.550 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:22:54.643 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:22:54.643 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:23:24.673 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:23:24.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:23:24.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:23:24.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:23:25.012 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:23:25.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:23:25.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:23:25.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:23:25.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:23:25.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:23:25.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:23:25.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:23:25.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:23:28.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:23:28.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:23:28.216 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:23:28.216 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:23:28.227 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:23:28.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:23:28.241 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:23:28.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:23:28.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:23:28.242 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:23:28.242 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:23:28.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:23:28.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:23:28.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:23:28.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:23:28.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:23:28.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:23:28.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:23:28.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:23:28.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:23:28.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:23:28.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:23:28.574 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:23:28.652 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:23:11
2026-06-03T20:23:28.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86965, datetime.datetime(2026, 6, 3, 20, 23, 11), datetime.datetime(2026, 6, 3, 20, 23, 10), 'salt', 2.84, 100.21, None, 43.72, 122.03, -0.04, 821.71, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:23:28.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:23:28.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:23:28.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:23:10, diff=18.659087s, valid=True
2026-06-03T20:23:28.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:23:28.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:23:28.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:23:12, diff=16.662428s, valid=True
2026-06-03T20:23:28.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:23:28.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:23:28.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:23:07, diff=21.670379s, valid=True
2026-06-03T20:23:28.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:23:28.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:23:28.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:23:28.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:23:28.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:23:28.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:23:28.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:23:12, diff=16.673958s, valid=True
2026-06-03T20:23:28.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:23:28.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:23:28.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:23:28.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85205.674756s, valid=False
2026-06-03T20:23:28.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:23:28.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:23:28.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:23:28.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:23:28.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:23:28.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:23:28.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:23:28.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:23:28.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:23:28.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:23:28.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:23:28.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:23:28.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:23:28.996 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:23:29.200 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:23:29.537 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:23:29.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:23:29.636 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:23:29.636 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:23:29.729 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:23:29.729 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:23:59.759 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:23:59.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:23:59.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:24:00.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:24:00.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:24:00.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:24:00.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:24:00.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:24:00.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:24:00.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:24:00.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:24:00.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:24:00.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:24:03.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:24:03.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:24:03.012 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:24:03.013 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:24:03.023 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:24:03.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:24:03.036 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:24:03.036 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:24:03.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:24:03.037 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:24:03.037 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:24:03.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:24:03.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:24:03.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:24:03.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:24:03.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:24:03.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:24:03.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:24:03.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:24:03.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:24:03.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:24:03.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:24:03.376 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:24:03.457 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:23:41
2026-06-03T20:24:03.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86966, datetime.datetime(2026, 6, 3, 20, 23, 41), datetime.datetime(2026, 6, 3, 20, 23, 40), 'salt', 2.71, 100.05, None, 39.66, 119.42, -0.01, 821.83, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:24:03.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:24:03.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:24:03.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:23:40, diff=23.46477s, valid=True
2026-06-03T20:24:03.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:24:03.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:24:03.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:24:12, diff=-8.531745s, valid=True
2026-06-03T20:24:03.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:24:03.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:24:03.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:23:39, diff=24.476336s, valid=True
2026-06-03T20:24:03.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:24:03.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:24:03.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:24:03.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:24:03.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:24:03.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:24:03.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:24:12, diff=-8.519929s, valid=True
2026-06-03T20:24:03.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:24:03.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:24:03.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:24:03.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85240.480885s, valid=False
2026-06-03T20:24:03.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:24:03.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:24:03.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:24:03.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:24:03.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:24:03.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:24:03.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:24:03.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:24:03.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:24:03.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:24:03.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:24:03.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:24:03.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:24:03.866 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:24:04.089 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:24:04.439 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:24:04.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:24:04.543 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:24:04.543 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:24:04.699 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:24:04.699 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:24:34.729 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:24:34.729 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:24:34.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:24:35.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:24:35.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:24:35.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:24:35.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:24:35.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:24:35.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:24:35.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:24:35.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:24:35.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:24:35.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:24:38.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:24:38.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:24:38.428 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:24:38.429 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:24:38.439 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:24:38.452 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:24:38.453 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:24:38.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:24:38.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:24:38.454 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:24:38.454 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:24:38.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:24:38.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:24:38.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:24:38.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:24:38.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:24:38.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:24:38.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:24:38.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:24:38.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:24:38.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:24:38.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:24:38.785 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:24:38.860 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:24:11
2026-06-03T20:24:38.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86967, datetime.datetime(2026, 6, 3, 20, 24, 11), datetime.datetime(2026, 6, 3, 20, 24, 10), 'salt', 2.75, 100.11, None, 43.61, 106.04, -0.01, 821.83, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:24:38.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:24:38.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:24:38.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:24:10, diff=28.868297s, valid=True
2026-06-03T20:24:38.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:24:38.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:24:38.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:24:12, diff=26.87176s, valid=True
2026-06-03T20:24:38.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:24:38.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:24:38.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:24:10, diff=28.879916s, valid=True
2026-06-03T20:24:38.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:24:38.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:24:38.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:24:38.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:24:38.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:24:38.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:24:38.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:24:12, diff=26.883657s, valid=True
2026-06-03T20:24:38.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:24:38.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:24:38.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:24:38.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85275.884461s, valid=False
2026-06-03T20:24:38.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:24:38.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:24:38.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:24:38.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:24:38.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:24:38.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:24:38.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:24:38.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:24:38.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:24:39.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:24:39.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:24:39.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:24:39.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:24:39.203 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:24:39.407 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:24:39.748 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:24:39.852 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:24:39.852 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:24:39.853 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:24:40.082 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:24:40.082 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:25:10.112 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:25:10.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:25:10.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:25:10.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:25:10.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:25:10.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:25:10.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:25:10.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:25:10.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:25:10.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:25:10.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:25:10.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:25:10.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:25:13.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:25:13.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:25:13.227 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:25:13.228 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:25:13.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:25:13.251 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:25:13.251 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:25:13.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:25:13.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:25:13.253 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:25:13.253 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:25:13.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:25:13.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:25:13.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:25:13.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:25:13.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:25:13.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:25:13.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:25:13.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:25:13.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:25:13.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:25:13.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:25:13.590 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:25:13.664 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:25:12
2026-06-03T20:25:13.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86969, datetime.datetime(2026, 6, 3, 20, 25, 12), datetime.datetime(2026, 6, 3, 20, 25, 11), 'salt', 2.65, 100.11, None, 39.73, 93.1, -0.01, 821.83, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:25:13.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:25:13.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:25:13.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:25:11, diff=2.671587s, valid=True
2026-06-03T20:25:13.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:25:13.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:25:13.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:25:12, diff=1.675099s, valid=True
2026-06-03T20:25:13.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:25:13.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:25:13.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:25:03, diff=10.683256s, valid=True
2026-06-03T20:25:13.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:25:13.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:25:13.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:25:13.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:25:13.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:25:13.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:25:13.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:25:12, diff=1.687023s, valid=True
2026-06-03T20:25:13.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:25:13.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:25:13.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:25:13.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85310.687857s, valid=False
2026-06-03T20:25:13.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:25:13.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:25:13.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:25:13.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:25:13.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:25:13.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:25:13.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:25:13.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:25:13.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:25:13.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:25:13.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:25:13.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:25:13.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:25:14.010 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:25:14.219 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:25:14.570 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:25:14.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:25:14.675 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:25:14.675 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:25:15.057 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:25:15.058 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:25:45.079 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:25:45.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:25:45.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:25:45.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:25:45.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:25:45.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:25:45.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:25:45.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:25:45.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:25:45.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:25:45.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:25:45.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:25:45.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:25:48.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:25:48.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:25:48.413 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:25:48.414 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:25:48.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:25:48.436 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:25:48.437 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:25:48.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:25:48.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:25:48.438 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:25:48.438 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:25:48.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:25:48.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:25:48.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:25:48.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:25:48.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:25:48.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:25:48.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:25:48.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:25:48.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:25:48.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:25:48.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:25:48.779 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:25:48.863 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:25:42
2026-06-03T20:25:48.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86970, datetime.datetime(2026, 6, 3, 20, 25, 42), datetime.datetime(2026, 6, 3, 20, 25, 41), 'salt', 2.78, 100.18, None, 42.55, 115.05, -0.03, 821.83, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:25:48.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:25:48.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:25:48.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:25:41, diff=7.870659s, valid=True
2026-06-03T20:25:48.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:25:48.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:25:48.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:26:12, diff=-23.125875s, valid=True
2026-06-03T20:25:48.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:25:48.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:25:48.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:25:34, diff=14.882326s, valid=True
2026-06-03T20:25:48.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:25:48.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:25:48.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:25:48.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:25:48.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:25:48.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:25:48.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:26:12, diff=-23.113934s, valid=True
2026-06-03T20:25:48.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:25:48.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:25:48.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:25:48.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85345.88689s, valid=False
2026-06-03T20:25:48.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:25:48.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:25:48.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:25:48.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:25:48.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:25:48.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:25:48.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:25:48.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:25:48.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:25:49.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:25:49.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:25:49.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:25:49.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:25:49.208 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:25:49.414 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:25:49.825 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:25:49.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:25:49.942 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:25:49.942 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:25:50.028 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:25:50.029 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:26:20.059 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:26:20.059 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:26:20.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:26:20.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:26:20.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:26:20.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:26:20.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:26:20.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:26:20.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:26:20.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:26:20.461 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:26:20.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:26:20.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:26:23.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:26:23.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:26:23.112 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:26:23.112 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:26:23.122 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:26:23.135 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:26:23.135 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:26:23.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:26:23.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:26:23.136 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:26:23.137 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:26:23.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:26:23.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:26:23.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:26:23.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:26:23.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:26:23.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:26:23.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:26:23.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:26:23.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:26:23.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:26:23.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:26:23.481 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:26:23.556 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:26:12
2026-06-03T20:26:23.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86971, datetime.datetime(2026, 6, 3, 20, 26, 12), datetime.datetime(2026, 6, 3, 20, 26, 11), 'salt', 2.78, 100.18, None, 41.53, 109.91, -0.03, 821.84, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:26:23.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:26:23.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:26:23.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:26:11, diff=12.563827s, valid=True
2026-06-03T20:26:23.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:26:23.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:26:23.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:26:12, diff=11.567287s, valid=True
2026-06-03T20:26:23.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:26:23.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:26:23.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:26:06, diff=17.575454s, valid=True
2026-06-03T20:26:23.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:26:23.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:26:23.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:26:23.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:26:23.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:26:23.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:26:23.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:26:12, diff=11.579212s, valid=True
2026-06-03T20:26:23.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:26:23.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:26:23.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:26:23.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85380.58003s, valid=False
2026-06-03T20:26:23.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:26:23.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:26:23.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:26:23.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:26:23.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:26:23.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:26:23.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:26:23.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:26:23.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:26:23.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:26:23.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:26:23.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:26:23.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:26:23.900 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:26:24.108 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:26:24.447 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:26:24.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:26:24.551 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:26:24.551 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:26:26.548 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:26:26.548 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:26:56.560 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:26:56.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:26:56.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:26:57.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:26:57.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:26:57.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:26:57.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:26:57.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:26:57.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:26:57.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:26:57.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:26:57.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:26:57.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:26:59.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:27:00.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:27:00.002 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:27:00.002 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:27:00.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:27:00.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:27:00.022 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:27:00.022 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:27:00.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:27:00.022 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:27:00.022 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:27:00.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:27:00.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:27:00.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:27:00.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:27:00.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:27:00.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:27:00.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:27:00.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:27:00.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:27:00.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:27:00.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:27:00.319 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:27:00.391 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:26:42
2026-06-03T20:27:00.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86972, datetime.datetime(2026, 6, 3, 20, 26, 42), datetime.datetime(2026, 6, 3, 20, 26, 42), 'salt', 2.78, 100.12, None, 42.06, 109.04, -0.02, 821.78, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:27:00.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:27:00.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:27:00.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:26:42, diff=18.398221s, valid=True
2026-06-03T20:27:00.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:27:00.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:27:00.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:27:12, diff=-11.59865s, valid=True
2026-06-03T20:27:00.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:27:00.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:27:00.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:26:37, diff=23.408658s, valid=True
2026-06-03T20:27:00.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:27:00.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:27:00.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:27:00.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:27:00.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:27:00.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:27:00.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:27:12, diff=-11.588008s, valid=True
2026-06-03T20:27:00.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:27:00.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:27:00.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:27:00.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85417.412758s, valid=False
2026-06-03T20:27:00.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:27:00.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:27:00.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:27:00.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:27:00.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:27:00.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:27:00.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:27:00.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:27:00.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:27:00.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:27:00.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:27:00.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:27:00.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:27:00.804 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:27:01.027 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:27:01.372 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:27:01.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:27:01.475 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:27:01.475 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:27:01.669 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:27:01.670 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:27:31.689 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:27:31.690 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:27:31.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:27:32.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:27:32.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:27:32.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:27:32.268 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:27:32.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:27:32.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:27:32.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:27:32.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:27:32.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:27:32.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:27:35.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:27:35.018 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:27:35.019 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:27:35.019 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:27:35.029 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:27:35.042 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:27:35.042 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:27:35.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:27:35.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:27:35.044 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:27:35.044 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:27:35.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:27:35.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:27:35.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:27:35.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:27:35.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:27:35.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:27:35.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:27:35.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:27:35.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:27:35.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:27:35.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:27:35.384 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:27:35.457 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:27:13
2026-06-03T20:27:35.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86973, datetime.datetime(2026, 6, 3, 20, 27, 13), datetime.datetime(2026, 6, 3, 20, 27, 12), 'salt', 2.75, 100.22, None, 36.34, 114.28, -0.03, 821.78, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:27:35.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:27:35.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:27:35.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:27:12, diff=23.465246s, valid=True
2026-06-03T20:27:35.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:27:35.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:27:35.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:27:12, diff=23.468721s, valid=True
2026-06-03T20:27:35.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:27:35.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:27:35.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:27:09, diff=26.476928s, valid=True
2026-06-03T20:27:35.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:27:35.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:27:35.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:27:35.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:27:35.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:27:35.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:27:35.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:27:12, diff=23.480645s, valid=True
2026-06-03T20:27:35.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:27:35.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:27:35.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:27:35.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85452.481444s, valid=False
2026-06-03T20:27:35.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:27:35.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:27:35.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:27:35.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:27:35.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:27:35.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:27:35.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:27:35.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:27:35.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:27:35.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:27:35.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:27:35.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:27:35.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:27:35.812 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:27:36.020 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:27:36.370 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:27:36.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:27:36.475 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:27:36.475 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:27:36.698 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:27:36.698 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:28:06.708 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:28:06.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:28:06.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:28:06.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:28:06.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:28:07.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:28:07.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:28:07.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:28:07.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:28:07.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:28:07.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:28:07.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:28:07.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:28:09.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:28:09.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:28:09.787 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:28:09.787 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:28:09.798 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:28:09.811 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:28:09.811 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:28:09.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:28:09.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:28:09.812 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:28:09.812 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:28:09.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:28:09.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:28:09.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:28:10.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:28:10.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:28:10.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:28:10.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:28:10.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:28:10.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:28:10.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:28:10.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:28:10.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:28:10.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:27:44
2026-06-03T20:28:10.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86974, datetime.datetime(2026, 6, 3, 20, 27, 44), datetime.datetime(2026, 6, 3, 20, 27, 42), 'salt', 2.75, 100.08, None, 31.65, 128.58, -0.01, 821.9, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:28:10.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:28:10.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:28:10.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:27:42, diff=28.195088s, valid=True
2026-06-03T20:28:10.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:28:10.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:28:10.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:28:12, diff=-1.80114s, valid=True
2026-06-03T20:28:10.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:28:10.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:28:10.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:27:40, diff=30.205979s, valid=True
2026-06-03T20:28:10.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:28:10.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:28:10.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:28:10.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:28:10.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:28:10.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:28:10.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:28:12, diff=-1.790846s, valid=True
2026-06-03T20:28:10.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:28:10.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:28:10.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:28:10.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85487.209839s, valid=False
2026-06-03T20:28:10.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:28:10.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:28:10.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:28:10.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:28:10.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:28:10.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:28:10.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:28:10.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:28:10.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:28:10.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:28:10.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:28:10.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:28:10.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:28:10.595 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:28:10.804 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:28:11.150 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:28:11.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:28:11.255 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:28:11.255 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:28:11.451 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:28:11.451 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:28:41.481 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:28:41.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:28:41.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:28:41.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:28:41.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:28:42.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:28:42.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:28:42.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:28:42.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:28:42.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:28:42.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:28:42.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:28:42.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:28:45.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:28:45.037 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:28:45.038 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:28:45.039 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:28:45.049 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:28:45.062 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:28:45.063 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:28:45.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:28:45.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:28:45.064 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:28:45.064 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:28:45.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:28:45.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:28:45.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:28:45.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:28:45.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:28:45.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:28:45.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:28:45.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:28:45.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:28:45.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:28:45.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:28:45.381 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:28:45.457 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:28:44
2026-06-03T20:28:45.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86976, datetime.datetime(2026, 6, 3, 20, 28, 44), datetime.datetime(2026, 6, 3, 20, 28, 44), 'salt', 2.81, 100.22, None, 33.94, 113.41, -0.04, 821.9, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:28:45.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:28:45.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:28:45.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:28:44, diff=1.464722s, valid=True
2026-06-03T20:28:45.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:28:45.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:28:45.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:29:12, diff=-26.531936s, valid=True
2026-06-03T20:28:45.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:28:45.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:28:45.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:28:44, diff=1.475779s, valid=True
2026-06-03T20:28:45.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:28:45.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:28:45.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:28:45.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:28:45.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:28:45.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:28:45.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:29:12, diff=-26.520636s, valid=True
2026-06-03T20:28:45.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:28:45.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:28:45.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:28:45.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85522.480151s, valid=False
2026-06-03T20:28:45.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:28:45.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:28:45.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:28:45.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:28:45.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:28:45.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:28:45.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:28:45.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:28:45.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:28:45.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:28:45.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:28:45.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:28:45.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:28:45.799 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:28:46.007 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:28:46.350 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:28:46.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:28:46.453 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:28:46.453 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:28:46.649 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:28:46.650 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:29:16.678 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:29:16.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:29:16.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:29:17.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:29:17.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:29:17.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:29:17.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:29:17.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:29:17.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:29:17.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:29:17.387 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:29:17.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:29:17.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:29:20.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:29:20.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:29:20.297 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:29:20.297 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:29:20.309 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:29:20.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:29:20.323 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:29:20.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:29:20.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:29:20.324 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:29:20.325 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:29:20.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:29:20.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:29:20.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:29:20.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:29:20.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:29:20.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:29:20.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:29:20.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:29:20.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:29:20.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:29:20.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:29:20.691 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:29:20.785 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:29:15
2026-06-03T20:29:20.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86977, datetime.datetime(2026, 6, 3, 20, 29, 15), datetime.datetime(2026, 6, 3, 20, 29, 14), 'salt', 2.75, 100.08, None, 37.54, 105.97, -0.01, 821.78, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:29:20.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:29:20.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:29:20.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:29:14, diff=6.793172s, valid=True
2026-06-03T20:29:20.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:29:20.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:29:20.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:29:12, diff=8.796779s, valid=True
2026-06-03T20:29:20.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:29:20.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:29:20.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:29:14, diff=6.805093s, valid=True
2026-06-03T20:29:20.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:29:20.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:29:20.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:29:20.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:29:20.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:29:20.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:29:20.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:29:12, diff=8.808933s, valid=True
2026-06-03T20:29:20.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:29:20.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:29:20.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:29:20.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85557.80976s, valid=False
2026-06-03T20:29:20.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:29:20.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:29:20.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:29:20.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:29:20.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:29:20.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:29:20.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:29:20.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:29:20.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:29:21.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:29:21.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:29:21.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:29:21.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:29:21.198 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:29:21.409 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:29:21.751 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:29:21.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:29:21.854 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:29:21.854 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:29:22.053 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:29:22.053 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:29:52.062 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:29:52.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:29:52.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:29:52.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:29:52.458 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:29:52.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:29:52.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:29:52.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:29:52.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:29:52.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:29:52.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:29:52.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:29:52.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:29:55.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:29:55.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:29:55.693 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:29:55.693 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:29:55.704 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:29:55.718 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:29:55.719 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:29:55.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:29:55.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:29:55.720 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:29:55.720 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:29:55.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:29:55.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:29:55.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:29:55.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:29:55.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:29:56.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:29:56.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:29:56.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:29:56.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:29:56.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:29:56.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:29:56.080 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:29:56.152 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:29:45
2026-06-03T20:29:56.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86978, datetime.datetime(2026, 6, 3, 20, 29, 45), datetime.datetime(2026, 6, 3, 20, 29, 44), 'salt', 2.78, 100.18, None, 48.58, 110.05, -0.03, 822.03, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:29:56.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:29:56.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:29:56.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:29:44, diff=12.159518s, valid=True
2026-06-03T20:29:56.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:29:56.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:29:56.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:30:12, diff=-15.837091s, valid=True
2026-06-03T20:29:56.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:29:56.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:29:56.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:29:45, diff=11.170725s, valid=True
2026-06-03T20:29:56.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:29:56.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:29:56.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:29:56.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:29:56.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:29:56.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:29:56.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:30:12, diff=-15.825697s, valid=True
2026-06-03T20:29:56.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:29:56.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:29:56.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:29:56.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85593.17508s, valid=False
2026-06-03T20:29:56.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:29:56.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:29:56.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:29:56.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:29:56.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:29:56.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:29:56.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:29:56.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:29:56.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:29:56.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:29:56.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:29:56.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:29:56.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:29:56.494 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:29:56.698 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:29:57.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:29:57.145 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:29:57.145 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:29:57.145 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:29:57.331 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:29:57.331 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:30:27.361 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:30:27.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:30:27.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:30:27.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:30:27.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:30:27.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:30:27.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:30:27.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:30:27.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:30:27.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:30:27.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:30:27.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:30:27.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:30:30.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:30:31.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:30:31.005 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:30:31.006 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:30:31.016 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:30:31.029 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:30:31.030 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:30:31.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:30:31.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:30:31.031 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:30:31.031 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:30:31.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:30:31.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:30:31.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:30:31.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:30:31.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:30:31.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:30:31.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:30:31.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:30:31.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:30:31.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:30:31.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:30:31.383 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:30:31.458 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:30:15
2026-06-03T20:30:31.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86979, datetime.datetime(2026, 6, 3, 20, 30, 15), datetime.datetime(2026, 6, 3, 20, 30, 14), 'salt', 2.78, 100.25, None, 38.18, 112.8, -0.04, 821.84, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:30:31.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:30:31.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:30:31.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:30:14, diff=17.465673s, valid=True
2026-06-03T20:30:31.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:30:31.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:30:31.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:30:12, diff=19.469104s, valid=True
2026-06-03T20:30:31.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:30:31.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:30:31.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:30:15, diff=16.477222s, valid=True
2026-06-03T20:30:31.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:30:31.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:30:31.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:30:31.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:30:31.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:30:31.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:30:31.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:30:12, diff=19.480942s, valid=True
2026-06-03T20:30:31.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:30:31.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:30:31.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:30:31.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85628.481761s, valid=False
2026-06-03T20:30:31.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:30:31.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:30:31.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:30:31.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:30:31.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:30:31.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:30:31.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:30:31.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:30:31.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:30:31.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:30:31.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:30:31.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:30:31.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:30:31.802 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:30:32.008 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:30:32.355 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:30:32.457 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:30:32.458 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:30:32.458 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:30:32.643 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:30:32.644 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:31:02.674 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:31:02.674 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:31:02.674 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:31:02.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:31:02.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:31:03.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:31:03.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:31:03.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:31:03.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:31:03.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:31:03.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:31:03.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:31:03.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:31:06.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:31:06.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:31:06.103 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:31:06.104 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:31:06.113 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:31:06.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:31:06.126 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:31:06.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:31:06.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:31:06.126 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:31:06.126 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:31:06.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:31:06.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:31:06.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:31:06.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:31:06.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:31:06.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:31:06.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:31:06.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:31:06.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:31:06.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:31:06.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:31:06.449 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:31:06.520 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:30:45
2026-06-03T20:31:06.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86980, datetime.datetime(2026, 6, 3, 20, 30, 45), datetime.datetime(2026, 6, 3, 20, 30, 45), 'salt', 2.78, 100.12, None, 42.69, 106.58, -0.02, 821.84, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:31:06.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:31:06.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:31:06.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:30:45, diff=21.527501s, valid=True
2026-06-03T20:31:06.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:31:06.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:31:06.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:31:12, diff=-5.46902s, valid=True
2026-06-03T20:31:06.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:31:06.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:31:06.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:30:45, diff=21.539156s, valid=True
2026-06-03T20:31:06.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:31:06.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:31:06.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:31:06.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:31:06.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:31:06.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:31:06.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:31:12, diff=-5.457137s, valid=True
2026-06-03T20:31:06.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:31:06.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:31:06.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:31:06.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85663.543683s, valid=False
2026-06-03T20:31:06.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:31:06.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:31:06.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:31:06.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:31:06.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:31:06.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:31:06.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:31:06.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:31:06.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:31:06.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:31:06.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:31:06.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:31:06.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:31:06.864 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:31:07.068 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:31:07.470 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:31:07.571 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:31:07.571 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:31:07.571 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:31:07.761 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:31:07.761 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:31:37.790 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:31:37.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:31:37.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:31:38.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:31:38.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:31:38.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:31:38.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:31:38.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:31:38.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:31:38.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:31:38.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:31:38.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:31:38.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:31:42.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:31:42.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:31:42.350 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:31:42.350 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:31:42.358 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:31:42.370 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:31:42.371 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:31:42.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:31:42.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:31:42.371 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:31:42.371 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:31:42.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:31:42.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:31:42.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:31:42.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:31:42.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:31:42.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:31:42.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:31:42.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:31:42.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:31:42.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:31:42.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:31:42.709 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:31:42.783 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:31:16
2026-06-03T20:31:42.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86981, datetime.datetime(2026, 6, 3, 20, 31, 16), datetime.datetime(2026, 6, 3, 20, 31, 15), 'salt', 2.75, 100.09, None, 37.93, 111.07, -0.01, 821.9, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:31:42.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:31:42.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:31:42.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:31:15, diff=27.791061s, valid=True
2026-06-03T20:31:42.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:31:42.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:31:42.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:31:12, diff=30.794663s, valid=True
2026-06-03T20:31:42.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:31:42.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:31:42.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:31:15, diff=27.803063s, valid=True
2026-06-03T20:31:42.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:31:42.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:31:42.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:31:42.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:31:42.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:31:42.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:31:42.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:31:12, diff=30.80691s, valid=True
2026-06-03T20:31:42.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:31:42.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:31:42.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:31:42.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85699.807755s, valid=False
2026-06-03T20:31:42.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:31:42.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:31:42.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:31:42.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:31:42.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:31:42.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:31:42.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:31:42.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:31:42.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:31:42.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:31:43.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:31:43.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:31:43.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:31:43.130 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:31:43.338 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:31:43.680 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:31:43.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:31:43.784 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:31:43.784 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:31:45.405 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:31:45.406 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:32:15.436 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:32:15.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:32:15.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:32:15.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:32:15.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:32:16.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:32:16.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:32:16.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:32:16.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:32:16.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:32:16.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:32:16.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:32:16.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:32:19.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:32:19.309 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:32:19.309 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:32:19.310 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:32:19.321 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:32:19.333 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:32:19.334 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:32:19.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:32:19.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:32:19.335 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:32:19.335 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:32:19.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:32:19.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:32:19.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:32:19.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:32:19.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:32:19.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:32:19.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:32:19.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T20:32:19.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:32:19.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:32:19.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:32:19.682 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:32:19.756 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:32:16
2026-06-03T20:32:19.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86983, datetime.datetime(2026, 6, 3, 20, 32, 16), datetime.datetime(2026, 6, 3, 20, 32, 16), 'salt', 2.81, 100.15, None, 34.15, 102.87, -0.03, 822.09, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:32:19.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:32:19.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:32:19.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:32:16, diff=3.763776s, valid=True
2026-06-03T20:32:19.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:32:19.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:32:19.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:32:12, diff=7.767353s, valid=True
2026-06-03T20:32:19.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:32:19.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:32:19.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:32:16, diff=3.775491s, valid=True
2026-06-03T20:32:19.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:32:19.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:32:19.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:32:19.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:32:19.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:32:19.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T20:32:19.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:32:12, diff=7.779233s, valid=True
2026-06-03T20:32:19.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:32:19.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:32:19.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:32:19.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85736.780041s, valid=False
2026-06-03T20:32:19.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:32:19.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:32:19.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:32:19.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:32:19.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:32:19.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:32:19.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:32:19.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:32:19.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:32:19.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:32:19.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:32:20.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:32:20.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:32:20.116 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:32:20.395 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:32:20.736 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:32:20.838 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:32:20.838 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:32:20.838 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:32:21.133 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:32:21.133 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:32:51.151 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:32:51.151 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:32:51.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:32:51.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:32:51.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:32:51.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:32:51.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:32:51.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:32:51.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:32:51.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:32:51.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:32:51.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:32:51.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:32:54.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:32:54.831 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:32:54.832 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:32:54.832 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:32:54.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:32:54.854 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:32:54.854 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:32:54.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:32:54.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:32:54.855 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:32:54.855 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:32:54.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:32:55.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:32:55.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:32:55.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:32:55.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:32:55.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:32:55.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:32:55.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:32:55.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:32:55.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:32:55.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:32:55.212 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:32:55.287 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:32:47
2026-06-03T20:32:55.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86984, datetime.datetime(2026, 6, 3, 20, 32, 47), datetime.datetime(2026, 6, 3, 20, 32, 46), 'salt', 2.91, 100.19, None, 39.69, 114.82, -0.03, 821.91, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:32:55.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:32:55.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:32:55.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:32:46, diff=9.294498s, valid=True
2026-06-03T20:32:55.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:32:55.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:32:55.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:33:12, diff=-16.702032s, valid=True
2026-06-03T20:32:55.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:32:55.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:32:55.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:32:46, diff=9.306082s, valid=True
2026-06-03T20:32:55.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:32:55.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:32:55.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:32:55.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:32:55.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:32:55.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:32:55.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:33:12, diff=-16.690201s, valid=True
2026-06-03T20:32:55.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:32:55.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:32:55.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:32:55.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85772.310595s, valid=False
2026-06-03T20:32:55.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:32:55.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:32:55.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:32:55.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:32:55.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:32:55.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:32:55.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:32:55.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:32:55.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:32:55.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:32:55.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:32:55.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:32:55.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:32:55.630 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:32:55.835 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:32:56.177 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:32:56.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:32:56.279 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:32:56.279 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:32:56.529 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:32:56.529 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:33:26.530 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:33:26.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:33:26.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:33:26.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:33:26.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:33:27.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:33:27.147 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:33:27.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:33:27.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:33:27.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:33:27.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:33:27.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:33:27.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:33:30.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:33:30.236 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:33:30.237 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:33:30.237 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:33:30.250 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:33:30.263 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:33:30.263 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:33:30.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:33:30.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:33:30.264 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:33:30.264 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:33:30.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:33:30.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:33:30.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:33:30.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:33:30.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:33:30.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:33:30.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:33:30.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T20:33:30.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:33:30.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:33:30.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:33:30.596 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:33:30.669 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:33:17
2026-06-03T20:33:30.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86985, datetime.datetime(2026, 6, 3, 20, 33, 17), datetime.datetime(2026, 6, 3, 20, 33, 16), 'salt', 2.78, 100.15, None, 33.34, 105.97, -0.03, 821.91, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:33:30.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:33:30.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:33:30.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:33:16, diff=14.67663s, valid=True
2026-06-03T20:33:30.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:33:30.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:33:30.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:33:12, diff=18.679977s, valid=True
2026-06-03T20:33:30.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:33:30.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:33:30.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:33:16, diff=14.687809s, valid=True
2026-06-03T20:33:30.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:33:30.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:33:30.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:33:30.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:33:30.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:33:30.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T20:33:30.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:33:12, diff=18.691382s, valid=True
2026-06-03T20:33:30.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:33:30.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:33:30.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:33:30.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85807.692168s, valid=False
2026-06-03T20:33:30.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:33:30.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:33:30.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:33:30.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:33:30.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:33:30.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:33:30.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:33:30.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:33:30.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:33:30.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:33:30.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:33:30.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:33:30.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:33:31.083 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:33:31.288 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:33:31.629 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:33:31.731 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:33:31.731 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:33:31.731 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:33:31.927 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:33:31.927 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:34:01.939 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:34:01.939 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:34:01.940 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:34:02.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:34:02.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:34:02.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:34:02.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:34:02.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:34:02.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:34:02.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:34:02.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:34:02.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:34:02.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:34:05.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:34:05.445 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:34:05.446 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:34:05.449 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:34:05.460 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:34:05.480 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:34:05.481 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:34:05.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:34:05.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:34:05.482 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:34:05.482 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:34:05.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:34:05.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:34:05.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:34:05.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:34:05.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:34:05.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T20:34:05.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:34:05.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T20:34:05.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:34:05.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:34:05.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:34:05.840 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:34:05.914 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:33:47
2026-06-03T20:34:05.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86986, datetime.datetime(2026, 6, 3, 20, 33, 47), datetime.datetime(2026, 6, 3, 20, 33, 46), 'salt', 2.81, 100.19, None, 38.11, 116.91, -0.03, 821.97, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:34:05.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:34:05.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:34:05.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:33:46, diff=19.922148s, valid=True
2026-06-03T20:34:05.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:34:05.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T20:34:05.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:34:12, diff=-6.074362s, valid=True
2026-06-03T20:34:05.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:34:05.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:34:05.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:33:47, diff=18.933705s, valid=True
2026-06-03T20:34:05.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:34:05.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:34:05.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:34:05.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:34:05.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:34:05.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T20:34:05.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:34:12, diff=-6.062569s, valid=True
2026-06-03T20:34:05.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:34:05.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:34:05.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:34:05.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85842.938244s, valid=False
2026-06-03T20:34:05.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:34:05.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:34:05.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:34:05.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:34:05.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:34:06.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:34:06.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:34:06.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:34:06.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:34:06.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:34:06.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:34:06.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:34:06.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:34:06.263 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:34:06.467 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:34:06.804 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:34:06.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:34:06.908 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:34:06.908 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:34:07.069 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:34:07.069 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:34:37.099 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:34:37.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:34:37.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:34:37.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:34:37.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:34:37.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:34:37.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:34:37.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:34:37.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:34:37.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:34:37.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:34:37.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:34:37.534 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:34:40.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:34:40.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:34:40.433 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:34:40.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:34:40.442 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:34:40.455 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:34:40.456 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:34:40.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:34:40.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:34:40.457 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:34:40.457 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:34:40.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:34:40.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:34:40.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:34:40.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:34:40.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:34:40.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T20:34:40.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:34:40.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T20:34:40.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:34:40.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:34:40.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:34:40.803 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:34:40.878 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:34:17
2026-06-03T20:34:40.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86987, datetime.datetime(2026, 6, 3, 20, 34, 17), datetime.datetime(2026, 6, 3, 20, 34, 17), 'salt', 2.85, 100.12, None, 42.16, 108.01, -0.02, 821.72, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:34:40.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:34:40.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:34:40.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:34:17, diff=23.885818s, valid=True
2026-06-03T20:34:40.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:34:40.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T20:34:40.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:34:12, diff=28.889342s, valid=True
2026-06-03T20:34:40.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:34:40.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:34:40.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:34:17, diff=23.897589s, valid=True
2026-06-03T20:34:40.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:34:40.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:34:40.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:34:40.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:34:40.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:34:40.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T20:34:40.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:34:12, diff=28.901307s, valid=True
2026-06-03T20:34:40.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:34:40.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:34:40.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:34:40.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85877.902133s, valid=False
2026-06-03T20:34:40.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:34:40.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:34:40.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:34:40.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:34:40.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:34:40.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:34:40.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:34:40.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:34:40.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:34:41.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:34:41.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:34:41.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:34:41.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:34:41.291 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:34:41.496 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:34:41.843 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:34:41.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:34:41.946 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:34:41.946 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:34:42.039 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:34:42.040 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:35:12.064 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:35:12.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:35:12.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:35:12.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:35:12.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:35:12.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:35:12.633 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:35:12.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:35:12.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:35:12.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:35:12.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:35:12.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:35:12.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:35:15.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:35:15.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:35:15.968 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:35:15.968 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:35:15.978 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:35:15.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:35:15.992 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:35:15.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:35:15.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:35:15.993 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:35:15.993 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:35:15.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:35:16.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T20:35:16.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:35:16.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T20:35:16.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:35:16.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:35:16.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:35:16.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:35:16.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:35:16.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:35:16.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:35:16.346 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:35:16.421 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:34:48
2026-06-03T20:35:16.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86988, datetime.datetime(2026, 6, 3, 20, 34, 48), datetime.datetime(2026, 6, 3, 20, 34, 47), 'salt', 2.85, 100.15, None, 39.52, 115.62, -0.02, 822.09, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:35:16.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:35:16.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T20:35:16.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:34:47, diff=29.429255s, valid=True
2026-06-03T20:35:16.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:35:16.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:35:16.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:35:12, diff=4.432813s, valid=True
2026-06-03T20:35:16.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:35:16.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T20:35:16.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:34:47, diff=29.441067s, valid=True
2026-06-03T20:35:16.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:35:16.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:35:16.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:35:16.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:35:16.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:35:16.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:35:16.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:35:12, diff=4.444827s, valid=True
2026-06-03T20:35:16.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:35:16.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:35:16.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:35:16.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85913.445647s, valid=False
2026-06-03T20:35:16.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:35:16.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:35:16.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:35:16.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:35:16.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:35:16.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:35:16.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:35:16.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:35:16.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:35:16.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:35:16.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:35:16.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:35:16.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:35:16.764 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:35:16.968 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:35:17.309 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:35:17.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:35:17.410 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:35:17.411 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:35:17.678 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:35:17.678 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:35:47.709 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:35:47.709 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:35:47.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:35:48.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:35:48.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:35:48.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:35:48.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:35:48.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:35:48.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:35:48.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:35:48.477 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:35:48.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:35:48.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:35:51.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:35:51.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:35:51.371 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:35:51.372 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:35:51.381 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:35:51.394 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:35:51.395 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:35:51.395 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:35:51.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:35:51.396 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:35:51.396 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:35:51.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:35:51.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:35:51.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:35:51.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:35:51.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:35:51.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:35:51.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:35:51.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:35:51.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:35:51.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:35:51.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:35:51.694 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:35:51.767 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:35:48
2026-06-03T20:35:51.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86990, datetime.datetime(2026, 6, 3, 20, 35, 48), datetime.datetime(2026, 6, 3, 20, 35, 47), 'salt', 2.91, 100.32, None, 42.13, 117.88, -0.05, 822.03, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:35:51.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:35:51.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:35:51.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:35:47, diff=4.774841s, valid=True
2026-06-03T20:35:51.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:35:51.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:35:51.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:36:12, diff=-20.221881s, valid=True
2026-06-03T20:35:51.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:35:51.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:35:51.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:35:48, diff=3.785889s, valid=True
2026-06-03T20:35:51.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:35:51.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:35:51.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:35:51.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:35:51.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:35:51.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:35:51.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:36:12, diff=-20.210614s, valid=True
2026-06-03T20:35:51.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:35:51.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:35:51.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:35:51.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85948.79017s, valid=False
2026-06-03T20:35:51.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:35:51.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:35:51.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:35:51.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:35:51.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:35:51.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:35:51.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:35:51.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:35:51.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:35:52.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:35:52.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:35:52.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:35:52.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:35:52.181 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:35:52.390 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:35:52.736 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:35:52.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:35:52.842 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:35:52.842 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:35:53.037 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:35:53.037 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:36:23.068 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:36:23.068 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:36:23.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:36:23.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:36:23.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:36:23.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:36:23.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:36:23.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:36:23.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:36:23.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:36:23.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:36:23.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:36:23.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:36:26.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:36:26.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:36:26.698 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:36:26.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:36:26.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:36:26.722 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:36:26.722 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:36:26.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:36:26.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:36:26.723 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:36:26.724 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:36:26.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:36:26.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:36:26.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:36:26.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:36:26.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:36:27.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:36:27.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:36:27.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:36:27.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:36:27.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:36:27.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:36:27.066 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:36:27.141 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:36:18
2026-06-03T20:36:27.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86991, datetime.datetime(2026, 6, 3, 20, 36, 18), datetime.datetime(2026, 6, 3, 20, 36, 18), 'salt', 2.88, 100.15, None, 36.38, 107.64, -0.03, 821.91, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:36:27.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:36:27.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:36:27.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:36:18, diff=9.148645s, valid=True
2026-06-03T20:36:27.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:36:27.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:36:27.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:36:12, diff=15.152134s, valid=True
2026-06-03T20:36:27.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:36:27.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:36:27.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:36:18, diff=9.160322s, valid=True
2026-06-03T20:36:27.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:36:27.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:36:27.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:36:27.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:36:27.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:36:27.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:36:27.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:36:12, diff=15.164076s, valid=True
2026-06-03T20:36:27.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:36:27.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:36:27.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:36:27.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=85984.164926s, valid=False
2026-06-03T20:36:27.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:36:27.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:36:27.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:36:27.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:36:27.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:36:27.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:36:27.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:36:27.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:36:27.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:36:27.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:36:27.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:36:27.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:36:27.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:36:27.486 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:36:27.693 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:36:28.037 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:36:28.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:36:28.141 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:36:28.141 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:36:28.327 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:36:28.327 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:36:58.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:36:58.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:36:58.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:36:58.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:36:58.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:36:58.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:36:58.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:36:58.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:36:58.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:36:58.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:36:58.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:36:58.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:36:58.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:37:01.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:37:01.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:37:01.931 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:37:01.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:37:01.940 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:37:01.952 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:37:01.952 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:37:01.953 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:37:01.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:37:01.953 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:37:01.953 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:37:01.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:37:02.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:37:02.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:37:02.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:37:02.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:37:02.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:37:02.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:37:02.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:37:02.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:37:02.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:37:02.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:37:02.225 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:37:02.294 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:36:49
2026-06-03T20:37:02.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86992, datetime.datetime(2026, 6, 3, 20, 36, 49), datetime.datetime(2026, 6, 3, 20, 36, 48), 'salt', 2.98, 100.19, None, 42.06, 114.99, -0.03, 821.78, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:37:02.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:37:02.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:37:02.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:36:48, diff=14.301544s, valid=True
2026-06-03T20:37:02.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:37:02.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:37:02.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:37:12, diff=-9.695308s, valid=True
2026-06-03T20:37:02.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:37:02.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:37:02.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:36:48, diff=14.312057s, valid=True
2026-06-03T20:37:02.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:37:02.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:37:02.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:37:02.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:37:02.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:37:02.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:37:02.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:37:12, diff=-9.684598s, valid=True
2026-06-03T20:37:02.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:37:02.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:37:02.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:37:02.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86019.316141s, valid=True
2026-06-03T20:37:02.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:37:02.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:37:02.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:37:02.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:37:02.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:37:02.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:37:02.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:37:02.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:37:02.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:37:02.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:37:02.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:37:02.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:37:02.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:37:02.633 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:37:02.839 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:37:03.180 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:37:03.281 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:37:03.281 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:37:03.282 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:37:04.931 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:37:04.931 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:37:34.962 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:37:34.962 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:37:34.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:37:35.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:37:35.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:37:35.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:37:35.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:37:35.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:37:35.387 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:37:35.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:37:35.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:37:35.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:37:35.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:37:38.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:37:38.372 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:37:38.374 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:37:38.374 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:37:38.386 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:37:38.399 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:37:38.399 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:37:38.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:37:38.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:37:38.400 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:37:38.401 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:37:38.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:37:38.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:37:38.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:37:38.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:37:38.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:37:38.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:37:38.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:37:38.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:37:38.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:37:38.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:37:38.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:37:38.731 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:37:38.815 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:37:19
2026-06-03T20:37:38.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86993, datetime.datetime(2026, 6, 3, 20, 37, 19), datetime.datetime(2026, 6, 3, 20, 37, 18), 'salt', 2.91, 100.15, None, 51.27, 97.12, -0.03, 821.72, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:37:38.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:37:38.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:37:38.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:37:18, diff=20.823312s, valid=True
2026-06-03T20:37:38.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:37:38.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:37:38.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:37:12, diff=26.831177s, valid=True
2026-06-03T20:37:38.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:37:38.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:37:38.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:37:19, diff=19.839359s, valid=True
2026-06-03T20:37:38.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:37:38.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:37:38.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:37:38.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:37:38.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:37:38.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:37:38.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:37:12, diff=26.843124s, valid=True
2026-06-03T20:37:38.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:37:38.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:37:38.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:37:38.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86055.84393s, valid=True
2026-06-03T20:37:38.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:37:38.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:37:38.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:37:38.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:37:38.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:37:38.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:37:38.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:37:38.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:37:38.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:37:38.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:37:39.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:37:39.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:37:39.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:37:39.176 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:37:39.392 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:37:39.784 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:37:39.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:37:39.899 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:37:39.899 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:37:40.254 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:37:40.254 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:38:10.274 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:38:10.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:38:10.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:38:10.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:38:10.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:38:10.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:38:10.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:38:10.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:38:10.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:38:10.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:38:10.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:38:10.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:38:10.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:38:13.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:38:13.823 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:38:13.823 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:38:13.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:38:13.833 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:38:13.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:38:13.846 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:38:13.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:38:13.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:38:13.847 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:38:13.847 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:38:13.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:38:13.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:38:13.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:38:14.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:38:14.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:38:14.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:38:14.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:38:14.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:38:14.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:38:14.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:38:14.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:38:14.176 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:38:14.249 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:37:49
2026-06-03T20:38:14.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86994, datetime.datetime(2026, 6, 3, 20, 37, 49), datetime.datetime(2026, 6, 3, 20, 37, 48), 'salt', 2.98, 100.22, None, 43.47, 118.42, -0.03, 821.97, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T20:38:14.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:38:14.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:38:14.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:37:48, diff=26.256511s, valid=True
2026-06-03T20:38:14.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:38:14.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:38:14.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:38:12, diff=2.259881s, valid=True
2026-06-03T20:38:14.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:38:14.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:38:14.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:37:49, diff=25.267631s, valid=True
2026-06-03T20:38:14.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:38:14.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:38:14.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:38:14.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:38:14.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:38:14.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:38:14.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:38:12, diff=2.271177s, valid=True
2026-06-03T20:38:14.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:38:14.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:38:14.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:38:14.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86091.271969s, valid=True
2026-06-03T20:38:14.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:38:14.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:38:14.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:38:14.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:38:14.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:38:14.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:38:14.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:38:14.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:38:14.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:38:14.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:38:14.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:38:14.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:38:14.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:38:14.591 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:38:14.809 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:38:15.142 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:38:15.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:38:15.243 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:38:15.243 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:38:15.445 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:38:15.445 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:38:45.474 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:38:45.474 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:38:45.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:38:45.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:38:45.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:38:46.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:38:46.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:38:46.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:38:46.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:38:46.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:38:46.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:38:46.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:38:46.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:38:49.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:38:49.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:38:49.299 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:38:49.299 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:38:49.311 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:38:49.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:38:49.324 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:38:49.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:38:49.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:38:49.325 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:38:49.325 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:38:49.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:38:49.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T20:38:49.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:38:49.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T20:38:49.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:38:49.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:38:49.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:38:49.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:38:49.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:38:49.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:38:49.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:38:49.661 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:38:49.731 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:38:19
2026-06-03T20:38:49.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86995, datetime.datetime(2026, 6, 3, 20, 38, 19), datetime.datetime(2026, 6, 3, 20, 38, 19), 'salt', 3.05, 100.22, None, 47.74, 117.93, -0.03, 821.66, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:38:49.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:38:49.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T20:38:49.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:38:19, diff=30.738613s, valid=True
2026-06-03T20:38:49.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:38:49.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:38:49.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:38:12, diff=37.742152s, valid=True
2026-06-03T20:38:49.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:38:49.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T20:38:49.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:38:19, diff=30.750274s, valid=True
2026-06-03T20:38:49.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:38:49.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:38:49.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:38:49.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:38:49.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:38:49.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:38:49.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:38:12, diff=37.754013s, valid=True
2026-06-03T20:38:49.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:38:49.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:38:49.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:38:49.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86126.754825s, valid=True
2026-06-03T20:38:49.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:38:49.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:38:49.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:38:49.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:38:49.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:38:49.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:38:49.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:38:49.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:38:49.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:38:49.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:38:49.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:38:49.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:38:50.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:38:50.091 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:38:50.365 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:38:50.696 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:38:50.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:38:50.804 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:38:50.804 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:38:51.023 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:38:51.023 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:39:21.054 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:39:21.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:39:21.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:39:21.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:39:21.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:39:21.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:39:21.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:39:21.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:39:21.831 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:39:21.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:39:21.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:39:21.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:39:21.849 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:39:24.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:39:24.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:39:24.849 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:39:24.850 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:39:24.862 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:39:24.875 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:39:24.876 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:39:24.876 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:39:24.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:39:24.877 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:39:24.877 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:39:24.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:39:24.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:39:24.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:39:25.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:39:25.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:39:25.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:39:25.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:39:25.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:39:25.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:39:25.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:39:25.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:39:25.145 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:39:25.215 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:39:20
2026-06-03T20:39:25.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86997, datetime.datetime(2026, 6, 3, 20, 39, 20), datetime.datetime(2026, 6, 3, 20, 39, 19), 'salt', 3.05, 100.22, None, 47.31, 115.44, -0.03, 821.72, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:39:25.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:39:25.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:39:25.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:39:19, diff=6.221562s, valid=True
2026-06-03T20:39:25.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:39:25.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:39:25.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:39:12, diff=13.224614s, valid=True
2026-06-03T20:39:25.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:39:25.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:39:25.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:39:20, diff=5.231715s, valid=True
2026-06-03T20:39:25.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:39:25.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:39:25.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:39:25.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:39:25.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:39:25.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:39:25.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:39:12, diff=13.234979s, valid=True
2026-06-03T20:39:25.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:39:25.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:39:25.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:39:25.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86162.235687s, valid=True
2026-06-03T20:39:25.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:39:25.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:39:25.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:39:25.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:39:25.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:39:25.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:39:25.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:39:25.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:39:25.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:39:25.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:39:25.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:39:25.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:39:25.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:39:25.554 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:39:25.753 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:39:26.087 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:39:26.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:39:26.189 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:39:26.189 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:39:26.459 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:39:26.459 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:39:56.471 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:39:56.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:39:56.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:39:56.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:39:56.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:39:56.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:39:56.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:39:57.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:39:57.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:39:57.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:39:57.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:39:57.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:39:57.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:40:00.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:40:00.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:40:00.025 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:40:00.025 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:40:00.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:40:00.046 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:40:00.047 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:40:00.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:40:00.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:40:00.047 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:40:00.047 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:40:00.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:40:00.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:40:00.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:40:00.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:40:00.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:40:00.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:40:00.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:40:00.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:40:00.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:40:00.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:40:00.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:40:00.323 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:40:00.392 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:39:50
2026-06-03T20:40:00.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86998, datetime.datetime(2026, 6, 3, 20, 39, 50), datetime.datetime(2026, 6, 3, 20, 39, 49), 'salt', 2.98, 100.12, None, 46.29, 122.69, -0.02, 821.78, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:40:00.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:40:00.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:40:00.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:39:49, diff=11.399431s, valid=True
2026-06-03T20:40:00.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:40:00.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:40:00.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:40:12, diff=-11.597335s, valid=True
2026-06-03T20:40:00.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:40:00.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:40:00.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:39:50, diff=10.41018s, valid=True
2026-06-03T20:40:00.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:40:00.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:40:00.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:40:00.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:40:00.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:40:00.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:40:00.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:40:12, diff=-11.586371s, valid=True
2026-06-03T20:40:00.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:40:00.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:40:00.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:40:00.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86197.414367s, valid=True
2026-06-03T20:40:00.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:40:00.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:40:00.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:40:00.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:40:00.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:40:00.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:40:00.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:40:00.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:40:00.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:40:00.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:40:00.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:40:00.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:40:00.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:40:00.816 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:40:01.014 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:40:01.385 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:40:01.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:40:01.488 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:40:01.488 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:40:01.756 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:40:01.757 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:40:31.774 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:40:31.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:40:31.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:40:31.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:40:31.952 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:40:32.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:40:32.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:40:32.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:40:32.199 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:40:32.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:40:32.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:40:32.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:40:32.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:40:35.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:40:35.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:40:35.209 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:40:35.209 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:40:35.219 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:40:35.232 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:40:35.232 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:40:35.233 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:40:35.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:40:35.233 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:40:35.234 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:40:35.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:40:35.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:40:35.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:40:35.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:40:35.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:40:35.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:40:35.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:40:35.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:40:35.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:40:35.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:40:35.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:40:35.566 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:40:35.644 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:40:20
2026-06-03T20:40:35.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(86999, datetime.datetime(2026, 6, 3, 20, 40, 20), datetime.datetime(2026, 6, 3, 20, 40, 20), 'salt', 3.01, 100.19, None, 45.59, 116.05, -0.03, 821.97, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T20:40:35.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:40:35.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:40:35.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:40:20, diff=15.65219s, valid=True
2026-06-03T20:40:35.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:40:35.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:40:35.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:40:12, diff=23.655677s, valid=True
2026-06-03T20:40:35.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:40:35.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:40:35.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:40:20, diff=15.663721s, valid=True
2026-06-03T20:40:35.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:40:35.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:40:35.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:40:35.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:40:35.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:40:35.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:40:35.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:40:12, diff=23.667473s, valid=True
2026-06-03T20:40:35.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:40:35.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:40:35.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:40:35.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86232.668342s, valid=True
2026-06-03T20:40:35.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:40:35.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:40:35.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:40:35.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:40:35.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:40:35.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:40:35.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:40:35.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:40:35.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:40:35.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:40:35.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:40:35.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:40:35.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:40:35.992 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:40:36.212 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:40:36.546 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:40:36.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:40:36.648 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:40:36.648 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:40:36.870 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:40:36.870 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:41:06.901 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:41:06.901 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:41:06.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:41:07.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:41:07.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:41:07.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:41:07.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:41:07.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:41:07.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:41:07.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:41:07.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:41:07.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:41:07.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:41:10.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:41:10.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:41:10.791 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:41:10.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:41:10.802 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:41:10.814 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:41:10.815 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:41:10.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:41:10.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:41:10.816 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:41:10.816 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:41:10.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:41:10.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:41:10.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:41:11.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:41:11.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:41:11.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:41:11.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:41:11.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:41:11.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:41:11.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:41:11.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:41:11.139 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:41:11.208 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:40:51
2026-06-03T20:41:11.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87000, datetime.datetime(2026, 6, 3, 20, 40, 51), datetime.datetime(2026, 6, 3, 20, 40, 50), 'salt', 3.05, 100.19, None, 42.34, 125.14, -0.03, 821.85, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T20:41:11.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:41:11.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:41:11.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:40:50, diff=21.214742s, valid=True
2026-06-03T20:41:11.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:41:11.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:41:11.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:41:12, diff=-0.782385s, valid=True
2026-06-03T20:41:11.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:41:11.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:41:11.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:40:50, diff=21.22416s, valid=True
2026-06-03T20:41:11.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:41:11.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:41:11.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:41:11.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:41:11.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:41:11.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:41:11.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:41:12, diff=-0.77281s, valid=True
2026-06-03T20:41:11.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:41:11.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:41:11.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:41:11.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86268.227852s, valid=True
2026-06-03T20:41:11.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:41:11.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:41:11.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:41:11.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:41:11.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:41:11.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:41:11.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:41:11.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:41:11.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:41:11.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:41:11.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:41:11.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:41:11.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:41:11.613 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:41:11.814 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:41:12.151 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:41:12.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:41:12.253 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:41:12.253 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:41:12.410 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:41:12.410 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:41:42.440 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:41:42.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:41:42.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:41:42.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:41:42.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:41:42.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:41:42.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:41:42.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:41:42.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:41:42.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:41:42.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:41:42.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:41:42.860 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:41:46.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:41:46.337 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:41:46.338 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:41:46.339 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:41:46.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:41:46.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:41:46.361 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:41:46.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:41:46.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:41:46.362 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:41:46.363 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:41:46.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:41:46.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:41:46.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:41:46.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:41:46.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:41:46.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:41:46.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:41:46.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:41:46.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:41:46.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:41:46.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:41:46.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:41:46.771 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:41:21
2026-06-03T20:41:46.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87001, datetime.datetime(2026, 6, 3, 20, 41, 21), datetime.datetime(2026, 6, 3, 20, 41, 20), 'salt', 3.15, 100.22, None, 41.39, 116.89, -0.03, 821.79, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T20:41:46.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:41:46.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:41:46.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:41:20, diff=26.778068s, valid=True
2026-06-03T20:41:46.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:41:46.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:41:46.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:41:12, diff=34.781213s, valid=True
2026-06-03T20:41:46.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:41:46.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:41:46.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:41:20, diff=26.788251s, valid=True
2026-06-03T20:41:46.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:41:46.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:41:46.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:41:46.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:41:46.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:41:46.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:41:46.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:41:12, diff=34.791308s, valid=True
2026-06-03T20:41:46.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:41:46.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:41:46.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:41:46.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86303.791971s, valid=True
2026-06-03T20:41:46.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:41:46.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:41:46.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:41:46.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:41:46.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:41:46.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:41:46.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:41:46.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:41:46.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:41:46.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:41:46.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:41:47.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:41:47.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:41:47.109 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:41:47.313 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:41:47.652 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:41:47.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:41:47.752 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:41:47.752 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:41:47.842 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:41:47.842 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:42:17.849 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:42:17.849 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:42:17.849 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:42:18.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:42:18.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:42:18.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:42:18.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:42:18.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:42:18.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:42:18.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:42:18.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:42:18.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:42:18.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:42:21.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:42:21.213 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:42:21.214 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:42:21.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:42:21.224 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:42:21.236 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:42:21.237 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:42:21.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:42:21.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:42:21.237 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:42:21.237 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:42:21.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:42:21.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T20:42:21.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:42:21.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T20:42:21.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:42:21.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:42:21.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:42:21.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:42:21.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:42:21.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:42:21.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:42:21.511 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:42:21.582 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:41:51
2026-06-03T20:42:21.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87002, datetime.datetime(2026, 6, 3, 20, 41, 51), datetime.datetime(2026, 6, 3, 20, 41, 50), 'salt', 3.05, 100.22, None, 44.0, 106.98, -0.03, 821.79, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T20:42:21.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:42:21.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T20:42:21.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:41:50, diff=31.589845s, valid=True
2026-06-03T20:42:21.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:42:21.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:42:21.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:42:12, diff=9.593134s, valid=True
2026-06-03T20:42:21.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:42:21.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T20:42:21.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:41:51, diff=30.600914s, valid=True
2026-06-03T20:42:21.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:42:21.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:42:21.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:42:21.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:42:21.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:42:21.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:42:21.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:42:12, diff=9.604454s, valid=True
2026-06-03T20:42:21.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:42:21.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:42:21.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:42:21.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86338.605233s, valid=True
2026-06-03T20:42:21.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:42:21.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:42:21.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:42:21.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:42:21.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:42:21.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:42:21.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:42:21.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:42:21.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:42:21.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:42:21.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:42:21.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:42:21.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:42:21.992 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:42:22.191 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:42:22.524 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:42:22.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:42:22.625 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:42:22.625 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:42:22.886 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:42:22.886 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:42:52.887 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:42:52.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:42:52.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:42:53.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:42:53.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:42:53.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:42:53.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:42:53.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:42:53.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:42:53.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:42:53.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:42:53.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:42:53.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:42:56.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:42:56.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:42:56.798 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:42:56.799 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:42:56.810 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:42:56.822 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:42:56.823 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:42:56.823 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:42:56.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:42:56.824 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:42:56.824 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:42:56.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:42:56.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:42:56.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:42:57.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:42:57.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:42:57.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:42:57.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:42:57.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:42:57.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:42:57.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:42:57.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:42:57.159 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:42:57.230 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:42:52
2026-06-03T20:42:57.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87004, datetime.datetime(2026, 6, 3, 20, 42, 52), datetime.datetime(2026, 6, 3, 20, 42, 51), 'salt', 3.01, 100.19, None, 49.25, 121.54, -0.03, 821.85, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:42:57.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:42:57.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:42:57.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:42:51, diff=6.237965s, valid=True
2026-06-03T20:42:57.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:42:57.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:42:57.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:43:12, diff=-14.758564s, valid=True
2026-06-03T20:42:57.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:42:57.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:42:57.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:42:51, diff=6.250675s, valid=True
2026-06-03T20:42:57.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:42:57.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:42:57.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:42:57.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:42:57.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:42:57.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:42:57.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:43:12, diff=-14.745081s, valid=True
2026-06-03T20:42:57.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:42:57.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:42:57.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:42:57.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86374.255753s, valid=True
2026-06-03T20:42:57.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:42:57.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:42:57.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:42:57.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:42:57.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:42:57.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:42:57.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:42:57.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:42:57.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:42:57.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:42:57.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:42:57.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:42:57.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:42:57.575 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:42:57.770 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:42:58.101 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:42:58.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:42:58.202 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:42:58.202 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:42:58.355 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:42:58.355 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:43:28.367 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:43:28.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:43:28.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:43:28.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:43:28.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:43:28.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:43:28.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:43:29.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:43:29.012 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:43:29.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:43:29.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:43:29.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:43:29.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:43:31.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:43:31.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:43:31.815 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:43:31.815 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:43:31.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:43:31.838 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:43:31.838 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:43:31.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:43:31.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:43:31.840 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:43:31.840 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:43:31.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:43:31.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:43:31.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:43:32.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:43:32.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:43:32.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:43:32.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:43:32.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:43:32.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:43:32.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:43:32.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:43:32.171 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:43:32.242 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:43:23
2026-06-03T20:43:32.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87005, datetime.datetime(2026, 6, 3, 20, 43, 23), datetime.datetime(2026, 6, 3, 20, 43, 22), 'salt', 3.05, 100.22, None, 50.77, 134.06, -0.03, 821.85, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:43:32.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:43:32.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:43:32.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:43:22, diff=10.249387s, valid=True
2026-06-03T20:43:32.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:43:32.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:43:32.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:43:12, diff=20.252916s, valid=True
2026-06-03T20:43:32.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:43:32.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:43:32.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:43:22, diff=10.261014s, valid=True
2026-06-03T20:43:32.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:43:32.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:43:32.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:43:32.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:43:32.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:43:32.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:43:32.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:43:12, diff=20.26476s, valid=True
2026-06-03T20:43:32.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:43:32.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:43:32.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:43:32.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86409.265555s, valid=True
2026-06-03T20:43:32.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:43:32.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:43:32.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:43:32.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:43:32.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:43:32.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:43:32.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:43:32.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:43:32.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:43:32.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:43:32.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:43:32.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:43:32.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Seeing data
2026-06-03T20:43:32.748 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:43:32.877 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:43:33.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:43:33.346 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:43:33.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:43:33.431 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:43:33.431 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:43:33.528 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:43:33.528 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:44:03.558 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:44:03.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:44:03.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:44:03.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:44:03.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:44:04.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:44:04.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:44:04.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:44:04.144 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:44:04.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:44:04.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:44:04.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:44:04.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:44:06.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:44:06.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:44:06.859 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:44:06.860 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:44:06.869 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:44:06.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:44:06.881 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:44:06.882 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:44:06.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:44:06.882 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:44:06.882 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:44:06.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:44:07.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:44:07.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:44:07.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:44:07.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:44:07.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:44:07.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:44:07.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:44:07.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:44:07.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:44:07.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:44:07.212 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:44:07.283 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:43:53
2026-06-03T20:44:07.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87006, datetime.datetime(2026, 6, 3, 20, 43, 53), datetime.datetime(2026, 6, 3, 20, 43, 52), 'salt', 2.88, 100.09, None, 53.35, 124.39, -0.02, 821.66, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:44:07.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:44:07.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:44:07.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:43:52, diff=15.290324s, valid=True
2026-06-03T20:44:07.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:44:07.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:44:07.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:44:12, diff=-4.706221s, valid=True
2026-06-03T20:44:07.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:44:07.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:44:07.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:43:52, diff=15.301874s, valid=True
2026-06-03T20:44:07.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:44:07.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:44:07.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:44:07.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:44:07.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:44:07.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:44:07.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:44:12, diff=-4.694436s, valid=True
2026-06-03T20:44:07.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:44:07.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:44:07.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:44:07.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86444.306368s, valid=True
2026-06-03T20:44:07.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:44:07.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:44:07.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:44:07.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:44:07.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:44:07.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:44:07.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:44:07.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:44:07.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:44:07.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:44:07.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:44:07.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:44:07.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Seeing data
2026-06-03T20:44:07.785 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:44:07.973 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:44:08.138 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:44:08.440 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:44:08.523 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:44:08.523 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:44:08.523 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:44:08.711 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:44:08.711 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:44:38.741 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:44:38.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:44:38.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:44:39.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:44:39.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:44:39.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:44:39.310 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:44:39.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:44:39.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:44:39.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:44:39.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:44:39.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:44:39.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:44:42.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:44:42.037 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:44:42.038 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:44:42.038 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:44:42.048 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:44:42.067 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:44:42.067 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:44:42.068 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:44:42.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:44:42.068 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:44:42.069 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:44:42.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:44:42.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:44:42.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:44:42.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:44:42.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:44:42.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:44:42.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:44:42.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:44:42.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:44:42.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:44:42.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:44:42.393 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:44:42.466 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:44:23
2026-06-03T20:44:42.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87007, datetime.datetime(2026, 6, 3, 20, 44, 23), datetime.datetime(2026, 6, 3, 20, 44, 22), 'salt', 2.91, 100.15, None, 59.91, 121.71, -0.03, 821.66, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:44:42.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:44:42.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:44:42.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:44:22, diff=20.475827s, valid=True
2026-06-03T20:44:42.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:44:42.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:44:42.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:44:12, diff=30.479268s, valid=True
2026-06-03T20:44:42.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:44:42.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:44:42.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:44:22, diff=20.48739s, valid=True
2026-06-03T20:44:42.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:44:42.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:44:42.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:44:42.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:44:42.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:44:42.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:44:42.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:44:12, diff=30.490969s, valid=True
2026-06-03T20:44:42.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:44:42.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:44:42.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:44:42.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86479.491753s, valid=True
2026-06-03T20:44:42.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:44:42.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:44:42.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:44:42.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:44:42.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:44:42.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:44:42.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:44:42.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:44:42.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:44:42.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:44:42.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:44:42.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:44:42.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Seeing data
2026-06-03T20:44:42.968 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:44:43.094 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:44:43.257 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:44:43.558 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:44:43.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:44:43.640 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:44:43.640 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:44:43.883 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:44:43.883 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:45:13.913 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:45:13.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:45:13.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:45:14.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:45:14.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:45:14.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:45:14.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:45:14.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:45:14.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:45:14.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:45:14.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:45:14.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:45:14.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:45:17.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:45:17.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:45:17.264 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:45:17.264 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:45:17.274 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:45:17.287 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:45:17.287 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:45:17.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:45:17.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:45:17.289 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:45:17.289 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:45:17.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:45:17.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:45:17.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:45:17.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:45:17.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:45:17.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:45:17.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:45:17.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:45:17.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:45:17.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:45:17.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:45:17.627 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:45:17.701 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:44:53
2026-06-03T20:45:17.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87008, datetime.datetime(2026, 6, 3, 20, 44, 53), datetime.datetime(2026, 6, 3, 20, 44, 53), 'salt', 2.91, 100.19, None, 43.89, 124.79, -0.03, 821.97, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T20:45:17.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:45:17.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:45:17.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:44:53, diff=24.708768s, valid=True
2026-06-03T20:45:17.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:45:17.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:45:17.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:45:12, diff=5.712244s, valid=True
2026-06-03T20:45:17.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:45:17.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:45:17.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:44:52, diff=25.720317s, valid=True
2026-06-03T20:45:17.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:45:17.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:45:17.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:45:17.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:45:17.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:45:17.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:45:17.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:45:12, diff=5.72408s, valid=True
2026-06-03T20:45:17.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:45:17.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:45:17.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:45:17.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86514.724893s, valid=True
2026-06-03T20:45:17.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:45:17.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:45:17.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:45:17.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:45:17.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:45:17.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:45:17.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:45:17.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:45:17.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:45:17.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:45:17.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:45:17.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:45:18.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Seeing data
2026-06-03T20:45:18.270 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:45:18.401 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:45:18.563 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:45:18.864 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:45:18.948 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:45:18.948 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:45:18.949 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:45:19.226 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:45:19.227 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:45:49.253 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:45:49.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:45:49.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:45:49.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:45:49.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:45:49.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:45:49.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:45:49.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:45:49.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:45:49.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:45:49.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:45:49.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:45:49.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:45:52.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:45:52.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:45:52.355 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:45:52.355 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:45:52.364 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:45:52.377 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:45:52.377 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:45:52.378 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:45:52.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:45:52.378 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:45:52.379 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:45:52.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:45:52.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T20:45:52.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:45:52.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T20:45:52.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:45:52.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:45:52.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:45:52.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T20:45:52.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:45:52.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:45:52.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:45:52.737 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:45:52.809 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:45:24
2026-06-03T20:45:52.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87009, datetime.datetime(2026, 6, 3, 20, 45, 24), datetime.datetime(2026, 6, 3, 20, 45, 23), 'salt', 2.91, 100.19, None, 43.01, 117.97, -0.03, 821.79, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T20:45:52.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:45:52.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T20:45:52.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:45:23, diff=29.816515s, valid=True
2026-06-03T20:45:52.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:45:52.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:45:52.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:45:12, diff=40.820075s, valid=True
2026-06-03T20:45:52.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:45:52.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T20:45:52.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:45:22, diff=30.828218s, valid=True
2026-06-03T20:45:52.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:45:52.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:45:52.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:45:52.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:45:52.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:45:52.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T20:45:52.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:45:12, diff=40.831968s, valid=True
2026-06-03T20:45:52.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:45:52.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:45:52.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:45:52.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86549.832814s, valid=True
2026-06-03T20:45:52.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:45:52.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:45:52.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:45:52.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:45:52.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:45:52.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:45:52.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:45:52.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:45:52.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:45:52.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:45:53.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:45:53.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:45:53.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Seeing data
2026-06-03T20:45:53.314 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:45:53.441 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:45:53.607 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:45:53.912 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:45:53.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:45:53.996 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:45:53.996 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:45:54.184 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:45:54.184 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:46:24.195 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:46:24.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:46:24.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:46:24.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:46:24.525 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:46:24.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:46:24.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:46:24.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:46:24.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:46:24.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:46:24.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:46:24.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:46:24.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:46:27.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:46:27.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:46:27.468 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:46:27.469 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:46:27.479 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:46:27.492 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:46:27.493 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:46:27.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:46:27.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:46:27.494 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:46:27.494 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:46:27.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:46:27.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:46:27.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:46:27.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:46:27.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:46:27.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:46:27.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:46:27.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:46:27.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:46:27.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:46:27.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:46:27.896 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:46:27.967 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:46:24
2026-06-03T20:46:27.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87011, datetime.datetime(2026, 6, 3, 20, 46, 24), datetime.datetime(2026, 6, 3, 20, 46, 23), 'salt', 2.91, 100.19, None, 50.28, 120.11, -0.03, 821.66, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T20:46:27.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:46:27.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:46:27.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:46:23, diff=4.973176s, valid=True
2026-06-03T20:46:27.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:46:27.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:46:27.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:46:12, diff=15.976031s, valid=True
2026-06-03T20:46:27.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:46:27.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:46:27.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:46:23, diff=4.982642s, valid=True
2026-06-03T20:46:27.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:46:27.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:46:27.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:46:27.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:46:27.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:46:27.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:46:27.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:46:12, diff=15.985635s, valid=True
2026-06-03T20:46:27.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:46:27.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:46:27.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:46:27.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86584.986277s, valid=True
2026-06-03T20:46:27.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:46:27.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:46:27.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:46:27.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:46:27.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:46:28.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:46:28.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:46:28.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:46:28.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:46:28.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:46:28.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:46:28.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:46:28.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:46:28.300 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:46:28.524 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:46:28.904 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:46:29.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:46:29.007 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:46:29.007 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:46:29.399 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:46:29.399 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:46:59.410 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:46:59.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:46:59.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:46:59.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:46:59.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:46:59.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:46:59.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:47:00.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:47:00.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:47:00.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:47:00.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:47:00.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:47:00.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:47:02.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:47:02.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:47:02.680 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:47:02.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:47:02.690 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:47:02.705 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:47:02.705 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:47:02.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:47:02.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:47:02.707 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:47:02.707 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:47:02.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:47:02.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:47:02.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:47:02.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:47:02.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:47:02.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:47:02.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:47:03.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:47:03.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:47:03.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:47:03.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:47:03.037 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:47:03.108 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:46:54
2026-06-03T20:47:03.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87012, datetime.datetime(2026, 6, 3, 20, 46, 54), datetime.datetime(2026, 6, 3, 20, 46, 54), 'salt', 2.91, 100.25, None, 49.11, 120.37, -0.04, 821.79, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T20:47:03.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:47:03.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:47:03.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:46:54, diff=9.115606s, valid=True
2026-06-03T20:47:03.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:47:03.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:47:03.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:47:12, diff=-8.881013s, valid=True
2026-06-03T20:47:03.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:47:03.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:47:03.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:46:54, diff=9.126977s, valid=True
2026-06-03T20:47:03.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:47:03.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:47:03.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:47:03.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:47:03.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:47:03.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:47:03.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:47:12, diff=-8.869439s, valid=True
2026-06-03T20:47:03.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:47:03.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:47:03.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:47:03.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86620.13134s, valid=True
2026-06-03T20:47:03.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:47:03.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:47:03.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:47:03.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:47:03.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:47:03.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:47:03.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:47:03.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:47:03.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:47:03.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:47:03.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:47:03.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:47:03.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:47:03.454 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:47:03.650 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:47:03.988 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:47:04.088 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:47:04.089 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:47:04.089 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:47:04.299 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:47:04.299 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:47:34.299 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:47:34.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:47:34.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:47:34.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:47:34.427 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:47:34.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:47:34.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:47:34.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:47:34.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:47:34.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:47:34.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:47:34.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:47:34.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:47:37.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:47:37.580 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:47:37.581 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:47:37.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:47:37.589 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:47:37.606 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:47:37.606 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:47:37.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:47:37.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:47:37.607 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:47:37.607 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:47:37.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:47:37.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:47:37.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:47:37.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:47:37.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:47:37.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:47:37.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:47:37.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:47:37.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:47:37.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:47:37.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:47:37.873 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:47:37.943 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:47:25
2026-06-03T20:47:37.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87013, datetime.datetime(2026, 6, 3, 20, 47, 25), datetime.datetime(2026, 6, 3, 20, 47, 24), 'salt', 2.88, 100.09, None, 39.59, 116.66, -0.02, 821.85, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T20:47:37.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:47:37.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:47:37.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:47:24, diff=13.950094s, valid=True
2026-06-03T20:47:37.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:47:37.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:47:37.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:47:12, diff=25.952985s, valid=True
2026-06-03T20:47:37.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:47:37.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:47:37.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:47:24, diff=13.959604s, valid=True
2026-06-03T20:47:37.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:47:37.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:47:37.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:47:37.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:47:37.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:47:37.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:47:37.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:47:12, diff=25.962661s, valid=True
2026-06-03T20:47:37.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:47:37.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:47:37.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:47:37.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86654.963302s, valid=True
2026-06-03T20:47:37.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:47:37.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:47:37.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:47:37.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:47:37.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:47:38.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:47:38.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:47:38.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:47:38.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:47:38.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:47:38.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:47:38.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:47:38.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:47:38.311 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:47:38.517 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:47:38.848 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:47:38.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:47:38.950 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:47:38.950 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:47:39.143 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:47:39.143 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:48:09.173 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:48:09.173 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:48:09.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:48:09.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:48:09.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:48:09.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:48:09.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:48:09.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:48:09.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:48:09.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:48:09.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:48:09.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:48:09.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:48:12.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:48:12.452 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:48:12.453 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:48:12.453 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:48:12.463 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:48:12.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:48:12.477 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:48:12.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:48:12.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:48:12.478 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:48:12.478 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:48:12.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:48:12.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:48:12.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:48:12.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:48:12.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:48:12.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:48:12.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:48:12.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:48:12.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:48:12.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:48:12.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:48:12.809 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:48:12.880 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:47:55
2026-06-03T20:48:12.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87014, datetime.datetime(2026, 6, 3, 20, 47, 55), datetime.datetime(2026, 6, 3, 20, 47, 54), 'salt', 2.95, 100.22, None, 54.37, 110.55, -0.03, 821.91, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T20:48:12.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:48:12.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:48:12.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:47:54, diff=18.887574s, valid=True
2026-06-03T20:48:12.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:48:12.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:48:12.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:48:12, diff=0.891129s, valid=True
2026-06-03T20:48:12.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:48:12.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:48:12.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:47:54, diff=18.89935s, valid=True
2026-06-03T20:48:12.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:48:12.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:48:12.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:48:12.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:48:12.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:48:12.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:48:12.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:48:12, diff=0.903064s, valid=True
2026-06-03T20:48:12.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:48:12.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:48:12.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:48:12.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86689.903873s, valid=True
2026-06-03T20:48:12.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:48:12.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:48:12.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:48:12.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:48:12.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:48:12.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:48:12.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:48:12.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:48:12.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:48:13.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:48:13.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:48:13.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:48:13.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:48:13.223 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:48:13.478 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:48:13.816 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:48:13.916 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:48:13.916 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:48:13.916 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:48:14.184 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:48:14.184 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:48:44.214 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:48:44.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:48:44.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:48:44.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:48:44.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:48:44.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:48:44.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:48:44.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:48:44.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:48:45.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:48:45.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:48:45.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:48:45.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:48:47.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:48:47.691 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:48:47.692 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:48:47.693 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:48:47.703 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:48:47.716 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:48:47.716 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:48:47.717 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:48:47.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:48:47.717 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:48:47.718 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:48:47.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:48:47.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:48:47.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:48:47.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:48:47.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:48:48.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:48:48.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:48:48.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:48:48.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:48:48.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:48:48.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:48:48.057 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:48:48.128 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:48:25
2026-06-03T20:48:48.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87015, datetime.datetime(2026, 6, 3, 20, 48, 25), datetime.datetime(2026, 6, 3, 20, 48, 24), 'salt', 2.95, 100.19, None, 47.98, 104.49, -0.03, 821.85, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T20:48:48.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:48:48.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:48:48.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:48:24, diff=24.13613s, valid=True
2026-06-03T20:48:48.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:48:48.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:48:48.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:48:12, diff=36.139671s, valid=True
2026-06-03T20:48:48.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:48:48.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:48:48.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:48:24, diff=24.147889s, valid=True
2026-06-03T20:48:48.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:48:48.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:48:48.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:48:48.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:48:48.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:48:48.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:48:48.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:48:12, diff=36.15163s, valid=True
2026-06-03T20:48:48.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:48:48.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:48:48.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:48:48.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86725.152438s, valid=True
2026-06-03T20:48:48.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:48:48.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:48:48.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:48:48.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:48:48.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:48:48.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:48:48.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:48:48.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:48:48.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:48:48.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:48:48.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:48:48.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:48:48.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:48:48.475 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:48:48.672 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:48:49.005 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:48:49.107 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:48:49.107 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:48:49.107 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:48:49.303 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:48:49.303 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:49:19.330 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:49:19.330 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:49:19.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:49:19.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:49:19.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:49:19.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:49:19.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:49:19.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:49:19.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:49:19.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:49:19.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:49:19.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:49:19.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:49:22.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:49:22.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:49:22.362 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:49:22.362 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:49:22.372 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:49:22.385 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:49:22.385 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:49:22.386 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:49:22.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:49:22.386 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:49:22.387 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:49:22.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:49:22.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:49:22.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:49:22.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:49:22.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:49:22.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:49:22.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:49:22.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:49:22.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:49:22.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:49:22.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:49:22.714 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:49:22.786 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:48:55
2026-06-03T20:49:22.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87016, datetime.datetime(2026, 6, 3, 20, 48, 55), datetime.datetime(2026, 6, 3, 20, 48, 55), 'salt', 2.91, 100.19, None, 48.13, 119.99, -0.03, 821.85, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T20:49:22.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:49:22.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:49:22.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:48:55, diff=27.793961s, valid=True
2026-06-03T20:49:22.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:49:22.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:49:22.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:49:12, diff=10.797423s, valid=True
2026-06-03T20:49:22.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:49:22.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:49:22.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:48:55, diff=27.80559s, valid=True
2026-06-03T20:49:22.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:49:22.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:49:22.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:49:22.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:49:22.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:49:22.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:49:22.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:49:12, diff=10.809295s, valid=True
2026-06-03T20:49:22.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:49:22.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:49:22.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:49:22.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86759.810101s, valid=True
2026-06-03T20:49:22.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:49:22.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:49:22.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:49:22.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:49:22.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:49:22.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:49:22.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:49:22.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:49:22.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:49:22.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:49:23.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:49:23.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:49:23.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:49:23.203 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:49:23.401 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:49:23.733 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:49:23.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:49:23.835 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:49:23.835 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:49:24.023 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:49:24.023 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:49:54.039 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:49:54.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:49:54.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:49:54.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:49:54.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:49:54.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:49:54.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:49:54.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:49:54.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:49:54.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:49:54.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:49:54.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:49:54.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:49:57.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:49:57.592 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:49:57.593 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:49:57.593 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:49:57.604 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:49:57.616 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:49:57.617 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:49:57.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:49:57.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:49:57.618 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:49:57.618 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:49:57.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:49:57.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:49:57.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:49:57.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:49:57.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:49:57.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:49:57.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:49:57.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:49:57.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:49:57.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:49:57.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:49:57.963 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:49:58.034 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:49:56
2026-06-03T20:49:58.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87018, datetime.datetime(2026, 6, 3, 20, 49, 56), datetime.datetime(2026, 6, 3, 20, 49, 55), 'salt', 2.95, 100.25, None, 50.07, 116.78, -0.04, 821.85, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T20:49:58.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:49:58.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:49:58.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:49:55, diff=3.041574s, valid=True
2026-06-03T20:49:58.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:49:58.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:49:58.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:50:12, diff=-13.954919s, valid=True
2026-06-03T20:49:58.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:49:58.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:49:58.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:49:55, diff=3.053317s, valid=True
2026-06-03T20:49:58.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:49:58.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:49:58.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:49:58.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:49:58.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:49:58.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:49:58.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:50:12, diff=-13.942966s, valid=True
2026-06-03T20:49:58.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:49:58.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:49:58.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:49:58.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86795.057842s, valid=True
2026-06-03T20:49:58.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:49:58.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:49:58.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:49:58.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:49:58.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:49:58.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:49:58.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:49:58.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:49:58.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:49:58.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:49:58.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:49:58.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:49:58.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:49:58.378 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:49:58.574 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:49:58.906 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:49:59.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:49:59.007 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:49:59.007 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:49:59.275 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:49:59.276 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:50:29.306 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:50:29.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:50:29.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:50:29.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:50:29.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:50:29.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:50:29.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:50:29.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:50:29.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:50:29.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:50:29.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:50:29.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:50:29.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:50:32.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:50:32.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:50:32.710 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:50:32.711 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:50:32.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:50:32.734 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:50:32.735 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:50:32.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:50:32.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:50:32.736 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:50:32.736 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:50:32.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:50:32.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:50:32.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:50:32.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:50:32.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:50:33.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:50:33.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:50:33.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:50:33.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:50:33.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:50:33.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:50:33.063 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:50:33.134 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:50:26
2026-06-03T20:50:33.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87019, datetime.datetime(2026, 6, 3, 20, 50, 26), datetime.datetime(2026, 6, 3, 20, 50, 26), 'salt', 2.95, 100.22, None, 49.11, 117.72, -0.03, 821.91, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T20:50:33.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:50:33.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:50:33.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:50:26, diff=7.141654s, valid=True
2026-06-03T20:50:33.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:50:33.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:50:33.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:50:12, diff=21.145153s, valid=True
2026-06-03T20:50:33.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:50:33.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:50:33.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:50:25, diff=8.153217s, valid=True
2026-06-03T20:50:33.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:50:33.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:50:33.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:50:33.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:50:33.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:50:33.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:50:33.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:50:12, diff=21.156945s, valid=True
2026-06-03T20:50:33.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:50:33.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:50:33.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:50:33.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86830.157777s, valid=True
2026-06-03T20:50:33.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:50:33.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:50:33.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:50:33.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:50:33.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:50:33.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:50:33.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:50:33.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:50:33.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:50:33.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:50:33.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:50:33.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:50:33.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:50:33.555 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:50:33.763 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:50:34.107 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:50:34.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:50:34.210 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:50:34.210 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:50:34.301 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:50:34.301 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:51:04.331 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:51:04.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:51:04.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:51:04.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:51:04.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:51:04.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:51:04.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:51:04.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:51:04.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:51:04.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:51:04.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:51:04.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:51:04.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:51:07.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:51:07.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:51:07.439 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:51:07.439 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:51:07.450 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:51:07.463 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:51:07.463 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:51:07.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:51:07.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:51:07.464 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:51:07.465 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:51:07.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:51:07.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:51:07.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:51:07.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:51:07.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:51:07.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:51:07.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:51:07.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:51:07.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:51:07.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:51:07.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:51:07.807 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:51:07.877 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:50:57
2026-06-03T20:51:07.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87020, datetime.datetime(2026, 6, 3, 20, 50, 57), datetime.datetime(2026, 6, 3, 20, 50, 56), 'salt', 2.88, 100.15, None, 42.94, 117.65, -0.03, 821.85, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T20:51:07.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:51:07.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:51:07.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:50:56, diff=11.884194s, valid=True
2026-06-03T20:51:07.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:51:07.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:51:07.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:51:12, diff=-4.112319s, valid=True
2026-06-03T20:51:07.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:51:07.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:51:07.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:50:56, diff=11.895771s, valid=True
2026-06-03T20:51:07.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:51:07.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:51:07.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:51:07.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:51:07.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:51:07.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:51:07.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:51:12, diff=-4.100517s, valid=True
2026-06-03T20:51:07.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:51:07.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:51:07.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:51:07.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86864.900286s, valid=True
2026-06-03T20:51:07.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:51:07.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:51:07.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:51:07.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:51:07.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:51:07.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:51:07.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:51:07.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:51:07.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:51:08.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:51:08.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:51:08.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:51:08.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:51:08.220 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:51:08.425 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:51:08.764 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:51:08.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:51:08.866 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:51:08.866 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:51:09.049 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:51:09.049 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:51:39.073 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:51:39.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:51:39.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:51:39.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:51:39.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:51:39.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:51:39.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:51:39.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:51:39.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:51:39.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:51:39.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:51:39.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:51:39.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:51:42.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:51:42.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:51:42.410 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:51:42.411 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:51:42.421 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:51:42.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:51:42.434 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:51:42.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:51:42.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:51:42.434 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:51:42.434 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:51:42.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:51:42.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:51:42.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:51:42.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:51:42.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:51:42.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:51:42.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:51:42.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:51:42.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:51:42.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:51:42.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:51:42.701 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:51:42.770 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:51:27
2026-06-03T20:51:42.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87021, datetime.datetime(2026, 6, 3, 20, 51, 27), datetime.datetime(2026, 6, 3, 20, 51, 26), 'salt', 2.95, 100.22, None, 47.67, 118.75, -0.03, 821.97, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T20:51:42.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:51:42.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:51:42.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:51:26, diff=16.776514s, valid=True
2026-06-03T20:51:42.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:51:42.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:51:42.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:51:12, diff=30.779279s, valid=True
2026-06-03T20:51:42.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:51:42.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:51:42.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:51:26, diff=16.785796s, valid=True
2026-06-03T20:51:42.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:51:42.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:51:42.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:51:42.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:51:42.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:51:42.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:51:42.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:51:12, diff=30.788786s, valid=True
2026-06-03T20:51:42.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:51:42.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:51:42.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:51:42.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86899.78943s, valid=True
2026-06-03T20:51:42.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:51:42.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:51:42.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:51:42.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:51:42.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:51:42.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:51:42.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:51:42.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:51:42.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:51:42.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:51:43.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:51:43.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:51:43.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:51:43.170 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:51:43.376 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:51:43.716 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:51:43.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:51:43.818 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:51:43.818 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:51:43.909 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:51:43.909 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:52:13.939 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:52:13.940 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:52:13.940 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:52:14.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:52:14.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:52:14.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:52:14.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:52:14.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:52:14.618 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:52:14.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:52:14.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:52:14.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:52:14.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:52:17.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:52:17.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:52:17.275 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:52:17.275 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:52:17.287 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:52:17.299 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:52:17.300 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:52:17.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:52:17.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:52:17.301 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:52:17.301 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:52:17.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:52:17.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:52:17.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:52:17.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:52:17.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:52:17.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:52:17.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:52:17.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:52:17.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:52:17.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:52:17.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:52:17.625 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:52:17.693 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:51:57
2026-06-03T20:52:17.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87022, datetime.datetime(2026, 6, 3, 20, 51, 57), datetime.datetime(2026, 6, 3, 20, 51, 56), 'salt', 2.85, 100.15, None, 55.22, 107.92, -0.02, 821.79, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T20:52:17.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:52:17.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:52:17.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:51:56, diff=21.700763s, valid=True
2026-06-03T20:52:17.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:52:17.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:52:17.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:52:12, diff=5.704234s, valid=True
2026-06-03T20:52:17.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:52:17.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:52:17.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:51:57, diff=20.712371s, valid=True
2026-06-03T20:52:17.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:52:17.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:52:17.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:52:17.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:52:17.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:52:17.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:52:17.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:52:12, diff=5.716094s, valid=True
2026-06-03T20:52:17.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:52:17.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:52:17.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:52:17.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86934.716907s, valid=True
2026-06-03T20:52:17.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:52:17.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:52:17.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:52:17.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:52:17.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:52:17.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:52:17.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:52:17.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:52:17.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:52:17.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:52:17.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:52:17.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:52:17.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:52:18.039 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:52:18.244 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:52:18.594 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:52:18.696 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:52:18.696 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:52:18.696 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:52:18.909 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:52:18.910 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:52:48.940 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:52:48.940 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:52:48.940 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:52:49.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:52:49.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:52:49.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:52:49.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:52:49.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:52:49.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:52:49.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:52:49.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:52:49.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:52:49.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:52:52.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:52:52.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:52:52.185 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:52:52.185 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:52:52.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:52:52.207 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:52:52.208 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:52:52.209 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:52:52.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:52:52.209 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:52:52.210 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:52:52.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:52:52.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:52:52.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:52:52.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:52:52.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:52:52.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:52:52.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:52:52.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:52:52.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:52:52.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:52:52.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:52:52.530 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:52:52.601 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:52:27
2026-06-03T20:52:52.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87023, datetime.datetime(2026, 6, 3, 20, 52, 27), datetime.datetime(2026, 6, 3, 20, 52, 27), 'salt', 2.88, 100.25, None, 45.97, 122.67, -0.04, 821.97, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T20:52:52.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:52:52.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:52:52.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:52:27, diff=25.608335s, valid=True
2026-06-03T20:52:52.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:52:52.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:52:52.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:52:12, diff=40.61171s, valid=True
2026-06-03T20:52:52.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:52:52.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:52:52.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:52:27, diff=25.619547s, valid=True
2026-06-03T20:52:52.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:52:52.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:52:52.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:52:52.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:52:52.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:52:52.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:52:52.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:52:12, diff=40.623225s, valid=True
2026-06-03T20:52:52.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:52:52.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:52:52.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:52:52.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=86969.624009s, valid=True
2026-06-03T20:52:52.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:52:52.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:52:52.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:52:52.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:52:52.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:52:52.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:52:52.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:52:52.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:52:52.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:52:52.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:52:52.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:52:52.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:52:52.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:52:52.942 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:52:53.148 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:52:53.488 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:52:53.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:52:53.590 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:52:53.590 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:52:53.748 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:52:53.748 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:53:23.759 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:53:23.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:53:23.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:53:24.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:53:24.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:53:24.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:53:24.314 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:53:24.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:53:24.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:53:24.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:53:24.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:53:24.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:53:24.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:53:27.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:53:27.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:53:27.055 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:53:27.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:53:27.066 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:53:27.079 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:53:27.080 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:53:27.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:53:27.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:53:27.081 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:53:27.081 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:53:27.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:53:27.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T20:53:27.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:53:27.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T20:53:27.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:53:27.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:53:27.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:53:27.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:53:27.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:53:27.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:53:27.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:53:27.411 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:53:27.482 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:52:58
2026-06-03T20:53:27.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87024, datetime.datetime(2026, 6, 3, 20, 52, 58), datetime.datetime(2026, 6, 3, 20, 52, 57), 'salt', 2.85, 100.15, None, 46.4, 109.0, -0.02, 821.91, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T20:53:27.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:53:27.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T20:53:27.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:52:57, diff=30.489683s, valid=True
2026-06-03T20:53:27.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:53:27.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:53:27.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:53:12, diff=15.493201s, valid=True
2026-06-03T20:53:27.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:53:27.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T20:53:27.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:52:57, diff=30.501278s, valid=True
2026-06-03T20:53:27.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:53:27.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:53:27.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:53:27.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:53:27.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:53:27.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:53:27.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:53:12, diff=15.505017s, valid=True
2026-06-03T20:53:27.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:53:27.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:53:27.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:53:27.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87004.505825s, valid=True
2026-06-03T20:53:27.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:53:27.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:53:27.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:53:27.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:53:27.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:53:27.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:53:27.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:53:27.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:53:27.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:53:27.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:53:27.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:53:27.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:53:27.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:53:27.828 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:53:28.033 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:53:28.433 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:53:28.535 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:53:28.536 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:53:28.536 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:53:28.722 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:53:28.722 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:53:58.745 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:53:58.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:53:58.746 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:53:59.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:53:59.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:53:59.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:53:59.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:53:59.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:53:59.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:53:59.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:53:59.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:53:59.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:53:59.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:54:02.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:54:02.191 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:54:02.193 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:54:02.193 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:54:02.203 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:54:02.215 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:54:02.216 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:54:02.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:54:02.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:54:02.217 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:54:02.217 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:54:02.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:54:02.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:54:02.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:54:02.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:54:02.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:54:02.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:54:02.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:54:02.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:54:02.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:54:02.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:54:02.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:54:02.542 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:54:02.610 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:53:58
2026-06-03T20:54:02.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87026, datetime.datetime(2026, 6, 3, 20, 53, 58), datetime.datetime(2026, 6, 3, 20, 53, 57), 'salt', 2.88, 100.19, None, 45.16, 113.89, -0.03, 821.85, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T20:54:02.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:54:02.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:54:02.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:53:57, diff=5.61786s, valid=True
2026-06-03T20:54:02.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:54:02.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:54:02.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:54:12, diff=-9.378776s, valid=True
2026-06-03T20:54:02.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:54:02.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:54:02.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:53:52, diff=10.629005s, valid=True
2026-06-03T20:54:02.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:54:02.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:54:02.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:54:02.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:54:02.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:54:02.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:54:02.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:54:12, diff=-9.367391s, valid=True
2026-06-03T20:54:02.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:54:02.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:54:02.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:54:02.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87039.633392s, valid=True
2026-06-03T20:54:02.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:54:02.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:54:02.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:54:02.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:54:02.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:54:02.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:54:02.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:54:02.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:54:02.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:54:02.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:54:02.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:54:02.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:54:02.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:54:02.953 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:54:03.159 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:54:03.503 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:54:03.605 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:54:03.605 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:54:03.605 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:54:03.798 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:54:03.798 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:54:33.822 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:54:33.823 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:54:33.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:54:33.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:54:33.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:54:34.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:54:34.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:54:34.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:54:34.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:54:34.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:54:34.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:54:34.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:54:34.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:54:37.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:54:37.428 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:54:37.429 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:54:37.429 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:54:37.439 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:54:37.452 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:54:37.452 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:54:37.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:54:37.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:54:37.453 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:54:37.454 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:54:37.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:54:37.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:54:37.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:54:37.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:54:37.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:54:37.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:54:37.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:54:37.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:54:37.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:54:37.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:54:37.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:54:37.735 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:54:37.804 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:54:28
2026-06-03T20:54:37.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87027, datetime.datetime(2026, 6, 3, 20, 54, 28), datetime.datetime(2026, 6, 3, 20, 54, 28), 'salt', 2.68, 100.09, None, 49.43, 117.15, -0.02, 821.79, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T20:54:37.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:54:37.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:54:37.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:54:28, diff=9.810532s, valid=True
2026-06-03T20:54:37.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:54:37.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:54:37.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:54:12, diff=25.8134s, valid=True
2026-06-03T20:54:37.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:54:37.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:54:37.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:54:24, diff=13.820126s, valid=True
2026-06-03T20:54:37.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:54:37.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:54:37.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:54:37.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:54:37.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:54:37.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:54:37.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:54:12, diff=25.82329s, valid=True
2026-06-03T20:54:37.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:54:37.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:54:37.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:54:37.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87074.823964s, valid=True
2026-06-03T20:54:37.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:54:37.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:54:37.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:54:37.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:54:37.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:54:37.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:54:37.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:54:37.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:54:37.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:54:37.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:54:38.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:54:38.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:54:38.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:54:38.169 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:54:38.481 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:54:38.819 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:54:38.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:54:38.923 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:54:38.923 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:54:41.477 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:54:41.478 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:55:11.508 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:55:11.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:55:11.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:55:11.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:55:11.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:55:12.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:55:12.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:55:12.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:55:12.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:55:12.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:55:12.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:55:12.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:55:12.105 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:55:15.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:55:15.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:55:15.061 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:55:15.062 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:55:15.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:55:15.086 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:55:15.087 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:55:15.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:55:15.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:55:15.088 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:55:15.088 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:55:15.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:55:15.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:55:15.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:55:15.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:55:15.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:55:15.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:55:15.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:55:15.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:55:15.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:55:15.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:55:15.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:55:15.416 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:55:15.487 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:54:59
2026-06-03T20:55:15.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87028, datetime.datetime(2026, 6, 3, 20, 54, 59), datetime.datetime(2026, 6, 3, 20, 54, 58), 'salt', 2.82, 100.22, None, 51.58, 126.57, -0.03, 821.91, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T20:55:15.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:55:15.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:55:15.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:54:58, diff=17.494177s, valid=True
2026-06-03T20:55:15.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:55:15.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:55:15.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:55:12, diff=3.497724s, valid=True
2026-06-03T20:55:15.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:55:15.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:55:15.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:54:55, diff=20.505649s, valid=True
2026-06-03T20:55:15.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:55:15.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:55:15.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:55:15.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:55:15.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:55:15.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:55:15.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:55:12, diff=3.509122s, valid=True
2026-06-03T20:55:15.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:55:15.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:55:15.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:55:15.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87112.509856s, valid=True
2026-06-03T20:55:15.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:55:15.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:55:15.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:55:15.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:55:15.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:55:15.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:55:15.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:55:15.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:55:15.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:55:15.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:55:15.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:55:15.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:55:15.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:55:15.832 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:55:16.057 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:55:16.397 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:55:16.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:55:16.500 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:55:16.500 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:55:16.706 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:55:16.706 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:55:46.730 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:55:46.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:55:46.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:55:47.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:55:47.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:55:47.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:55:47.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:55:47.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:55:47.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:55:47.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:55:47.268 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:55:47.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:55:47.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:55:49.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:55:49.960 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:55:49.960 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:55:49.960 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:55:49.967 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:55:49.978 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:55:49.979 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:55:49.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:55:49.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:55:49.979 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:55:49.979 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:55:49.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:55:50.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:55:50.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:55:50.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:55:50.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:55:50.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:55:50.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:55:50.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:55:50.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:55:50.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:55:50.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:55:50.253 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:55:50.322 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:55:29
2026-06-03T20:55:50.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87029, datetime.datetime(2026, 6, 3, 20, 55, 29), datetime.datetime(2026, 6, 3, 20, 55, 28), 'salt', 2.85, 100.12, None, 42.09, 116.35, -0.02, 821.97, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T20:55:50.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:55:50.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:55:50.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:55:28, diff=22.329084s, valid=True
2026-06-03T20:55:50.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:55:50.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:55:50.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:55:12, diff=38.332139s, valid=True
2026-06-03T20:55:50.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:55:50.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:55:50.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:55:29, diff=21.339291s, valid=True
2026-06-03T20:55:50.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:55:50.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:55:50.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:55:50.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:55:50.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:55:50.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:55:50.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:55:12, diff=38.342557s, valid=True
2026-06-03T20:55:50.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:55:50.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:55:50.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:55:50.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87147.343272s, valid=True
2026-06-03T20:55:50.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:55:50.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:55:50.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:55:50.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:55:50.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:55:50.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:55:50.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:55:50.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:55:50.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:55:50.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:55:50.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:55:50.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:55:50.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:55:50.731 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:55:50.936 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:55:51.279 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:55:51.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:55:51.382 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:55:51.382 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:55:51.475 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:55:51.650 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:56:21.678 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:56:21.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:56:21.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:56:21.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:56:21.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:56:22.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:56:22.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:56:22.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:56:22.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:56:22.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:56:22.144 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:56:22.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:56:22.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:56:24.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:56:24.849 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:56:24.850 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:56:24.850 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:56:24.861 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:56:24.874 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:56:24.874 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:56:24.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:56:24.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:56:24.875 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:56:24.876 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:56:24.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:56:25.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:56:25.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:56:25.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:56:25.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:56:25.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:56:25.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:56:25.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:56:25.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:56:25.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:56:25.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:56:25.219 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:56:25.290 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:55:59
2026-06-03T20:56:25.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87030, datetime.datetime(2026, 6, 3, 20, 55, 59), datetime.datetime(2026, 6, 3, 20, 55, 58), 'salt', 2.85, 100.19, None, 49.47, 110.41, -0.03, 821.66, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T20:56:25.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:56:25.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:56:25.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:55:58, diff=27.298377s, valid=True
2026-06-03T20:56:25.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:56:25.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:56:25.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:56:12, diff=13.301887s, valid=True
2026-06-03T20:56:25.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:56:25.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:56:25.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:55:58, diff=27.310109s, valid=True
2026-06-03T20:56:25.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:56:25.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:56:25.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:56:25.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:56:25.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:56:25.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:56:25.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:56:12, diff=13.313858s, valid=True
2026-06-03T20:56:25.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:56:25.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:56:25.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:56:25.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87182.314674s, valid=True
2026-06-03T20:56:25.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:56:25.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:56:25.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:56:25.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:56:25.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:56:25.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:56:25.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:56:25.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:56:25.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:56:25.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:56:25.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:56:25.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:56:25.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:56:25.635 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:56:25.842 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:56:26.183 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:56:26.285 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:56:26.285 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:56:26.285 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:56:26.502 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:56:26.503 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:56:56.503 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:56:56.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:56:56.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:56:56.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:56:56.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:56:56.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:56:56.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:56:56.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:56:56.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:56:56.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:56:56.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:56:56.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:56:56.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:56:59.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:56:59.901 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:56:59.902 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:56:59.902 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:56:59.911 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:56:59.923 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:56:59.924 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:56:59.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:56:59.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:56:59.924 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:56:59.925 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:56:59.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:57:00.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:57:00.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:57:00.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:57:00.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:57:00.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:57:00.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:57:00.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:57:00.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:57:00.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:57:00.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:57:00.206 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:57:00.277 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:57:00
2026-06-03T20:57:00.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87032, datetime.datetime(2026, 6, 3, 20, 57), datetime.datetime(2026, 6, 3, 20, 56, 59), 'salt', 2.75, 100.12, None, 52.25, 115.91, -0.02, 821.85, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:57:00.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:57:00.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:57:00.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:56:59, diff=1.284507s, valid=True
2026-06-03T20:57:00.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:57:00.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:57:00.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:57:12, diff=-11.71222s, valid=True
2026-06-03T20:57:00.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:57:00.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:57:00.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:56:50, diff=10.295407s, valid=True
2026-06-03T20:57:00.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:57:00.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:57:00.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:57:00.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:57:00.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:57:00.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:57:00.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:57:12, diff=-11.70119s, valid=True
2026-06-03T20:57:00.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:57:00.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:57:00.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:57:00.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87217.299558s, valid=True
2026-06-03T20:57:00.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:57:00.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:57:00.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:57:00.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:57:00.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:57:00.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:57:00.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:57:00.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:57:00.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:57:00.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:57:00.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:57:00.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:57:00.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:57:00.690 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:57:00.913 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:57:01.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:57:01.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:57:01.357 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:57:01.357 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:57:01.555 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:57:01.555 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:57:31.585 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:57:31.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:57:31.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:57:31.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:57:31.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:57:32.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:57:32.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:57:32.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:57:32.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:57:32.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:57:32.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:57:32.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:57:32.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:57:34.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:57:34.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:57:34.856 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:57:34.856 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:57:34.866 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:57:34.879 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:57:34.879 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:57:34.880 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:57:34.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:57:34.881 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:57:34.881 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:57:34.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:57:35.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:57:35.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:57:35.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:57:35.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:57:35.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:57:35.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:57:35.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:57:35.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:57:35.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:57:35.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:57:35.216 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:57:35.287 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:57:30
2026-06-03T20:57:35.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87033, datetime.datetime(2026, 6, 3, 20, 57, 30), datetime.datetime(2026, 6, 3, 20, 57, 29), 'salt', 2.72, 100.12, None, 51.76, 115.79, -0.02, 821.79, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T20:57:35.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:57:35.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:57:35.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:57:29, diff=6.295106s, valid=True
2026-06-03T20:57:35.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:57:35.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:57:35.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:57:12, diff=23.29867s, valid=True
2026-06-03T20:57:35.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:57:35.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:57:35.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:57:30, diff=5.306706s, valid=True
2026-06-03T20:57:35.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:57:35.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:57:35.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:57:35.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:57:35.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:57:35.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:57:35.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:57:12, diff=23.310415s, valid=True
2026-06-03T20:57:35.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:57:35.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:57:35.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:57:35.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87252.311233s, valid=True
2026-06-03T20:57:35.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:57:35.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:57:35.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:57:35.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:57:35.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:57:35.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:57:35.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:57:35.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:57:35.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:57:35.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:57:35.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:57:35.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:57:35.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:57:35.631 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:57:35.836 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:57:36.175 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:57:36.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:57:36.280 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:57:36.280 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:57:36.553 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:57:36.553 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:58:06.583 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:58:06.584 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:58:06.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:58:06.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:58:06.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:58:06.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:58:06.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:58:06.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:58:06.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:58:07.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:58:07.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:58:07.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:58:07.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:58:09.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:58:09.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:58:09.701 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:58:09.701 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:58:09.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:58:09.725 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:58:09.725 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:58:09.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:58:09.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:58:09.726 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:58:09.726 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:58:09.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:58:09.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:58:09.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:58:09.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:58:09.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:58:09.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:58:09.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:58:10.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:58:10.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:58:10.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:58:10.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:58:10.031 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:58:10.100 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:58:00
2026-06-03T20:58:10.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87034, datetime.datetime(2026, 6, 3, 20, 58), datetime.datetime(2026, 6, 3, 20, 57, 59), 'salt', 2.68, 100.09, None, 45.97, 113.21, -0.02, 822.03, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T20:58:10.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:58:10.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:58:10.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:57:59, diff=11.10696s, valid=True
2026-06-03T20:58:10.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:58:10.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:58:10.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:58:12, diff=-1.889769s, valid=True
2026-06-03T20:58:10.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:58:10.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:58:10.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:57:53, diff=17.117719s, valid=True
2026-06-03T20:58:10.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:58:10.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:58:10.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:58:10.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:58:10.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:58:10.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:58:10.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:58:12, diff=-1.878828s, valid=True
2026-06-03T20:58:10.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:58:10.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:58:10.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:58:10.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87287.121949s, valid=True
2026-06-03T20:58:10.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:58:10.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:58:10.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:58:10.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:58:10.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:58:10.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:58:10.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:58:10.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:58:10.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:58:10.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:58:10.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:58:10.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:58:10.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:58:10.506 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:58:10.712 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:58:11.061 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:58:11.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:58:11.167 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:58:11.167 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:58:11.413 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:58:11.413 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:58:41.438 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:58:41.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:58:41.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:58:41.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:58:41.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:58:42.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:58:42.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:58:42.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:58:42.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:58:42.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:58:42.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:58:42.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:58:42.034 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:58:44.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:58:44.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:58:44.637 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:58:44.637 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:58:44.647 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:58:44.660 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:58:44.661 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:58:44.661 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:58:44.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:58:44.662 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:58:44.662 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:58:44.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:58:44.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:58:44.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:58:44.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:58:44.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:58:44.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:58:44.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:58:44.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:58:44.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:58:44.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:58:44.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:58:44.998 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:58:45.071 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:58:30
2026-06-03T20:58:45.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87035, datetime.datetime(2026, 6, 3, 20, 58, 30), datetime.datetime(2026, 6, 3, 20, 58, 30), 'salt', 2.72, 100.12, None, 44.53, 112.81, -0.02, 821.91, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T20:58:45.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:58:45.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:58:45.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:58:30, diff=15.078835s, valid=True
2026-06-03T20:58:45.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:58:45.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:58:45.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:58:12, diff=33.082274s, valid=True
2026-06-03T20:58:45.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:58:45.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:58:45.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:58:24, diff=21.09031s, valid=True
2026-06-03T20:58:45.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:58:45.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:58:45.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:58:45.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:58:45.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:58:45.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:58:45.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:58:12, diff=33.094075s, valid=True
2026-06-03T20:58:45.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:58:45.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:58:45.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:58:45.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87322.094876s, valid=True
2026-06-03T20:58:45.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:58:45.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:58:45.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:58:45.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:58:45.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:58:45.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:58:45.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:58:45.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:58:45.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:58:45.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:58:45.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:58:45.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:58:45.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:58:45.415 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:58:45.621 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:58:45.959 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:58:46.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:58:46.062 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:58:46.062 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:58:46.331 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:58:46.332 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:59:16.362 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:59:16.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:59:16.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:59:16.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:59:16.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:59:17.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:59:17.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:59:17.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:59:17.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:59:17.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:59:17.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:59:17.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:59:17.034 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:59:19.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:59:19.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:59:19.701 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:59:19.701 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:59:19.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:59:19.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:59:19.729 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:59:19.729 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:59:19.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:59:19.730 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:59:19.730 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:59:19.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:59:19.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:59:19.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:59:19.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:59:19.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:59:20.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:59:20.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:59:20.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:59:20.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:59:20.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:59:20.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:59:20.079 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:59:20.153 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:59:01
2026-06-03T20:59:20.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87036, datetime.datetime(2026, 6, 3, 20, 59, 1), datetime.datetime(2026, 6, 3, 20, 59), 'salt', 2.75, 100.12, None, 44.49, 108.67, -0.02, 821.91, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T20:59:20.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:59:20.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:59:20.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:59:00, diff=20.160429s, valid=True
2026-06-03T20:59:20.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:59:20.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:59:20.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:59:12, diff=8.163626s, valid=True
2026-06-03T20:59:20.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:59:20.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:59:20.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:58:56, diff=24.170909s, valid=True
2026-06-03T20:59:20.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:59:20.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:59:20.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:59:20.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:59:20.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:59:20.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:59:20.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:59:12, diff=8.174249s, valid=True
2026-06-03T20:59:20.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:59:20.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:59:20.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:59:20.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87357.174968s, valid=True
2026-06-03T20:59:20.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:59:20.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:59:20.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:59:20.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:59:20.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:59:20.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:59:20.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:59:20.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:59:20.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:59:20.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:59:20.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:59:20.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:59:20.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:59:20.492 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:59:20.700 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:59:21.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:59:21.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:59:21.146 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:59:21.146 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:59:21.299 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:59:21.300 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T20:59:51.327 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T20:59:51.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T20:59:51.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T20:59:51.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T20:59:51.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T20:59:51.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T20:59:51.671 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T20:59:51.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T20:59:51.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T20:59:51.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T20:59:51.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T20:59:51.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T20:59:51.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T20:59:54.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T20:59:54.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T20:59:54.368 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T20:59:54.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T20:59:54.378 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T20:59:54.391 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T20:59:54.391 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T20:59:54.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T20:59:54.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T20:59:54.393 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T20:59:54.393 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T20:59:54.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T20:59:54.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T20:59:54.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T20:59:54.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T20:59:54.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:59:54.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:59:54.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T20:59:54.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T20:59:54.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T20:59:54.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T20:59:54.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T20:59:54.687 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T20:59:54.756 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 20:59:31
2026-06-03T20:59:54.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87037, datetime.datetime(2026, 6, 3, 20, 59, 31), datetime.datetime(2026, 6, 3, 20, 59, 30), 'salt', 2.72, 100.19, None, 50.14, 110.95, -0.02, 821.85, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T20:59:54.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T20:59:54.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T20:59:54.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:59:30, diff=24.763288s, valid=True
2026-06-03T20:59:54.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T20:59:54.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:59:54.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:59:12, diff=42.766533s, valid=True
2026-06-03T20:59:54.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T20:59:54.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T20:59:54.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:59:28, diff=26.774176s, valid=True
2026-06-03T20:59:54.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T20:59:54.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:59:54.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T20:59:54.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T20:59:54.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T20:59:54.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T20:59:54.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 20:59:12, diff=42.777598s, valid=True
2026-06-03T20:59:54.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T20:59:54.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T20:59:54.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T20:59:54.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87391.778342s, valid=True
2026-06-03T20:59:54.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T20:59:54.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T20:59:54.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T20:59:54.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T20:59:54.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T20:59:54.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T20:59:54.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T20:59:54.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T20:59:54.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T20:59:54.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T20:59:54.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T20:59:55.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T20:59:55.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T20:59:55.097 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T20:59:55.303 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:59:55.641 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T20:59:55.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T20:59:55.745 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T20:59:55.745 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T20:59:56.023 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T20:59:56.023 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:00:26.053 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:00:26.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:00:26.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:00:26.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:00:26.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:00:27.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:00:27.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:00:27.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:00:27.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:00:27.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:00:27.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:00:27.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:00:27.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:00:29.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:00:29.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:00:29.816 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:00:29.816 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:00:29.830 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:00:29.842 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:00:29.843 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:00:29.843 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:00:29.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:00:29.843 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:00:29.843 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:00:29.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:00:29.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T21:00:29.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:00:30.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T21:00:30.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:00:30.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:00:30.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:00:30.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:00:30.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:00:30.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:00:30.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:00:30.132 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:00:30.203 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:00:01
2026-06-03T21:00:30.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87038, datetime.datetime(2026, 6, 3, 21, 0, 1), datetime.datetime(2026, 6, 3, 21, 0), 'salt', 2.65, 100.09, None, 54.9, 115.02, -0.01, 821.6, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:00:30.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:00:30.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T21:00:30.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:00:00, diff=30.209592s, valid=True
2026-06-03T21:00:30.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:00:30.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:00:30.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:00:12, diff=18.212652s, valid=True
2026-06-03T21:00:30.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:00:30.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T21:00:30.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:00:01, diff=29.219824s, valid=True
2026-06-03T21:00:30.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:00:30.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:00:30.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:00:30.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:00:30.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:00:30.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:00:30.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:00:12, diff=18.22311s, valid=True
2026-06-03T21:00:30.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:00:30.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:00:30.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:00:30.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87427.223831s, valid=True
2026-06-03T21:00:30.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:00:30.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:00:30.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:00:30.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:00:30.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:00:30.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:00:30.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:00:30.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:00:30.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:00:30.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:00:30.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:00:30.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:00:30.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:00:30.542 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:00:30.772 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:00:31.115 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:00:31.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:00:31.218 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:00:31.218 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:00:31.408 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:00:31.409 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:01:01.418 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:01:01.418 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:01:01.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:01:01.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:01:01.587 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:01:01.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:01:01.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:01:01.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:01:01.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:01:01.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:01:01.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:01:01.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:01:01.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:01:04.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:01:04.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:01:04.674 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:01:04.675 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:01:04.685 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:01:04.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:01:04.698 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:01:04.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:01:04.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:01:04.699 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:01:04.699 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:01:04.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:01:04.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:01:04.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:01:04.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:01:04.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:01:04.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T21:01:04.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:01:05.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T21:01:05.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:01:05.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:01:05.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:01:05.041 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:01:05.111 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:01:01
2026-06-03T21:01:05.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87040, datetime.datetime(2026, 6, 3, 21, 1, 1), datetime.datetime(2026, 6, 3, 21, 1, 1), 'salt', 2.68, 100.09, None, 37.51, 113.14, -0.02, 821.97, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T21:01:05.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:01:05.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:01:05.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:01:01, diff=4.119408s, valid=True
2026-06-03T21:01:05.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:01:05.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T21:01:05.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:00:12, diff=53.122896s, valid=True
2026-06-03T21:01:05.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:01:05.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:01:05.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:00:52, diff=13.131121s, valid=True
2026-06-03T21:01:05.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:01:05.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:01:05.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:01:05.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:01:05.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:01:05.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T21:01:05.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:00:12, diff=53.134835s, valid=True
2026-06-03T21:01:05.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:01:05.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:01:05.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:01:05.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87462.135648s, valid=True
2026-06-03T21:01:05.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:01:05.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:01:05.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:01:05.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:01:05.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:01:05.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:01:05.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:01:05.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:01:05.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:01:05.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:01:05.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:01:05.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:01:05.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:01:05.458 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:01:05.665 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:01:06.121 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:01:06.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:01:06.224 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:01:06.224 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:01:06.418 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:01:06.419 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:01:36.449 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:01:36.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:01:36.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:01:36.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:01:36.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:01:37.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:01:37.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:01:37.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:01:37.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:01:37.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:01:37.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:01:37.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:01:37.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:01:39.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:01:39.667 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:01:39.668 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:01:39.668 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:01:39.679 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:01:39.692 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:01:39.693 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:01:39.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:01:39.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:01:39.694 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:01:39.694 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:01:39.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:01:39.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:01:39.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:01:39.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:01:39.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:01:39.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T21:01:39.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:01:40.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T21:01:40.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:01:40.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:01:40.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:01:40.029 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:01:40.101 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:01:32
2026-06-03T21:01:40.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87041, datetime.datetime(2026, 6, 3, 21, 1, 32), datetime.datetime(2026, 6, 3, 21, 1, 31), 'salt', 2.82, 100.12, None, 38.39, 119.53, -0.02, 822.03, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T21:01:40.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:01:40.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:01:40.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:01:31, diff=9.108481s, valid=True
2026-06-03T21:01:40.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:01:40.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T21:01:40.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:00:12, diff=88.111977s, valid=True
2026-06-03T21:01:40.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:01:40.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:01:40.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:01:32, diff=8.120767s, valid=True
2026-06-03T21:01:40.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:01:40.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:01:40.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:01:40.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:01:40.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:01:40.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T21:01:40.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:00:12, diff=88.126115s, valid=True
2026-06-03T21:01:40.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:01:40.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:01:40.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:01:40.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87497.127159s, valid=True
2026-06-03T21:01:40.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:01:40.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:01:40.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:01:40.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:01:40.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:01:40.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:01:40.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:01:40.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:01:40.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:01:40.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:01:40.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:01:40.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:01:40.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:01:40.465 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:01:40.675 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:01:41.031 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:01:41.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:01:41.157 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:01:41.157 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:01:41.630 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:01:41.631 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:02:11.660 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:02:11.661 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:02:11.661 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:02:12.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:02:12.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:02:12.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:02:12.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:02:12.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:02:12.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:02:12.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:02:12.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:02:12.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:02:12.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:02:15.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:02:15.213 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:02:15.214 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:02:15.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:02:15.224 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:02:15.236 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:02:15.237 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:02:15.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:02:15.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:02:15.238 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:02:15.238 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:02:15.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:02:15.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:02:15.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:02:15.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:02:15.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:02:15.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T21:02:15.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:02:15.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T21:02:15.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:02:15.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:02:15.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:02:15.584 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:02:15.654 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:02:02
2026-06-03T21:02:15.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87042, datetime.datetime(2026, 6, 3, 21, 2, 2), datetime.datetime(2026, 6, 3, 21, 2, 2), 'salt', 2.85, 100.12, None, 42.94, 121.1, -0.02, 821.97, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:02:15.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:02:15.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:02:15.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:02:02, diff=13.661431s, valid=True
2026-06-03T21:02:15.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:02:15.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T21:02:15.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:00:12, diff=123.664823s, valid=True
2026-06-03T21:02:15.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:02:15.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:02:15.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:02:02, diff=13.672683s, valid=True
2026-06-03T21:02:15.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:02:15.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:02:15.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:02:15.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:02:15.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:02:15.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T21:02:15.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:00:12, diff=123.676345s, valid=True
2026-06-03T21:02:15.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:02:15.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:02:15.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:02:15.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87532.67714s, valid=True
2026-06-03T21:02:15.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:02:15.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:02:15.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:02:15.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:02:15.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:02:15.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:02:15.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:02:15.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:02:15.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:02:15.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:02:15.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:02:15.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:02:16.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:02:16.073 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:02:16.281 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:02:16.625 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:02:16.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:02:16.730 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:02:16.730 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:02:16.923 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:02:16.924 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:02:46.954 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:02:46.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:02:46.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:02:47.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:02:47.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:02:47.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:02:47.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:02:47.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:02:47.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:02:47.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:02:47.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:02:47.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:02:47.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:02:50.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:02:50.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:02:50.128 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:02:50.128 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:02:50.134 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:02:50.146 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:02:50.146 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:02:50.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:02:50.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:02:50.146 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:02:50.146 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:02:50.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:02:50.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:02:50.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:02:50.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:02:50.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:02:50.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T21:02:50.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:02:50.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T21:02:50.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:02:50.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:02:50.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:02:50.475 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:02:50.546 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:02:33
2026-06-03T21:02:50.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87043, datetime.datetime(2026, 6, 3, 21, 2, 33), datetime.datetime(2026, 6, 3, 21, 2, 32), 'salt', 2.78, 100.12, None, 44.46, 100.6, -0.02, 821.91, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:02:50.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:02:50.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:02:50.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:02:32, diff=18.553294s, valid=True
2026-06-03T21:02:50.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:02:50.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T21:02:50.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:00:12, diff=158.55676s, valid=True
2026-06-03T21:02:50.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:02:50.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:02:50.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:02:32, diff=18.564906s, valid=True
2026-06-03T21:02:50.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:02:50.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:02:50.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:02:50.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:02:50.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:02:50.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T21:02:50.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:00:12, diff=158.568601s, valid=True
2026-06-03T21:02:50.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:02:50.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:02:50.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:02:50.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87567.569408s, valid=True
2026-06-03T21:02:50.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:02:50.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:02:50.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:02:50.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:02:50.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:02:50.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:02:50.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:02:50.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:02:50.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:02:50.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:02:50.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:02:50.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:02:50.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:02:50.889 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:02:51.094 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:02:51.438 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:02:51.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:02:51.539 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:02:51.539 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:02:51.823 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:02:51.824 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:03:21.854 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:03:21.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:03:21.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:03:22.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:03:22.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:03:22.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:03:22.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:03:22.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:03:22.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:03:22.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:03:22.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:03:22.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:03:22.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:03:25.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:03:25.151 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:03:25.152 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:03:25.152 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:03:25.163 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:03:25.176 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:03:25.176 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:03:25.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:03:25.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:03:25.177 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:03:25.178 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:03:25.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:03:25.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:03:25.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:03:25.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:03:25.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:03:25.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:03:25.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:03:25.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:03:25.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:03:25.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:03:25.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:03:25.524 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:03:25.596 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:03:03
2026-06-03T21:03:25.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87044, datetime.datetime(2026, 6, 3, 21, 3, 3), datetime.datetime(2026, 6, 3, 21, 3, 2), 'salt', 2.75, 100.19, None, 50.31, 135.61, -0.03, 821.91, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:03:25.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:03:25.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:03:25.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:03:02, diff=23.604114s, valid=True
2026-06-03T21:03:25.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:03:25.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:03:25.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:00:12, diff=193.607633s, valid=True
2026-06-03T21:03:25.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:03:25.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:03:25.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:03:02, diff=23.615735s, valid=True
2026-06-03T21:03:25.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:03:25.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:03:25.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:03:25.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:03:25.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:03:25.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:03:25.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:00:12, diff=193.619417s, valid=True
2026-06-03T21:03:25.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:03:25.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:03:25.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:03:25.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87602.620232s, valid=True
2026-06-03T21:03:25.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:03:25.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:03:25.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:03:25.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:03:25.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:03:25.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:03:25.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:03:25.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:03:25.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:03:25.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:03:25.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:03:25.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:03:25.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:03:26.011 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:03:26.216 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:03:26.557 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:03:26.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:03:26.660 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:03:26.660 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:03:26.848 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:03:26.848 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:03:56.872 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:03:56.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:03:56.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:03:57.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:03:57.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:03:57.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:03:57.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:03:57.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:03:57.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:03:57.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:03:57.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:03:57.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:03:57.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:04:00.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:04:00.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:04:00.009 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:04:00.009 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:04:00.019 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:04:00.030 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:04:00.031 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:04:00.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:04:00.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:04:00.031 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:04:00.031 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:04:00.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:04:00.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:04:00.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:04:00.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:04:00.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:04:00.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:04:00.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:04:00.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:04:00.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:04:00.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:04:00.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:04:00.327 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:04:00.397 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:03:33
2026-06-03T21:04:00.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87045, datetime.datetime(2026, 6, 3, 21, 3, 33), datetime.datetime(2026, 6, 3, 21, 3, 32), 'salt', 2.52, 99.99, None, 52.46, 119.99, 0.0, 821.85, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:04:00.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:04:00.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:04:00.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:03:32, diff=28.403755s, valid=True
2026-06-03T21:04:00.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:04:00.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:04:00.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:00:12, diff=228.406976s, valid=True
2026-06-03T21:04:00.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:04:00.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:04:00.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:03:33, diff=27.416262s, valid=True
2026-06-03T21:04:00.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:04:00.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:04:00.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:04:00.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:04:00.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:04:00.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:04:00.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:00:12, diff=228.424085s, valid=True
2026-06-03T21:04:00.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:04:00.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:04:00.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:04:00.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87637.42566s, valid=True
2026-06-03T21:04:00.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:04:00.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:04:00.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:04:00.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:04:00.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:04:00.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:04:00.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:04:00.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:04:00.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:04:00.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:04:00.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:04:00.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:04:00.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:04:00.743 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:04:00.948 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:04:01.293 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:04:01.395 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:04:01.395 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:04:01.395 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:04:01.654 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:04:01.654 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:04:31.684 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:04:31.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:04:31.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:04:31.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:04:31.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:04:32.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:04:32.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:04:32.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:04:32.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:04:32.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:04:32.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:04:32.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:04:32.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:04:34.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:04:34.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:04:34.771 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:04:34.771 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:04:34.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:04:34.794 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:04:34.795 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:04:34.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:04:34.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:04:34.796 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:04:34.796 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:04:34.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:04:34.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:04:34.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:04:35.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:04:35.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:04:35.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:04:35.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:04:35.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:04:35.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:04:35.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:04:35.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:04:35.131 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:04:35.208 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:04:33
2026-06-03T21:04:35.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87047, datetime.datetime(2026, 6, 3, 21, 4, 33), datetime.datetime(2026, 6, 3, 21, 4, 33), 'salt', 2.62, 100.12, None, 44.77, 113.84, -0.02, 821.97, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:04:35.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:04:35.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:04:35.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:04:33, diff=2.215344s, valid=True
2026-06-03T21:04:35.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:04:35.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:04:35.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:05:12, diff=-36.781192s, valid=True
2026-06-03T21:04:35.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:04:35.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:04:35.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:04:33, diff=2.226905s, valid=True
2026-06-03T21:04:35.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:04:35.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:04:35.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:04:35.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:04:35.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:04:35.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:04:35.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:05:12, diff=-36.769406s, valid=True
2026-06-03T21:04:35.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:04:35.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:04:35.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:04:35.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87672.231407s, valid=True
2026-06-03T21:04:35.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:04:35.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:04:35.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:04:35.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:04:35.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:04:35.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:04:35.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:04:35.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:04:35.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:04:35.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:04:35.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:04:35.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:04:35.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:04:35.625 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:04:35.847 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:04:36.189 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:04:36.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:04:36.291 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:04:36.291 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:04:36.476 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:04:36.476 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:05:06.506 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:05:06.506 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:05:06.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:05:06.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:05:06.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:05:06.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:05:06.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:05:06.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:05:06.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:05:06.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:05:06.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:05:06.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:05:06.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:05:09.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:05:09.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:05:09.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:05:09.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:05:09.732 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:05:09.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:05:09.745 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:05:09.746 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:05:09.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:05:09.746 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:05:09.746 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:05:09.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:05:09.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:05:09.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:05:09.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:05:09.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:05:10.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:05:10.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:05:10.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:05:10.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:05:10.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:05:10.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:05:10.050 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:05:10.120 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:05:04
2026-06-03T21:05:10.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87048, datetime.datetime(2026, 6, 3, 21, 5, 4), datetime.datetime(2026, 6, 3, 21, 5, 3), 'salt', 2.45, 100.02, None, 47.98, 119.88, -0.01, 821.91, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:05:10.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:05:10.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:05:10.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:05:03, diff=7.12657s, valid=True
2026-06-03T21:05:10.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:05:10.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:05:10.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:05:12, diff=-1.870002s, valid=True
2026-06-03T21:05:10.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:05:10.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:05:10.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:04:54, diff=16.13731s, valid=True
2026-06-03T21:05:10.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:05:10.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:05:10.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:05:10.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:05:10.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:05:10.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:05:10.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:05:12, diff=-1.859584s, valid=True
2026-06-03T21:05:10.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:05:10.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:05:10.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:05:10.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87707.141085s, valid=True
2026-06-03T21:05:10.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:05:10.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:05:10.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:05:10.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:05:10.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:05:10.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:05:10.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:05:10.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:05:10.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:05:10.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:05:10.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:05:10.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:05:10.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:05:10.461 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:05:10.670 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:05:11.012 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:05:11.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:05:11.119 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:05:11.119 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:05:11.306 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:05:11.306 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:05:41.336 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:05:41.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:05:41.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:05:41.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:05:41.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:05:41.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:05:41.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:05:41.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:05:41.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:05:41.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:05:41.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:05:41.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:05:41.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:05:44.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:05:44.811 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:05:44.813 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:05:44.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:05:44.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:05:44.836 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:05:44.837 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:05:44.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:05:44.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:05:44.838 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:05:44.838 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:05:44.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:05:44.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:05:44.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:05:45.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:05:45.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:05:45.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:05:45.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:05:45.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:05:45.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:05:45.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:05:45.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:05:45.174 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:05:45.243 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:05:34
2026-06-03T21:05:45.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87049, datetime.datetime(2026, 6, 3, 21, 5, 34), datetime.datetime(2026, 6, 3, 21, 5, 33), 'salt', 2.48, 100.06, None, 55.75, 121.73, -0.01, 821.91, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:05:45.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:05:45.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:05:45.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:05:33, diff=12.248997s, valid=True
2026-06-03T21:05:45.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:05:45.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:05:45.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:06:12, diff=-26.748226s, valid=True
2026-06-03T21:05:45.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:05:45.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:05:45.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:05:25, diff=20.259228s, valid=True
2026-06-03T21:05:45.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:05:45.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:05:45.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:05:45.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:05:45.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:05:45.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:05:45.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:06:12, diff=-26.737251s, valid=True
2026-06-03T21:05:45.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:05:45.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:05:45.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:05:45.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87742.263484s, valid=True
2026-06-03T21:05:45.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:05:45.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:05:45.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:05:45.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:05:45.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:05:45.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:05:45.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:05:45.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:05:45.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:05:45.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:05:45.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:05:45.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:05:45.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:05:45.584 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:05:45.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:05:46.129 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:05:46.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:05:46.231 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:05:46.231 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:05:46.424 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:05:46.424 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:06:16.454 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:06:16.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:06:16.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:06:16.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:06:16.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:06:16.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:06:16.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:06:16.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:06:16.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:06:16.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:06:16.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:06:16.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:06:16.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:06:19.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:06:19.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:06:19.840 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:06:19.840 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:06:19.851 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:06:19.863 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:06:19.863 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:06:19.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:06:19.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:06:19.864 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:06:19.864 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:06:19.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:06:19.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:06:19.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:06:20.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:06:20.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:06:20.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:06:20.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:06:20.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:06:20.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:06:20.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:06:20.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:06:20.140 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:06:20.213 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:06:04
2026-06-03T21:06:20.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87050, datetime.datetime(2026, 6, 3, 21, 6, 4), datetime.datetime(2026, 6, 3, 21, 6, 3), 'salt', 2.48, 100.06, None, 47.98, 125.61, -0.01, 821.91, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:06:20.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:06:20.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:06:20.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:06:03, diff=17.220632s, valid=True
2026-06-03T21:06:20.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:06:20.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:06:20.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:06:12, diff=8.22386s, valid=True
2026-06-03T21:06:20.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:06:20.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:06:20.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:05:57, diff=23.231353s, valid=True
2026-06-03T21:06:20.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:06:20.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:06:20.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:06:20.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:06:20.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:06:20.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:06:20.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:06:12, diff=8.234797s, valid=True
2026-06-03T21:06:20.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:06:20.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:06:20.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:06:20.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87777.235534s, valid=True
2026-06-03T21:06:20.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:06:20.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:06:20.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:06:20.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:06:20.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:06:20.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:06:20.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:06:20.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:06:20.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:06:20.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:06:20.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:06:20.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:06:20.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:06:20.553 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:06:20.758 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:06:21.155 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:06:21.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:06:21.258 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:06:21.258 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:06:21.449 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:06:21.449 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:06:51.479 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:06:51.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:06:51.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:06:51.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:06:51.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:06:51.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:06:51.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:06:51.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:06:51.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:06:51.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:06:51.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:06:51.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:06:51.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:06:55.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:06:55.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:06:55.096 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:06:55.096 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:06:55.104 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:06:55.118 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:06:55.119 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:06:55.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:06:55.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:06:55.120 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:06:55.120 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:06:55.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:06:55.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:06:55.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:06:55.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:06:55.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:06:55.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:06:55.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:06:55.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:06:55.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:06:55.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:06:55.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:06:55.457 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:06:55.529 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:06:35
2026-06-03T21:06:55.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87051, datetime.datetime(2026, 6, 3, 21, 6, 35), datetime.datetime(2026, 6, 3, 21, 6, 34), 'salt', 2.52, 100.09, None, 46.11, 124.03, -0.01, 822.03, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:06:55.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:06:55.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:06:55.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:06:34, diff=21.536788s, valid=True
2026-06-03T21:06:55.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:06:55.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:06:55.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:07:12, diff=-16.459754s, valid=True
2026-06-03T21:06:55.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:06:55.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:06:55.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:06:28, diff=27.54843s, valid=True
2026-06-03T21:06:55.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:06:55.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:06:55.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:06:55.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:06:55.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:06:55.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:06:55.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:07:12, diff=-16.447873s, valid=True
2026-06-03T21:06:55.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:06:55.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:06:55.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:06:55.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87812.552935s, valid=True
2026-06-03T21:06:55.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:06:55.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:06:55.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:06:55.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:06:55.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:06:55.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:06:55.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:06:55.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:06:55.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:06:55.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:06:55.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:06:55.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:06:55.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:06:55.873 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:06:56.079 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:06:56.425 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:06:56.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:06:56.527 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:06:56.527 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:06:56.720 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:06:56.721 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:07:26.727 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:07:26.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:07:26.728 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:07:27.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:07:27.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:07:27.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:07:27.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:07:27.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:07:27.310 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:07:27.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:07:27.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:07:27.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:07:27.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:07:30.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:07:30.027 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:07:30.027 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:07:30.027 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:07:30.036 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:07:30.048 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:07:30.049 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:07:30.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:07:30.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:07:30.049 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:07:30.049 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:07:30.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:07:30.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:07:30.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:07:30.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:07:30.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:07:30.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:07:30.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:07:30.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:07:30.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:07:30.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:07:30.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:07:30.333 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:07:30.403 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:07:05
2026-06-03T21:07:30.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87052, datetime.datetime(2026, 6, 3, 21, 7, 5), datetime.datetime(2026, 6, 3, 21, 7, 4), 'salt', 2.58, 100.16, None, 52.25, 124.1, -0.03, 821.85, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:07:30.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:07:30.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:07:30.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:07:04, diff=26.410362s, valid=True
2026-06-03T21:07:30.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:07:30.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:07:30.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:07:12, diff=18.413528s, valid=True
2026-06-03T21:07:30.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:07:30.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:07:30.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:07:05, diff=25.42097s, valid=True
2026-06-03T21:07:30.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:07:30.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:07:30.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:07:30.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:07:30.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:07:30.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:07:30.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:07:12, diff=18.424437s, valid=True
2026-06-03T21:07:30.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:07:30.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:07:30.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:07:30.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87847.425188s, valid=True
2026-06-03T21:07:30.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:07:30.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:07:30.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:07:30.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:07:30.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:07:30.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:07:30.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:07:30.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:07:30.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:07:30.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:07:30.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:07:30.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:07:30.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:07:30.743 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:07:31.023 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:07:31.362 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:07:31.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:07:31.466 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:07:31.466 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:07:31.554 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:07:31.554 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:08:01.584 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:08:01.584 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:08:01.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:08:01.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:08:01.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:08:01.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:08:01.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:08:01.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:08:01.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:08:02.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:08:02.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:08:02.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:08:02.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:08:04.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:08:04.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:08:04.641 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:08:04.642 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:08:04.651 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:08:04.664 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:08:04.664 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:08:04.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:08:04.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:08:04.666 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:08:04.666 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:08:04.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:08:04.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T21:08:04.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:08:04.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T21:08:04.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:08:04.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:08:04.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:08:05.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:08:05.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:08:05.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:08:05.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:08:05.008 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:08:05.078 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:07:36
2026-06-03T21:08:05.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87053, datetime.datetime(2026, 6, 3, 21, 7, 36), datetime.datetime(2026, 6, 3, 21, 7, 35), 'salt', 2.38, 99.99, None, 55.53, 120.39, -0.01, 821.79, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:08:05.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:08:05.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T21:08:05.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:07:35, diff=30.085471s, valid=True
2026-06-03T21:08:05.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:08:05.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:08:05.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:08:12, diff=-6.911012s, valid=True
2026-06-03T21:08:05.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:08:05.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T21:08:05.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:07:35, diff=30.097102s, valid=True
2026-06-03T21:08:05.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:08:05.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:08:05.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:08:05.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:08:05.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:08:05.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:08:05.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:08:12, diff=-6.899117s, valid=True
2026-06-03T21:08:05.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:08:05.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:08:05.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:08:05.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87882.101725s, valid=True
2026-06-03T21:08:05.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:08:05.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:08:05.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:08:05.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:08:05.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:08:05.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:08:05.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:08:05.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:08:05.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:08:05.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:08:05.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:08:05.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:08:05.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:08:05.423 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:08:05.630 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:08:05.972 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:08:06.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:08:06.075 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:08:06.075 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:08:06.273 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:08:06.273 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:08:36.303 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:08:36.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:08:36.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:08:36.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:08:36.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:08:36.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:08:36.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:08:36.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:08:36.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:08:36.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:08:36.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:08:36.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:08:36.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:08:39.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:08:39.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:08:39.418 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:08:39.418 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:08:39.428 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:08:39.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:08:39.441 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:08:39.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:08:39.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:08:39.442 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:08:39.443 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:08:39.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:08:39.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:08:39.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:08:39.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:08:39.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:08:39.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:08:39.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:08:39.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:08:39.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:08:39.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:08:39.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:08:39.782 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:08:39.853 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:08:36
2026-06-03T21:08:39.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87055, datetime.datetime(2026, 6, 3, 21, 8, 36), datetime.datetime(2026, 6, 3, 21, 8, 35), 'salt', 2.52, 100.16, None, 50.35, 121.12, -0.02, 821.91, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:08:39.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:08:39.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:08:39.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:08:35, diff=4.859689s, valid=True
2026-06-03T21:08:39.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:08:39.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:08:39.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:09:12, diff=-32.137436s, valid=True
2026-06-03T21:08:39.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:08:39.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:08:39.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:08:36, diff=3.86939s, valid=True
2026-06-03T21:08:39.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:08:39.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:08:39.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:08:39.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:08:39.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:08:39.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:08:39.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:09:12, diff=-32.127268s, valid=True
2026-06-03T21:08:39.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:08:39.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:08:39.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:08:39.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87916.873443s, valid=True
2026-06-03T21:08:39.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:08:39.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:08:39.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:08:39.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:08:39.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:08:39.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:08:39.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:08:39.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:08:39.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:08:40.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:08:40.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:08:40.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:08:40.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:08:40.279 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:08:40.496 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:08:40.837 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:08:40.940 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:08:40.941 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:08:40.941 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:08:41.141 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:08:41.141 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:09:11.143 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:09:11.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:09:11.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:09:11.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:09:11.483 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:09:11.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:09:11.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:09:11.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:09:11.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:09:11.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:09:11.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:09:11.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:09:11.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:09:14.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:09:14.428 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:09:14.429 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:09:14.429 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:09:14.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:09:14.453 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:09:14.454 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:09:14.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:09:14.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:09:14.455 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:09:14.455 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:09:14.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:09:14.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:09:14.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:09:14.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:09:14.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:09:14.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:09:14.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:09:14.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:09:14.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:09:14.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:09:14.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:09:14.800 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:09:14.881 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:09:06
2026-06-03T21:09:14.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87056, datetime.datetime(2026, 6, 3, 21, 9, 6), datetime.datetime(2026, 6, 3, 21, 9, 5), 'salt', 2.49, 100.09, None, 51.69, 129.18, -0.01, 821.79, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:09:14.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:09:14.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:09:14.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:09:05, diff=9.888944s, valid=True
2026-06-03T21:09:14.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:09:14.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:09:14.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:09:12, diff=2.892421s, valid=True
2026-06-03T21:09:14.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:09:14.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:09:14.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:09:06, diff=8.900671s, valid=True
2026-06-03T21:09:14.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:09:14.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:09:14.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:09:14.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:09:14.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:09:14.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:09:14.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:09:12, diff=2.904368s, valid=True
2026-06-03T21:09:14.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:09:14.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:09:14.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:09:14.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87951.90519s, valid=True
2026-06-03T21:09:14.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:09:14.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:09:14.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:09:14.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:09:14.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:09:14.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:09:14.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:09:14.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:09:14.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:09:15.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:09:15.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:09:15.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:09:15.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:09:15.228 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:09:15.438 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:09:15.781 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:09:15.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:09:15.885 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:09:15.885 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:09:16.108 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:09:16.108 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:09:46.138 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:09:46.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:09:46.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:09:46.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:09:46.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:09:46.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:09:46.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:09:46.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:09:46.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:09:46.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:09:46.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:09:46.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:09:46.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:09:49.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:09:49.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:09:49.550 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:09:49.550 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:09:49.561 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:09:49.574 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:09:49.574 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:09:49.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:09:49.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:09:49.575 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:09:49.576 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:09:49.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:09:49.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:09:49.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:09:49.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:09:49.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:09:49.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:09:49.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:09:49.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:09:49.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:09:49.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:09:49.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:09:49.916 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:09:49.987 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:09:36
2026-06-03T21:09:49.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87057, datetime.datetime(2026, 6, 3, 21, 9, 36), datetime.datetime(2026, 6, 3, 21, 9, 36), 'salt', 2.55, 100.16, None, 51.48, 124.64, -0.03, 821.85, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:09:49.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:09:49.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:09:49.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:09:36, diff=13.994679s, valid=True
2026-06-03T21:09:49.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:09:49.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:09:49.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:10:12, diff=-22.002035s, valid=True
2026-06-03T21:09:49.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:09:49.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:09:50.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:09:36, diff=14.004817s, valid=True
2026-06-03T21:09:50.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:09:50.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:09:50.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:09:50.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:09:50.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:09:50.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:09:50.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:10:12, diff=-21.992088s, valid=True
2026-06-03T21:09:50.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:09:50.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:09:50.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:09:50.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=87987.008719s, valid=True
2026-06-03T21:09:50.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:09:50.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:09:50.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:09:50.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:09:50.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:09:50.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:09:50.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:09:50.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:09:50.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:09:50.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:09:50.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:09:50.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:09:50.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:09:50.403 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:09:50.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:09:50.957 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:09:51.058 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:09:51.059 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:09:51.059 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:09:51.246 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:09:51.246 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:10:21.274 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:10:21.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:10:21.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:10:21.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:10:21.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:10:21.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:10:21.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:10:21.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:10:21.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:10:21.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:10:21.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:10:21.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:10:21.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:10:24.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:10:24.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:10:24.664 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:10:24.665 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:10:24.677 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:10:24.690 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:10:24.690 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:10:24.691 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:10:24.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:10:24.691 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:10:24.692 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:10:24.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:10:24.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:10:24.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:10:24.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:10:24.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:10:24.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:10:24.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:10:25.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:10:25.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:10:25.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:10:25.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:10:25.032 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:10:25.103 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:10:07
2026-06-03T21:10:25.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87058, datetime.datetime(2026, 6, 3, 21, 10, 7), datetime.datetime(2026, 6, 3, 21, 10, 6), 'salt', 2.42, 100.09, None, 48.34, 118.68, -0.01, 822.16, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:10:25.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:10:25.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:10:25.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:10:06, diff=19.109256s, valid=True
2026-06-03T21:10:25.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:10:25.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:10:25.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:10:12, diff=13.11217s, valid=True
2026-06-03T21:10:25.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:10:25.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:10:25.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:10:06, diff=19.119057s, valid=True
2026-06-03T21:10:25.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:10:25.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:10:25.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:10:25.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:10:25.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:10:25.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:10:25.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:10:12, diff=13.122187s, valid=True
2026-06-03T21:10:25.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:10:25.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:10:25.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:10:25.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88022.12286s, valid=True
2026-06-03T21:10:25.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:10:25.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:10:25.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:10:25.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:10:25.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:10:25.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:10:25.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:10:25.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:10:25.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:10:25.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:10:25.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:10:25.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:10:25.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:10:25.622 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:10:25.827 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:10:26.167 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:10:26.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:10:26.271 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:10:26.271 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:10:26.455 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:10:26.455 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:10:56.478 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:10:56.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:10:56.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:10:56.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:10:56.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:10:57.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:10:57.034 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:10:57.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:10:57.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:10:57.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:10:57.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:10:57.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:10:57.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:10:59.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:10:59.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:10:59.762 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:10:59.763 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:10:59.772 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:10:59.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:10:59.786 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:10:59.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:10:59.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:10:59.787 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:10:59.787 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:10:59.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:10:59.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:10:59.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:10:59.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:10:59.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:11:00.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:11:00.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:11:00.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:11:00.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:11:00.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:11:00.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:11:00.073 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:11:00.146 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:10:37
2026-06-03T21:11:00.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87059, datetime.datetime(2026, 6, 3, 21, 10, 37), datetime.datetime(2026, 6, 3, 21, 10, 36), 'salt', 2.42, 100.09, None, 51.69, 123.0, -0.01, 821.79, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:11:00.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:11:00.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:11:00.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:10:36, diff=24.152983s, valid=True
2026-06-03T21:11:00.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:11:00.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:11:00.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:11:12, diff=-11.841093s, valid=True
2026-06-03T21:11:00.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:11:00.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:11:00.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:10:37, diff=23.167049s, valid=True
2026-06-03T21:11:00.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:11:00.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:11:00.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:11:00.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:11:00.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:11:00.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:11:00.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:11:12, diff=-11.829461s, valid=True
2026-06-03T21:11:00.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:11:00.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:11:00.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:11:00.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88057.171307s, valid=True
2026-06-03T21:11:00.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:11:00.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:11:00.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:11:00.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:11:00.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:11:00.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:11:00.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:11:00.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:11:00.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:11:00.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:11:00.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:11:00.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:11:00.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:11:00.562 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:11:00.769 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:11:01.110 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:11:01.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:11:01.214 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:11:01.214 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:11:01.403 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:11:01.403 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:11:31.425 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:11:31.425 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:11:31.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:11:31.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:11:31.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:11:31.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:11:31.831 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:11:31.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:11:31.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:11:31.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:11:31.860 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:11:31.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:11:31.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:11:34.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:11:34.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:11:34.558 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:11:34.558 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:11:34.568 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:11:34.580 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:11:34.580 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:11:34.581 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:11:34.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:11:34.582 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:11:34.582 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:11:34.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:11:34.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:11:34.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:11:34.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:11:34.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:11:34.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:11:34.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:11:34.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:11:34.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:11:34.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:11:34.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:11:34.914 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:11:34.986 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:11:07
2026-06-03T21:11:34.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87060, datetime.datetime(2026, 6, 3, 21, 11, 7), datetime.datetime(2026, 6, 3, 21, 11, 6), 'salt', 2.35, 100.06, None, 53.14, 117.2, -0.01, 822.1, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:11:34.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:11:34.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:11:34.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:11:06, diff=28.993945s, valid=True
2026-06-03T21:11:34.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:11:34.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:11:34.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:11:12, diff=22.997436s, valid=True
2026-06-03T21:11:34.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:11:34.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:11:35.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:11:07, diff=28.005644s, valid=True
2026-06-03T21:11:35.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:11:35.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:11:35.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:11:35.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:11:35.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:11:35.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:11:35.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:11:12, diff=23.009374s, valid=True
2026-06-03T21:11:35.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:11:35.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:11:35.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:11:35.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88092.010211s, valid=True
2026-06-03T21:11:35.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:11:35.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:11:35.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:11:35.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:11:35.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:11:35.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:11:35.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:11:35.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:11:35.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:11:35.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:11:35.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:11:35.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:11:35.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:11:35.332 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:11:35.537 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:11:35.877 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:11:35.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:11:35.979 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:11:35.979 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:11:36.163 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:11:36.163 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:12:06.174 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:12:06.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:12:06.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:12:06.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:12:06.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:12:06.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:12:06.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:12:06.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:12:06.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:12:06.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:12:06.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:12:06.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:12:06.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:12:09.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:12:09.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:12:09.454 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:12:09.455 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:12:09.467 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:12:09.480 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:12:09.480 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:12:09.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:12:09.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:12:09.482 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:12:09.482 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:12:09.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:12:09.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:12:09.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:12:09.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:12:09.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:12:09.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:12:09.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:12:09.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:12:09.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:12:09.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:12:09.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:12:09.819 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:12:09.893 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:12:08
2026-06-03T21:12:09.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87062, datetime.datetime(2026, 6, 3, 21, 12, 8), datetime.datetime(2026, 6, 3, 21, 12, 7), 'salt', 2.35, 100.09, None, 52.32, 120.23, -0.02, 822.16, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:12:09.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:12:09.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:12:09.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:12:07, diff=2.899385s, valid=True
2026-06-03T21:12:09.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:12:09.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:12:09.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:12:12, diff=-2.097777s, valid=True
2026-06-03T21:12:09.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:12:09.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:12:09.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:12:02, diff=7.909207s, valid=True
2026-06-03T21:12:09.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:12:09.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:12:09.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:12:09.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:12:09.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:12:09.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:12:09.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:12:12, diff=-2.087578s, valid=True
2026-06-03T21:12:09.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:12:09.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:12:09.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:12:09.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88126.91311s, valid=True
2026-06-03T21:12:09.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:12:09.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:12:09.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:12:09.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:12:09.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:12:09.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:12:09.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:12:09.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:12:09.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:12:10.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:12:10.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:12:10.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:12:10.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:12:10.240 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:12:10.446 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:12:10.787 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:12:10.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:12:10.889 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:12:10.889 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:12:11.073 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:12:11.074 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:12:41.104 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:12:41.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:12:41.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:12:41.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:12:41.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:12:41.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:12:41.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:12:41.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:12:41.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:12:41.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:12:41.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:12:41.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:12:41.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:12:44.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:12:44.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:12:44.300 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:12:44.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:12:44.311 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:12:44.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:12:44.324 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:12:44.325 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:12:44.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:12:44.325 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:12:44.325 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:12:44.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:12:44.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:12:44.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:12:44.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:12:44.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:12:44.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:12:44.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:12:44.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:12:44.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:12:44.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:12:44.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:12:44.663 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:12:44.734 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:12:38
2026-06-03T21:12:44.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87063, datetime.datetime(2026, 6, 3, 21, 12, 38), datetime.datetime(2026, 6, 3, 21, 12, 37), 'salt', 2.35, 99.99, None, 51.05, 116.94, 0.0, 821.92, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:12:44.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:12:44.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:12:44.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:12:37, diff=7.741892s, valid=True
2026-06-03T21:12:44.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:12:44.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:12:44.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:13:12, diff=-27.254637s, valid=True
2026-06-03T21:12:44.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:12:44.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:12:44.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:12:28, diff=16.753618s, valid=True
2026-06-03T21:12:44.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:12:44.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:12:44.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:12:44.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:12:44.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:12:44.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:12:44.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:13:12, diff=-27.24267s, valid=True
2026-06-03T21:12:44.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:12:44.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:12:44.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:12:44.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88161.758151s, valid=True
2026-06-03T21:12:44.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:12:44.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:12:44.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:12:44.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:12:44.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:12:44.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:12:44.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:12:44.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:12:44.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:12:44.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:12:44.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:12:44.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:12:45.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:12:45.076 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:12:45.281 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:12:45.679 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:12:45.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:12:45.781 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:12:45.781 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:12:45.981 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:12:45.981 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:13:16.011 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:13:16.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:13:16.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:13:16.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:13:16.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:13:16.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:13:16.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:13:16.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:13:16.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:13:16.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:13:16.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:13:16.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:13:16.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:13:19.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:13:19.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:13:19.196 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:13:19.196 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:13:19.207 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:13:19.220 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:13:19.220 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:13:19.221 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:13:19.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:13:19.222 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:13:19.222 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:13:19.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:13:19.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:13:19.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:13:19.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:13:19.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:13:19.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:13:19.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:13:19.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:13:19.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:13:19.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:13:19.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:13:19.563 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:13:19.636 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:13:08
2026-06-03T21:13:19.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87064, datetime.datetime(2026, 6, 3, 21, 13, 8), datetime.datetime(2026, 6, 3, 21, 13, 7), 'salt', 2.35, 100.12, None, 52.15, 112.81, -0.02, 821.98, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:13:19.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:13:19.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:13:19.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:13:07, diff=12.643696s, valid=True
2026-06-03T21:13:19.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:13:19.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:13:19.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:13:12, diff=7.647157s, valid=True
2026-06-03T21:13:19.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:13:19.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:13:19.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:13:03, diff=16.655158s, valid=True
2026-06-03T21:13:19.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:13:19.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:13:19.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:13:19.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:13:19.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:13:19.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:13:19.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:13:12, diff=7.658891s, valid=True
2026-06-03T21:13:19.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:13:19.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:13:19.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:13:19.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88196.659701s, valid=True
2026-06-03T21:13:19.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:13:19.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:13:19.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:13:19.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:13:19.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:13:19.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:13:19.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:13:19.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:13:19.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:13:19.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:13:19.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:13:19.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:13:19.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:13:19.996 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:13:20.215 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:13:20.560 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:13:20.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:13:20.665 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:13:20.665 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:13:20.851 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:13:20.851 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:13:50.871 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:13:50.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:13:50.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:13:51.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:13:51.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:13:51.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:13:51.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:13:51.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:13:51.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:13:51.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:13:51.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:13:51.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:13:51.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:13:54.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:13:54.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:13:54.480 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:13:54.481 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:13:54.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:13:54.501 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:13:54.501 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:13:54.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:13:54.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:13:54.503 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:13:54.503 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:13:54.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:13:54.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:13:54.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:13:54.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:13:54.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:13:54.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:13:54.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:13:54.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:13:54.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:13:54.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:13:54.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:13:54.850 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:13:54.931 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:13:38
2026-06-03T21:13:54.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87065, datetime.datetime(2026, 6, 3, 21, 13, 38), datetime.datetime(2026, 6, 3, 21, 13, 38), 'salt', 2.35, 100.06, None, 52.92, 124.34, -0.01, 821.92, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:13:54.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:13:54.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:13:54.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:13:38, diff=16.937904s, valid=True
2026-06-03T21:13:54.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:13:54.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:13:54.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:14:12, diff=-17.059234s, valid=True
2026-06-03T21:13:54.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:13:54.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:13:54.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:13:35, diff=19.947407s, valid=True
2026-06-03T21:13:54.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:13:54.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:13:54.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:13:54.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:13:54.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:13:54.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:13:54.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:14:12, diff=-17.049556s, valid=True
2026-06-03T21:13:54.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:13:54.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:13:54.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:13:54.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88231.95111s, valid=True
2026-06-03T21:13:54.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:13:54.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:13:54.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:13:54.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:13:54.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:13:55.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:13:55.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:13:55.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:13:55.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:13:55.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:13:55.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:13:55.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:13:55.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:13:55.269 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:13:55.547 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:13:55.887 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:13:55.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:13:55.993 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:13:55.993 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:13:56.227 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:13:56.227 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:14:26.250 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:14:26.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:14:26.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:14:26.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:14:26.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:14:26.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:14:26.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:14:26.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:14:26.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:14:26.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:14:26.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:14:26.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:14:26.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:14:29.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:14:29.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:14:29.497 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:14:29.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:14:29.507 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:14:29.519 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:14:29.520 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:14:29.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:14:29.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:14:29.521 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:14:29.522 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:14:29.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:14:29.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:14:29.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:14:29.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:14:29.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:14:29.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:14:29.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:14:29.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:14:29.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:14:29.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:14:29.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:14:29.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:14:29.971 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:14:09
2026-06-03T21:14:29.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87066, datetime.datetime(2026, 6, 3, 21, 14, 9), datetime.datetime(2026, 6, 3, 21, 14, 8), 'salt', 2.39, 100.12, None, 53.95, 121.05, -0.02, 821.86, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:14:29.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:14:29.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:14:29.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:14:08, diff=21.981381s, valid=True
2026-06-03T21:14:29.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:14:29.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:14:29.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:14:12, diff=17.984712s, valid=True
2026-06-03T21:14:29.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:14:29.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:14:29.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:13:59, diff=30.992464s, valid=True
2026-06-03T21:14:29.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:14:29.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:14:29.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:14:29.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:14:29.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:14:29.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:14:29.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:14:12, diff=17.995882s, valid=True
2026-06-03T21:14:29.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:14:29.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:14:29.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:14:29.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88266.996659s, valid=True
2026-06-03T21:14:29.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:14:29.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:14:29.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:14:29.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:14:29.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:14:30.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:14:30.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:14:30.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:14:30.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:14:30.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:14:30.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:14:30.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:14:30.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:14:30.332 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:14:30.542 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:14:30.888 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:14:30.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:14:30.991 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:14:30.991 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:14:31.148 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:14:31.148 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:15:01.179 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:15:01.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:15:01.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:15:01.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:15:01.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:15:01.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:15:01.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:15:01.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:15:01.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:15:01.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:15:01.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:15:01.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:15:01.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:15:04.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:15:04.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:15:04.273 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:15:04.273 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:15:04.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:15:04.298 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:15:04.298 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:15:04.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:15:04.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:15:04.299 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:15:04.299 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:15:04.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:15:04.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:15:04.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:15:04.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:15:04.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:15:04.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:15:04.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:15:04.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:15:04.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:15:04.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:15:04.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:15:04.580 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:15:04.673 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:14:39
2026-06-03T21:15:04.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87067, datetime.datetime(2026, 6, 3, 21, 14, 39), datetime.datetime(2026, 6, 3, 21, 14, 38), 'salt', 2.32, 100.02, None, 49.36, 122.16, -0.01, 821.98, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:15:04.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:15:04.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:15:04.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:14:38, diff=26.67932s, valid=True
2026-06-03T21:15:04.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:15:04.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:15:04.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:15:12, diff=-7.317836s, valid=True
2026-06-03T21:15:04.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:15:04.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:15:04.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:14:36, diff=28.688862s, valid=True
2026-06-03T21:15:04.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:15:04.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:15:04.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:15:04.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:15:04.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:15:04.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:15:04.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:15:12, diff=-7.308051s, valid=True
2026-06-03T21:15:04.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:15:04.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:15:04.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:15:04.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88301.692625s, valid=True
2026-06-03T21:15:04.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:15:04.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:15:04.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:15:04.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:15:04.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:15:04.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:15:04.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:15:04.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:15:04.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:15:04.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:15:04.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:15:04.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:15:04.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:15:05.089 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:15:05.321 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:15:05.658 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:15:05.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:15:05.761 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:15:05.761 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:15:06.025 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:15:06.025 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:15:36.045 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:15:36.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:15:36.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:15:36.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:15:36.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:15:36.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:15:36.618 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:15:36.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:15:36.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:15:36.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:15:36.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:15:36.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:15:36.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:15:39.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:15:39.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:15:39.292 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:15:39.292 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:15:39.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:15:39.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:15:39.315 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:15:39.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:15:39.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:15:39.316 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:15:39.317 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:15:39.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:15:39.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T21:15:39.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:15:39.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T21:15:39.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:15:39.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:15:39.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:15:39.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:15:39.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:15:39.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:15:39.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:15:39.672 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:15:39.758 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:15:09
2026-06-03T21:15:39.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87068, datetime.datetime(2026, 6, 3, 21, 15, 9), datetime.datetime(2026, 6, 3, 21, 15, 8), 'salt', 2.35, 100.06, None, 40.12, 128.69, -0.01, 822.1, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:15:39.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:15:39.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T21:15:39.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:15:08, diff=31.766349s, valid=True
2026-06-03T21:15:39.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:15:39.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:15:39.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:15:12, diff=27.769981s, valid=True
2026-06-03T21:15:39.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:15:39.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T21:15:39.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:15:08, diff=31.778697s, valid=True
2026-06-03T21:15:39.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:15:39.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:15:39.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:15:39.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:15:39.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:15:39.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:15:39.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:15:12, diff=27.783183s, valid=True
2026-06-03T21:15:39.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:15:39.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:15:39.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:15:39.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88336.784083s, valid=True
2026-06-03T21:15:39.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:15:39.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:15:39.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:15:39.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:15:39.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:15:39.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:15:39.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:15:39.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:15:39.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:15:39.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:15:39.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:15:40.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:15:40.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:15:40.125 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:15:40.331 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:15:40.671 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:15:40.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:15:40.774 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:15:40.774 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:15:40.965 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:15:40.965 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:16:10.975 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:16:10.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:16:10.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:16:11.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:16:11.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:16:11.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:16:11.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:16:11.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:16:11.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:16:11.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:16:11.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:16:11.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:16:11.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:16:14.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:16:14.595 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:16:14.595 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:16:14.596 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:16:14.607 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:16:14.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:16:14.620 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:16:14.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:16:14.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:16:14.621 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:16:14.622 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:16:14.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:16:14.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:16:14.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:16:14.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:16:14.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:16:14.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:16:14.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:16:14.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:16:14.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:16:14.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:16:14.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:16:14.989 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:16:15.066 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:16:10
2026-06-03T21:16:15.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87070, datetime.datetime(2026, 6, 3, 21, 16, 10), datetime.datetime(2026, 6, 3, 21, 16, 9), 'salt', 2.42, 100.09, None, 46.43, 124.77, -0.01, 821.92, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:16:15.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:16:15.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:16:15.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:16:09, diff=6.073772s, valid=True
2026-06-03T21:16:15.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:16:15.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:16:15.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:16:12, diff=3.077259s, valid=True
2026-06-03T21:16:15.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:16:15.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:16:15.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:16:00, diff=15.085364s, valid=True
2026-06-03T21:16:15.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:16:15.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:16:15.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:16:15.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:16:15.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:16:15.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:16:15.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:16:12, diff=3.089105s, valid=True
2026-06-03T21:16:15.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:16:15.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:16:15.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:16:15.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88372.089925s, valid=True
2026-06-03T21:16:15.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:16:15.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:16:15.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:16:15.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:16:15.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:16:15.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:16:15.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:16:15.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:16:15.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:16:15.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:16:15.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:16:15.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:16:15.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:16:15.477 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:16:15.686 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:16:16.034 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:16:16.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:16:16.136 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:16:16.136 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:16:16.333 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:16:16.333 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:16:46.352 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:16:46.352 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:16:46.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:16:46.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:16:46.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:16:46.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:16:46.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:16:46.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:16:46.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:16:46.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:16:46.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:16:46.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:16:46.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:16:49.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:16:49.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:16:49.512 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:16:49.512 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:16:49.522 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:16:49.535 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:16:49.536 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:16:49.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:16:49.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:16:49.537 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:16:49.537 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:16:49.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:16:49.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:16:49.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:16:49.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:16:49.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:16:49.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:16:49.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:16:49.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:16:49.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:16:49.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:16:49.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:16:49.895 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:16:49.970 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:16:40
2026-06-03T21:16:49.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87071, datetime.datetime(2026, 6, 3, 21, 16, 40), datetime.datetime(2026, 6, 3, 21, 16, 39), 'salt', 2.39, 100.02, None, 43.29, 116.33, 0.0, 822.22, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:16:49.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:16:49.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:16:49.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:16:39, diff=10.976995s, valid=True
2026-06-03T21:16:49.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:16:49.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:16:49.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:17:12, diff=-22.019957s, valid=True
2026-06-03T21:16:49.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:16:49.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:16:49.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:16:30, diff=19.987121s, valid=True
2026-06-03T21:16:49.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:16:49.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:16:49.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:16:49.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:16:49.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:16:49.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:16:49.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:17:12, diff=-22.009303s, valid=True
2026-06-03T21:16:49.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:16:49.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:16:49.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:16:49.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88406.99138s, valid=True
2026-06-03T21:16:49.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:16:49.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:16:49.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:16:49.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:16:49.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:16:50.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:16:50.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:16:50.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:16:50.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:16:50.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:16:50.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:16:50.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:16:50.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:16:50.319 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:16:50.525 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:16:50.865 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:16:50.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:16:50.978 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:16:50.978 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:16:51.173 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:16:51.173 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:17:21.175 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:17:21.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:17:21.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:17:21.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:17:21.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:17:21.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:17:21.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:17:21.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:17:21.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:17:21.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:17:21.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:17:21.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:17:21.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:17:24.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:17:24.596 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:17:24.596 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:17:24.596 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:17:24.607 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:17:24.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:17:24.621 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:17:24.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:17:24.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:17:24.622 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:17:24.622 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:17:24.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:17:24.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:17:24.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:17:24.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:17:24.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:17:24.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:17:24.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:17:24.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:17:24.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:17:24.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:17:24.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:17:24.954 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:17:25.026 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:17:10
2026-06-03T21:17:25.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87072, datetime.datetime(2026, 6, 3, 21, 17, 10), datetime.datetime(2026, 6, 3, 21, 17, 9), 'salt', 2.35, 100.03, None, 51.27, 120.11, -0.01, 822.1, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:17:25.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:17:25.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:17:25.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:17:09, diff=16.033512s, valid=True
2026-06-03T21:17:25.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:17:25.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:17:25.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:17:12, diff=13.037034s, valid=True
2026-06-03T21:17:25.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:17:25.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:17:25.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:17:01, diff=24.045308s, valid=True
2026-06-03T21:17:25.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:17:25.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:17:25.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:17:25.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:17:25.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:17:25.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:17:25.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:17:12, diff=13.04897s, valid=True
2026-06-03T21:17:25.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:17:25.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:17:25.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:17:25.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88442.049807s, valid=True
2026-06-03T21:17:25.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:17:25.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:17:25.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:17:25.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:17:25.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:17:25.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:17:25.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:17:25.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:17:25.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:17:25.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:17:25.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:17:25.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:17:25.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:17:25.435 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:17:25.641 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:17:25.983 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:17:26.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:17:26.087 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:17:26.087 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:17:26.283 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:17:26.283 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:17:56.290 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:17:56.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:17:56.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:17:56.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:17:56.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:17:56.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:17:56.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:17:56.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:17:56.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:17:56.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:17:56.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:17:56.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:17:56.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:17:59.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:17:59.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:17:59.442 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:17:59.442 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:17:59.451 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:17:59.463 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:17:59.464 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:17:59.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:17:59.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:17:59.465 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:17:59.465 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:17:59.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:17:59.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:17:59.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:17:59.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:17:59.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:17:59.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:17:59.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:17:59.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:17:59.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:17:59.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:17:59.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:17:59.817 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:17:59.891 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:17:40
2026-06-03T21:17:59.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87073, datetime.datetime(2026, 6, 3, 21, 17, 40), datetime.datetime(2026, 6, 3, 21, 17, 40), 'salt', 2.39, 100.09, None, 51.41, 122.02, -0.01, 822.04, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:17:59.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:17:59.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:17:59.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:17:40, diff=19.897987s, valid=True
2026-06-03T21:17:59.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:17:59.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:17:59.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:18:12, diff=-12.098911s, valid=True
2026-06-03T21:17:59.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:17:59.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:17:59.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:17:31, diff=28.908479s, valid=True
2026-06-03T21:17:59.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:17:59.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:17:59.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:17:59.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:17:59.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:17:59.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:17:59.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:18:12, diff=-12.088001s, valid=True
2026-06-03T21:17:59.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:17:59.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:17:59.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:17:59.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88476.912834s, valid=True
2026-06-03T21:17:59.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:17:59.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:17:59.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:17:59.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:17:59.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:17:59.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:17:59.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:17:59.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:17:59.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:18:00.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:18:00.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:18:00.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:18:00.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:18:00.242 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:18:00.449 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:18:00.793 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:18:00.896 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:18:00.896 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:18:00.897 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:18:01.156 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:18:01.157 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:18:31.161 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:18:31.161 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:18:31.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:18:31.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:18:31.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:18:31.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:18:31.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:18:31.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:18:31.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:18:31.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:18:31.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:18:31.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:18:31.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:18:34.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:18:34.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:18:34.659 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:18:34.659 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:18:34.669 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:18:34.682 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:18:34.683 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:18:34.683 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:18:34.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:18:34.684 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:18:34.684 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:18:34.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:18:34.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:18:34.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:18:34.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:18:34.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:18:34.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:18:34.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:18:35.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:18:35.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:18:35.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:18:35.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:18:35.025 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:18:35.096 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:18:11
2026-06-03T21:18:35.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87074, datetime.datetime(2026, 6, 3, 21, 18, 11), datetime.datetime(2026, 6, 3, 21, 18, 10), 'salt', 2.32, 100.06, None, 44.81, 116.87, -0.01, 822.22, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:18:35.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:18:35.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:18:35.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:18:10, diff=25.102534s, valid=True
2026-06-03T21:18:35.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:18:35.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:18:35.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:18:12, diff=23.10545s, valid=True
2026-06-03T21:18:35.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:18:35.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:18:35.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:18:02, diff=33.112147s, valid=True
2026-06-03T21:18:35.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:18:35.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:18:35.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:18:35.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:18:35.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:18:35.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:18:35.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:18:12, diff=23.115235s, valid=True
2026-06-03T21:18:35.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:18:35.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:18:35.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:18:35.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88512.115896s, valid=True
2026-06-03T21:18:35.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:18:35.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:18:35.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:18:35.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:18:35.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:18:35.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:18:35.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:18:35.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:18:35.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:18:35.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:18:35.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:18:35.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:18:35.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:18:35.523 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:18:35.731 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:18:36.076 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:18:36.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:18:36.179 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:18:36.179 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:18:36.370 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:18:36.370 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:19:06.374 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:19:06.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:19:06.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:19:06.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:19:06.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:19:06.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:19:06.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:19:06.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:19:06.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:19:06.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:19:06.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:19:06.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:19:06.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:19:09.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:19:09.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:19:09.540 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:19:09.541 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:19:09.552 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:19:09.565 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:19:09.566 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:19:09.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:19:09.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:19:09.567 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:19:09.567 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:19:09.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:19:09.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:19:09.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:19:09.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T21:19:09.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:19:09.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:19:09.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:19:09.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:19:09.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:19:09.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:19:09.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:19:09.920 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:19:09.992 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:18:41
2026-06-03T21:19:09.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87075, datetime.datetime(2026, 6, 3, 21, 18, 41), datetime.datetime(2026, 6, 3, 21, 18, 40), 'salt', 2.39, 100.13, None, 37.33, 128.55, -0.02, 821.98, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:19:09.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:19:09.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:19:09.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:18:40, diff=29.999229s, valid=True
2026-06-03T21:19:09.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:19:09.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:19:10.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:19:12, diff=-1.997547s, valid=True
2026-06-03T21:19:10.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:19:10.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T21:19:10.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:18:31, diff=39.009603s, valid=True
2026-06-03T21:19:10.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:19:10.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:19:10.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:19:10.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:19:10.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:19:10.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:19:10.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:19:12, diff=-1.987229s, valid=True
2026-06-03T21:19:10.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:19:10.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:19:10.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:19:10.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88547.013446s, valid=True
2026-06-03T21:19:10.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:19:10.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:19:10.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:19:10.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:19:10.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:19:10.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:19:10.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:19:10.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:19:10.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:19:10.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:19:10.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:19:10.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:19:10.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:19:10.340 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:19:10.549 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:19:10.891 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:19:10.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:19:10.996 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:19:10.996 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:19:11.257 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:19:11.257 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:19:41.286 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:19:41.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:19:41.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:19:41.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:19:41.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:19:41.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:19:41.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:19:41.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:19:41.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:19:41.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:19:41.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:19:41.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:19:41.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:19:44.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:19:44.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:19:44.457 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:19:44.457 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:19:44.469 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:19:44.482 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:19:44.482 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:19:44.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:19:44.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:19:44.483 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:19:44.484 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:19:44.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:19:44.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:19:44.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:19:44.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:19:44.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:19:44.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:19:44.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:19:44.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:19:44.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:19:44.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:19:44.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:19:44.820 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:19:44.892 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:19:42
2026-06-03T21:19:44.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87077, datetime.datetime(2026, 6, 3, 21, 19, 42), datetime.datetime(2026, 6, 3, 21, 19, 41), 'salt', 2.45, 100.06, None, 36.91, 116.69, -0.01, 822.16, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:19:44.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:19:44.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:19:44.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:19:41, diff=3.899831s, valid=True
2026-06-03T21:19:44.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:19:44.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:19:44.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:20:12, diff=-27.096718s, valid=True
2026-06-03T21:19:44.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:19:44.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:19:44.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:19:32, diff=12.911241s, valid=True
2026-06-03T21:19:44.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:19:44.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:19:44.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:19:44.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:19:44.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:19:44.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:19:44.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:20:12, diff=-27.085055s, valid=True
2026-06-03T21:19:44.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:19:44.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:19:44.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:19:44.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88581.915762s, valid=True
2026-06-03T21:19:44.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:19:44.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:19:44.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:19:44.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:19:44.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:19:44.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:19:44.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:19:44.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:19:45.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:19:45.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:19:45.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:19:45.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:19:45.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:19:45.236 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:19:45.442 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:19:45.783 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:19:45.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:19:45.887 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:19:45.887 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:19:46.145 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:19:46.145 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:20:16.148 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:20:16.148 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:20:16.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:20:16.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:20:16.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:20:16.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:20:16.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:20:16.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:20:16.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:20:16.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:20:16.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:20:16.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:20:16.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:20:19.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:20:19.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:20:19.708 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:20:19.708 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:20:19.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:20:19.732 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:20:19.733 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:20:19.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:20:19.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:20:19.734 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:20:19.734 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:20:19.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:20:19.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:20:19.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:20:19.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:20:19.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:20:19.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:20:19.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:20:20.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:20:20.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:20:20.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:20:20.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:20:20.046 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:20:20.115 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:20:12
2026-06-03T21:20:20.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87078, datetime.datetime(2026, 6, 3, 21, 20, 12), datetime.datetime(2026, 6, 3, 21, 20, 11), 'salt', 2.45, 100.16, None, 46.75, 124.58, -0.03, 821.92, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:20:20.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:20:20.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:20:20.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:20:11, diff=9.121346s, valid=True
2026-06-03T21:20:20.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:20:20.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:20:20.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:20:12, diff=8.124747s, valid=True
2026-06-03T21:20:20.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:20:20.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:20:20.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:20:02, diff=18.132917s, valid=True
2026-06-03T21:20:20.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:20:20.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:20:20.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:20:20.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:20:20.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:20:20.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:20:20.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:20:12, diff=8.136094s, valid=True
2026-06-03T21:20:20.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:20:20.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:20:20.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:20:20.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88617.136769s, valid=True
2026-06-03T21:20:20.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:20:20.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:20:20.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:20:20.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:20:20.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:20:20.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:20:20.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:20:20.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:20:20.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:20:20.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:20:20.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:20:20.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:20:20.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:20:20.458 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:20:20.663 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:20:21.056 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:20:21.160 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:20:21.160 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:20:21.160 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:20:21.349 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:20:21.349 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:20:51.379 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:20:51.379 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:20:51.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:20:51.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:20:51.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:20:51.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:20:51.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:20:51.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:20:51.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:20:51.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:20:51.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:20:51.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:20:51.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:20:54.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:20:54.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:20:54.409 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:20:54.409 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:20:54.417 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:20:54.430 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:20:54.431 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:20:54.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:20:54.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:20:54.432 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:20:54.432 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:20:54.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:20:54.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:20:54.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:20:54.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:20:54.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:20:54.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:20:54.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:20:54.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:20:54.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:20:54.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:20:54.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:20:54.763 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:20:54.833 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:20:42
2026-06-03T21:20:54.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87079, datetime.datetime(2026, 6, 3, 21, 20, 42), datetime.datetime(2026, 6, 3, 21, 20, 41), 'salt', 2.42, 100.13, None, 44.24, 120.07, -0.02, 822.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:20:54.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:20:54.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:20:54.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:20:41, diff=13.840479s, valid=True
2026-06-03T21:20:54.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:20:54.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:20:54.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:21:12, diff=-17.156124s, valid=True
2026-06-03T21:20:54.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:20:54.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:20:54.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:20:33, diff=21.851963s, valid=True
2026-06-03T21:20:54.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:20:54.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:20:54.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:20:54.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:20:54.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:20:54.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:20:54.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:21:12, diff=-17.144411s, valid=True
2026-06-03T21:20:54.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:20:54.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:20:54.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:20:54.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88651.856398s, valid=True
2026-06-03T21:20:54.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:20:54.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:20:54.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:20:54.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:20:54.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:20:54.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:20:54.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:20:54.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:20:54.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:20:54.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:20:55.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:20:55.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:20:55.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:20:55.182 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:20:55.391 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:20:55.736 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:20:55.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:20:55.840 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:20:55.840 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:20:56.033 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:20:56.033 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:21:26.046 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:21:26.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:21:26.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:21:26.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:21:26.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:21:26.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:21:26.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:21:26.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:21:26.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:21:26.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:21:26.661 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:21:26.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:21:26.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:21:29.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:21:29.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:21:29.377 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:21:29.377 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:21:29.388 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:21:29.401 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:21:29.401 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:21:29.402 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:21:29.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:21:29.402 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:21:29.403 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:21:29.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:21:29.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:21:29.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:21:29.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:21:29.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:21:29.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:21:29.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:21:29.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:21:29.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:21:29.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:21:29.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:21:29.732 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:21:29.802 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:21:12
2026-06-03T21:21:29.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87080, datetime.datetime(2026, 6, 3, 21, 21, 12), datetime.datetime(2026, 6, 3, 21, 21, 12), 'salt', 2.42, 100.16, None, 39.02, 119.04, -0.02, 822.1, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:21:29.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:21:29.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:21:29.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:21:12, diff=17.809673s, valid=True
2026-06-03T21:21:29.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:21:29.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:21:29.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:21:12, diff=17.813118s, valid=True
2026-06-03T21:21:29.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:21:29.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:21:29.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:21:03, diff=26.821307s, valid=True
2026-06-03T21:21:29.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:21:29.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:21:29.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:21:29.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:21:29.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:21:29.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:21:29.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:21:12, diff=17.825044s, valid=True
2026-06-03T21:21:29.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:21:29.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:21:29.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:21:29.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88686.825868s, valid=True
2026-06-03T21:21:29.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:21:29.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:21:29.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:21:29.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:21:29.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:21:29.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:21:29.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:21:29.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:21:29.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:21:29.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:21:30.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:21:30.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:21:30.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:21:30.230 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:21:30.453 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:21:30.795 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:21:30.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:21:30.898 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:21:30.898 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:21:31.097 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:21:31.097 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:22:01.127 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:22:01.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:22:01.128 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:22:01.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:22:01.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:22:01.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:22:01.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:22:01.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:22:01.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:22:01.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:22:01.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:22:01.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:22:01.726 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:22:04.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:22:04.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:22:04.305 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:22:04.305 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:22:04.316 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:22:04.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:22:04.329 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:22:04.330 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:22:04.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:22:04.330 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:22:04.331 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:22:04.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:22:04.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:22:04.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:22:04.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:22:04.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:22:04.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:22:04.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:22:04.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:22:04.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:22:04.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:22:04.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:22:04.673 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:22:04.743 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:21:43
2026-06-03T21:22:04.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87081, datetime.datetime(2026, 6, 3, 21, 21, 43), datetime.datetime(2026, 6, 3, 21, 21, 42), 'salt', 2.49, 100.16, None, 37.37, 131.84, -0.02, 822.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:22:04.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:22:04.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:22:04.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:21:42, diff=22.751175s, valid=True
2026-06-03T21:22:04.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:22:04.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:22:04.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:22:12, diff=-7.245361s, valid=True
2026-06-03T21:22:04.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:22:04.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:22:04.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:21:33, diff=31.76287s, valid=True
2026-06-03T21:22:04.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:22:04.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:22:04.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:22:04.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:22:04.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:22:04.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:22:04.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:22:12, diff=-7.233418s, valid=True
2026-06-03T21:22:04.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:22:04.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:22:04.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:22:04.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88721.767402s, valid=True
2026-06-03T21:22:04.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:22:04.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:22:04.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:22:04.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:22:04.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:22:04.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:22:04.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:22:04.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:22:04.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:22:04.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:22:04.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:22:04.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:22:05.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:22:05.089 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:22:05.296 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:22:05.638 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:22:05.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:22:05.741 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:22:05.741 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:22:06.000 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:22:06.000 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:22:36.005 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:22:36.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:22:36.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:22:36.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:22:36.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:22:36.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:22:36.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:22:36.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:22:36.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:22:36.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:22:36.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:22:36.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:22:36.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:22:39.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:22:39.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:22:39.286 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:22:39.287 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:22:39.297 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:22:39.310 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:22:39.310 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:22:39.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:22:39.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:22:39.311 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:22:39.312 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:22:39.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:22:39.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:22:39.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:22:39.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:22:39.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:22:39.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:22:39.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:22:39.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:22:39.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:22:39.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:22:39.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:22:39.654 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:22:39.731 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:22:13
2026-06-03T21:22:39.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87082, datetime.datetime(2026, 6, 3, 21, 22, 13), datetime.datetime(2026, 6, 3, 21, 22, 12), 'salt', 2.52, 100.16, None, 50.03, 126.36, -0.02, 822.04, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:22:39.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:22:39.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:22:39.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:22:12, diff=27.73841s, valid=True
2026-06-03T21:22:39.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:22:39.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:22:39.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:22:12, diff=27.74174s, valid=True
2026-06-03T21:22:39.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:22:39.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:22:39.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:22:03, diff=36.74949s, valid=True
2026-06-03T21:22:39.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:22:39.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:22:39.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:22:39.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:22:39.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:22:39.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:22:39.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:22:12, diff=27.753085s, valid=True
2026-06-03T21:22:39.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:22:39.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:22:39.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:22:39.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88756.753886s, valid=True
2026-06-03T21:22:39.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:22:39.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:22:39.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:22:39.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:22:39.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:22:39.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:22:39.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:22:39.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:22:39.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:22:39.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:22:40.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:22:40.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:22:40.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:22:40.175 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:22:40.383 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:22:40.736 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:22:40.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:22:40.840 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:22:40.840 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:22:41.028 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:22:41.028 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:23:11.029 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:23:11.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:23:11.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:23:11.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:23:11.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:23:11.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:23:11.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:23:11.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:23:11.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:23:11.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:23:11.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:23:11.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:23:11.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:23:14.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:23:14.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:23:14.287 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:23:14.287 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:23:14.298 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:23:14.311 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:23:14.311 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:23:14.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:23:14.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:23:14.313 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:23:14.313 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:23:14.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:23:14.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:23:14.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:23:14.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:23:14.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:23:14.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:23:14.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:23:14.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:23:14.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:23:14.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:23:14.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:23:14.639 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:23:14.713 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:23:14
2026-06-03T21:23:14.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87084, datetime.datetime(2026, 6, 3, 21, 23, 14), datetime.datetime(2026, 6, 3, 21, 23, 13), 'salt', 2.39, 100.13, None, 49.92, 123.71, -0.02, 822.04, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:23:14.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:23:14.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:23:14.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:23:13, diff=1.72052s, valid=True
2026-06-03T21:23:14.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:23:14.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:23:14.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:23:12, diff=2.724002s, valid=True
2026-06-03T21:23:14.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:23:14.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:23:14.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:23:04, diff=10.732185s, valid=True
2026-06-03T21:23:14.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:23:14.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:23:14.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:23:14.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:23:14.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:23:14.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:23:14.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:23:12, diff=2.735866s, valid=True
2026-06-03T21:23:14.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:23:14.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:23:14.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:23:14.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88791.73668s, valid=True
2026-06-03T21:23:14.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:23:14.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:23:14.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:23:14.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:23:14.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:23:14.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:23:14.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:23:14.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:23:14.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:23:14.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:23:14.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:23:14.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:23:15.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:23:15.060 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:23:15.267 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:23:15.610 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:23:15.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:23:15.714 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:23:15.714 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:23:15.969 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:23:15.969 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:23:45.974 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:23:45.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:23:45.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:23:46.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:23:46.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:23:46.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:23:46.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:23:46.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:23:46.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:23:46.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:23:46.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:23:46.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:23:46.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:23:49.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:23:49.949 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:23:49.950 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:23:49.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:23:49.957 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:23:49.968 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:23:49.969 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:23:49.969 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:23:49.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:23:49.969 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:23:49.969 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:23:49.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:23:50.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:23:50.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:23:50.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:23:50.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:23:50.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:23:50.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:23:50.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:23:50.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:23:50.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:23:50.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:23:50.246 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:23:50.317 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:23:44
2026-06-03T21:23:50.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87085, datetime.datetime(2026, 6, 3, 21, 23, 44), datetime.datetime(2026, 6, 3, 21, 23, 43), 'salt', 2.42, 100.13, None, 57.33, 123.66, -0.02, 821.74, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:23:50.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:23:50.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:23:50.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:23:43, diff=7.323659s, valid=True
2026-06-03T21:23:50.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:23:50.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:23:50.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:24:12, diff=-21.673485s, valid=True
2026-06-03T21:23:50.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:23:50.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:23:50.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:23:34, diff=16.333284s, valid=True
2026-06-03T21:23:50.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:23:50.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:23:50.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:23:50.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:23:50.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:23:50.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:23:50.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:24:12, diff=-21.663609s, valid=True
2026-06-03T21:23:50.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:23:50.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:23:50.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:23:50.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88827.337077s, valid=True
2026-06-03T21:23:50.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:23:50.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:23:50.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:23:50.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:23:50.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:23:50.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:23:50.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:23:50.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:23:50.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:23:50.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:23:50.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:23:50.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:23:50.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:23:50.718 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:23:50.926 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:23:51.270 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:23:51.373 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:23:51.373 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:23:51.373 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:23:51.562 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:23:51.562 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:24:21.589 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:24:21.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:24:21.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:24:21.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:24:21.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:24:21.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:24:21.944 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:24:21.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:24:21.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:24:21.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:24:21.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:24:21.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:24:21.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:24:24.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:24:24.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:24:24.741 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:24:24.741 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:24:24.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:24:24.768 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:24:24.769 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:24:24.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:24:24.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:24:24.769 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:24:24.769 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:24:24.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:24:24.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:24:24.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:24:24.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:24:24.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:24:25.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:24:25.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:24:25.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:24:25.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:24:25.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:24:25.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:24:25.046 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:24:25.120 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:24:14
2026-06-03T21:24:25.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87086, datetime.datetime(2026, 6, 3, 21, 24, 14), datetime.datetime(2026, 6, 3, 21, 24, 13), 'salt', 2.42, 100.09, None, 39.83, 127.54, -0.02, 822.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:24:25.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:24:25.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:24:25.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:24:13, diff=12.127144s, valid=True
2026-06-03T21:24:25.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:24:25.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:24:25.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:24:12, diff=13.130269s, valid=True
2026-06-03T21:24:25.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:24:25.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:24:25.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:24:07, diff=18.13767s, valid=True
2026-06-03T21:24:25.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:24:25.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:24:25.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:24:25.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:24:25.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:24:25.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:24:25.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:24:12, diff=13.141186s, valid=True
2026-06-03T21:24:25.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:24:25.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:24:25.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:24:25.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88862.141948s, valid=True
2026-06-03T21:24:25.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:24:25.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:24:25.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:24:25.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:24:25.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:24:25.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:24:25.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:24:25.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:24:25.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:24:25.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:24:25.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:24:25.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:24:25.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:24:25.461 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:24:25.666 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:24:26.004 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:24:26.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:24:26.109 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:24:26.109 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:24:26.305 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:24:26.305 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:24:56.307 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:24:56.308 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:24:56.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:24:56.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:24:56.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:24:56.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:24:56.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:24:56.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:24:56.831 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:24:56.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:24:56.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:24:56.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:24:56.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:24:59.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:24:59.532 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:24:59.533 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:24:59.533 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:24:59.544 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:24:59.556 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:24:59.557 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:24:59.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:24:59.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:24:59.558 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:24:59.558 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:24:59.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:24:59.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:24:59.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:24:59.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:24:59.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:24:59.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:24:59.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:24:59.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:24:59.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:24:59.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:24:59.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:24:59.881 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:24:59.949 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:24:45
2026-06-03T21:24:59.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87087, datetime.datetime(2026, 6, 3, 21, 24, 45), datetime.datetime(2026, 6, 3, 21, 24, 44), 'salt', 2.45, 100.16, None, 44.95, 132.8, -0.03, 822.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:24:59.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:24:59.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:24:59.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:24:44, diff=15.956862s, valid=True
2026-06-03T21:24:59.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:24:59.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:24:59.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:25:12, diff=-12.03996s, valid=True
2026-06-03T21:24:59.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:24:59.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:24:59.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:24:35, diff=24.967611s, valid=True
2026-06-03T21:24:59.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:24:59.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:24:59.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:24:59.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:24:59.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:24:59.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:24:59.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:25:12, diff=-12.028331s, valid=True
2026-06-03T21:24:59.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:24:59.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:24:59.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:24:59.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88896.972492s, valid=True
2026-06-03T21:24:59.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:24:59.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:24:59.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:24:59.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:24:59.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:25:00.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:25:00.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:25:00.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:25:00.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:25:00.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:25:00.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:25:00.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:25:00.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:25:00.307 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:25:00.515 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:25:00.857 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:25:00.960 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:25:00.960 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:25:00.960 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:25:01.135 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:25:01.135 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:25:31.142 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:25:31.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:25:31.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:25:31.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:25:31.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:25:31.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:25:31.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:25:31.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:25:31.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:25:31.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:25:31.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:25:31.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:25:31.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:25:34.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:25:34.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:25:34.359 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:25:34.360 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:25:34.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:25:34.382 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:25:34.382 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:25:34.383 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:25:34.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:25:34.384 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:25:34.384 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:25:34.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:25:34.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:25:34.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:25:34.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:25:34.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:25:34.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:25:34.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:25:34.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:25:34.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:25:34.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:25:34.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:25:34.717 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:25:34.785 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:25:15
2026-06-03T21:25:34.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87088, datetime.datetime(2026, 6, 3, 21, 25, 15), datetime.datetime(2026, 6, 3, 21, 25, 14), 'salt', 2.45, 100.13, None, 46.01, 110.35, -0.02, 821.92, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:25:34.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:25:34.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:25:34.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:25:14, diff=20.79325s, valid=True
2026-06-03T21:25:34.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:25:34.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:25:34.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:25:12, diff=22.796734s, valid=True
2026-06-03T21:25:34.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:25:34.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:25:34.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:25:08, diff=26.804839s, valid=True
2026-06-03T21:25:34.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:25:34.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:25:34.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:25:34.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:25:34.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:25:34.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:25:34.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:25:12, diff=22.808543s, valid=True
2026-06-03T21:25:34.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:25:34.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:25:34.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:25:34.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88931.809362s, valid=True
2026-06-03T21:25:34.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:25:34.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:25:34.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:25:34.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:25:34.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:25:34.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:25:34.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:25:34.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:25:34.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:25:34.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:25:35.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:25:35.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:25:35.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:25:35.130 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:25:35.336 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:25:35.736 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:25:35.838 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:25:35.838 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:25:35.838 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:25:36.018 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:25:36.019 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:26:06.044 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:26:06.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:26:06.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:26:06.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:26:06.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:26:06.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:26:06.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:26:06.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:26:06.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:26:06.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:26:06.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:26:06.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:26:06.661 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:26:09.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:26:09.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:26:09.271 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:26:09.271 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:26:09.280 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:26:09.292 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:26:09.292 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:26:09.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:26:09.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:26:09.292 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:26:09.292 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:26:09.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:26:09.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:26:09.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:26:09.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:26:09.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:26:09.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T21:26:09.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:26:09.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T21:26:09.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:26:09.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:26:09.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:26:09.561 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:26:09.632 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:25:45
2026-06-03T21:26:09.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87089, datetime.datetime(2026, 6, 3, 21, 25, 45), datetime.datetime(2026, 6, 3, 21, 25, 44), 'salt', 2.45, 100.16, None, 43.33, 122.61, -0.03, 822.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:26:09.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:26:09.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:26:09.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:25:44, diff=25.639495s, valid=True
2026-06-03T21:26:09.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:26:09.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T21:26:09.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:26:12, diff=-2.357432s, valid=True
2026-06-03T21:26:09.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:26:09.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:26:09.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:25:40, diff=29.649826s, valid=True
2026-06-03T21:26:09.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:26:09.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:26:09.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:26:09.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:26:09.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:26:09.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T21:26:09.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:26:12, diff=-2.346834s, valid=True
2026-06-03T21:26:09.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:26:09.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:26:09.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:26:09.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=88966.653889s, valid=True
2026-06-03T21:26:09.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:26:09.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:26:09.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:26:09.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:26:09.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:26:09.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:26:09.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:26:09.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:26:09.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:26:09.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:26:09.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:26:09.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:26:09.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:26:09.993 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:26:10.259 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:26:10.630 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:26:10.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:26:10.738 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:26:10.738 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:26:10.918 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:26:10.918 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:26:40.949 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:26:40.949 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:26:40.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:26:41.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:26:41.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:26:41.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:26:41.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:26:41.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:26:41.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:26:41.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:26:41.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:26:41.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:26:41.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:26:44.117 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:26:44.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:26:44.126 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:26:44.126 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:26:44.136 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:26:44.149 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:26:44.150 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:26:44.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:26:44.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:26:44.151 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:26:44.151 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:26:44.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:26:44.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T21:26:44.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:26:44.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T21:26:44.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:26:44.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T21:26:44.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:26:44.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T21:26:44.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:26:44.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:26:44.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:26:44.487 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:26:44.560 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:26:16
2026-06-03T21:26:44.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87090, datetime.datetime(2026, 6, 3, 21, 26, 16), datetime.datetime(2026, 6, 3, 21, 26, 15), 'salt', 2.39, 99.99, None, 49.08, 122.91, 0.0, 821.86, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:26:44.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:26:44.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T21:26:44.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:26:15, diff=29.567834s, valid=True
2026-06-03T21:26:44.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:26:44.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T21:26:44.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:26:12, diff=32.57133s, valid=True
2026-06-03T21:26:44.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:26:44.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T21:26:44.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:26:11, diff=33.579422s, valid=True
2026-06-03T21:26:44.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:26:44.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:26:44.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:26:44.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:26:44.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:26:44.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T21:26:44.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:26:12, diff=32.58311s, valid=True
2026-06-03T21:26:44.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:26:44.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:26:44.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:26:44.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89001.583903s, valid=True
2026-06-03T21:26:44.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:26:44.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:26:44.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:26:44.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:26:44.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:26:44.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:26:44.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:26:44.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:26:44.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:26:44.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:26:44.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:26:44.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:26:44.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:26:44.924 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:26:45.209 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:26:45.561 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:26:45.668 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:26:45.668 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:26:45.669 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:26:45.842 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:26:45.842 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:27:15.854 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:27:15.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:27:15.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:27:16.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:27:16.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:27:16.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:27:16.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:27:16.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:27:16.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:27:16.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:27:16.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:27:16.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:27:16.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:27:19.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:27:19.097 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:27:19.098 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:27:19.098 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:27:19.108 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:27:19.121 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:27:19.122 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:27:19.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:27:19.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:27:19.123 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:27:19.123 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:27:19.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:27:19.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:27:19.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:27:19.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:27:19.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:27:19.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T21:27:19.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:27:19.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T21:27:19.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:27:19.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:27:19.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:27:19.456 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:27:19.525 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:27:16
2026-06-03T21:27:19.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87092, datetime.datetime(2026, 6, 3, 21, 27, 16), datetime.datetime(2026, 6, 3, 21, 27, 16), 'salt', 2.52, 100.16, None, 34.79, 121.04, -0.03, 822.11, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:27:19.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:27:19.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:27:19.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:27:16, diff=3.532704s, valid=True
2026-06-03T21:27:19.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:27:19.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T21:27:19.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:27:12, diff=7.536206s, valid=True
2026-06-03T21:27:19.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:27:19.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:27:19.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:27:14, diff=5.544297s, valid=True
2026-06-03T21:27:19.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:27:19.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:27:19.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:27:19.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:27:19.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:27:19.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T21:27:19.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:27:12, diff=7.548004s, valid=True
2026-06-03T21:27:19.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:27:19.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:27:19.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:27:19.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89036.548819s, valid=True
2026-06-03T21:27:19.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:27:19.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:27:19.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:27:19.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:27:19.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:27:19.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:27:19.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:27:19.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:27:19.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:27:19.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:27:19.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:27:19.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:27:19.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:27:19.877 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:27:20.108 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:27:20.476 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:27:20.580 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:27:20.580 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:27:20.580 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:27:20.813 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:27:20.814 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:27:50.814 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:27:50.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:27:50.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:27:50.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:27:50.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:27:51.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:27:51.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:27:51.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:27:51.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:27:51.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:27:51.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:27:51.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:27:51.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:27:53.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:27:54.002 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:27:54.003 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:27:54.003 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:27:54.013 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:27:54.026 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:27:54.027 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:27:54.027 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:27:54.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:27:54.028 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:27:54.028 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:27:54.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:27:54.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:27:54.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:27:54.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:27:54.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:27:54.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:27:54.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:27:54.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:27:54.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:27:54.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:27:54.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:27:54.366 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:27:54.437 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:27:48
2026-06-03T21:27:54.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87093, datetime.datetime(2026, 6, 3, 21, 27, 48), datetime.datetime(2026, 6, 3, 21, 27, 46), 'salt', 2.59, 100.19, None, 36.31, 132.07, -0.03, 822.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:27:54.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:27:54.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:27:54.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:27:46, diff=8.444727s, valid=True
2026-06-03T21:27:54.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:27:54.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:27:54.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:28:12, diff=-17.551777s, valid=True
2026-06-03T21:27:54.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:27:54.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:27:54.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:27:46, diff=8.45632s, valid=True
2026-06-03T21:27:54.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:27:54.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:27:54.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:27:54.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:27:54.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:27:54.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:27:54.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:28:12, diff=-17.539927s, valid=True
2026-06-03T21:27:54.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:27:54.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:27:54.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:27:54.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89071.460897s, valid=True
2026-06-03T21:27:54.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:27:54.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:27:54.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:27:54.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:27:54.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:27:54.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:27:54.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:27:54.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:27:54.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:27:54.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:27:54.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:27:54.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:27:54.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:27:54.855 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:27:55.061 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:27:55.403 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:27:55.506 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:27:55.506 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:27:55.506 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:27:55.591 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:27:55.592 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:28:25.606 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:28:25.606 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:28:25.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:28:25.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:28:25.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:28:26.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:28:26.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:28:26.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:28:26.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:28:26.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:28:26.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:28:26.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:28:26.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:28:28.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:28:28.856 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:28:28.857 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:28:28.857 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:28:28.868 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:28:28.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:28:28.881 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:28:28.882 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:28:28.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:28:28.882 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:28:28.883 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:28:28.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:28:29.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:28:29.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:28:29.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:28:29.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:28:29.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:28:29.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:28:29.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:28:29.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:28:29.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:28:29.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:28:29.225 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:28:29.294 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:28:18
2026-06-03T21:28:29.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87094, datetime.datetime(2026, 6, 3, 21, 28, 18), datetime.datetime(2026, 6, 3, 21, 28, 17), 'salt', 2.55, 100.09, None, 44.6, 127.12, -0.02, 822.11, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:28:29.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:28:29.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:28:29.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:28:17, diff=12.301348s, valid=True
2026-06-03T21:28:29.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:28:29.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:28:29.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:28:12, diff=17.304673s, valid=True
2026-06-03T21:28:29.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:28:29.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:28:29.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:28:17, diff=12.312628s, valid=True
2026-06-03T21:28:29.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:28:29.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:28:29.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:28:29.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:28:29.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:28:29.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:28:29.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:28:12, diff=17.316173s, valid=True
2026-06-03T21:28:29.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:28:29.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:28:29.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:28:29.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89106.316942s, valid=True
2026-06-03T21:28:29.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:28:29.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:28:29.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:28:29.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:28:29.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:28:29.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:28:29.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:28:29.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:28:29.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:28:29.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:28:29.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:28:29.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:28:29.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:28:29.641 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:28:29.849 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:28:30.214 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:28:30.314 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:28:30.314 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:28:30.314 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:28:30.467 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:28:30.467 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:29:00.491 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:29:00.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:29:00.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:29:00.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:29:00.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:29:01.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:29:01.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:29:01.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:29:01.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:29:01.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:29:01.128 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:29:01.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:29:01.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:29:04.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:29:04.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:29:04.942 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:29:04.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:29:04.951 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:29:04.963 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:29:04.964 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:29:04.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:29:04.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:29:04.964 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:29:04.965 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:29:04.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:29:05.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:29:05.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:29:05.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:29:05.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:29:05.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:29:05.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:29:05.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:29:05.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:29:05.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:29:05.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:29:05.305 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:29:05.377 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:28:48
2026-06-03T21:29:05.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87095, datetime.datetime(2026, 6, 3, 21, 28, 48), datetime.datetime(2026, 6, 3, 21, 28, 47), 'salt', 2.55, 100.16, None, 37.65, 112.84, -0.03, 822.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:29:05.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:29:05.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:29:05.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:28:47, diff=18.384653s, valid=True
2026-06-03T21:29:05.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:29:05.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:29:05.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:29:12, diff=-6.611827s, valid=True
2026-06-03T21:29:05.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:29:05.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:29:05.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:28:47, diff=18.396368s, valid=True
2026-06-03T21:29:05.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:29:05.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:29:05.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:29:05.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:29:05.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:29:05.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:29:05.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:29:12, diff=-6.599911s, valid=True
2026-06-03T21:29:05.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:29:05.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:29:05.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:29:05.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89142.400907s, valid=True
2026-06-03T21:29:05.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:29:05.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:29:05.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:29:05.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:29:05.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:29:05.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:29:05.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:29:05.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:29:05.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:29:05.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:29:05.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:29:05.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:29:05.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:29:05.792 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:29:06.000 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:29:06.346 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:29:06.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:29:06.449 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:29:06.449 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:29:06.632 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:29:06.679 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:29:36.709 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:29:36.709 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:29:36.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:29:36.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:29:36.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:29:37.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:29:37.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:29:37.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:29:37.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:29:37.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:29:37.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:29:37.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:29:37.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:29:39.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:29:39.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:29:39.915 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:29:39.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:29:39.923 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:29:39.935 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:29:39.935 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:29:39.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:29:39.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:29:39.935 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:29:39.935 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:29:39.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:29:40.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:29:40.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:29:40.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:29:40.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:29:40.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:29:40.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:29:40.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:29:40.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:29:40.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:29:40.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:29:40.223 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:29:40.302 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:29:18
2026-06-03T21:29:40.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87096, datetime.datetime(2026, 6, 3, 21, 29, 18), datetime.datetime(2026, 6, 3, 21, 29, 18), 'salt', 2.55, 100.13, None, 35.67, 124.4, -0.02, 822.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:29:40.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:29:40.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:29:40.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:29:18, diff=22.308854s, valid=True
2026-06-03T21:29:40.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:29:40.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:29:40.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:29:12, diff=28.311996s, valid=True
2026-06-03T21:29:40.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:29:40.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:29:40.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:29:18, diff=22.319811s, valid=True
2026-06-03T21:29:40.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:29:40.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:29:40.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:29:40.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:29:40.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:29:40.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:29:40.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:29:12, diff=28.323239s, valid=True
2026-06-03T21:29:40.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:29:40.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:29:40.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:29:40.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89177.324001s, valid=True
2026-06-03T21:29:40.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:29:40.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:29:40.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:29:40.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:29:40.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:29:40.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:29:40.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:29:40.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:29:40.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:29:40.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:29:40.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:29:40.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:29:40.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:29:40.647 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:29:40.852 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:29:41.197 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:29:41.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:29:41.299 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:29:41.300 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:29:41.451 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:29:41.451 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:30:11.457 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:30:11.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:30:11.458 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:30:11.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:30:11.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:30:12.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:30:12.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:30:12.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:30:12.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:30:12.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:30:12.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:30:12.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:30:12.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:30:14.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:30:14.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:30:14.862 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:30:14.862 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:30:14.872 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:30:14.884 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:30:14.885 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:30:14.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:30:14.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:30:14.886 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:30:14.886 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:30:14.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:30:15.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:30:15.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:30:15.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:30:15.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:30:15.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:30:15.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:30:15.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:30:15.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:30:15.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:30:15.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:30:15.227 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:30:15.298 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:29:49
2026-06-03T21:30:15.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87097, datetime.datetime(2026, 6, 3, 21, 29, 49), datetime.datetime(2026, 6, 3, 21, 29, 48), 'salt', 2.52, 100.16, None, 50.77, 129.4, -0.03, 821.99, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:30:15.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:30:15.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:30:15.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:29:48, diff=27.30605s, valid=True
2026-06-03T21:30:15.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:30:15.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:30:15.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:30:12, diff=3.309512s, valid=True
2026-06-03T21:30:15.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:30:15.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:30:15.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:29:48, diff=27.317708s, valid=True
2026-06-03T21:30:15.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:30:15.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:30:15.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:30:15.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:30:15.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:30:15.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:30:15.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:30:12, diff=3.321403s, valid=True
2026-06-03T21:30:15.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:30:15.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:30:15.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:30:15.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89212.322226s, valid=True
2026-06-03T21:30:15.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:30:15.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:30:15.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:30:15.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:30:15.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:30:15.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:30:15.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:30:15.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:30:15.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:30:15.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:30:15.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:30:15.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:30:15.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:30:15.708 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:30:15.916 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:30:16.257 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:30:16.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:30:16.359 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:30:16.360 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:30:16.616 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:30:16.616 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:30:46.647 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:30:46.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:30:46.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:30:46.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:30:47.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:30:47.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:30:47.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:30:47.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:30:47.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:30:47.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:30:47.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:30:47.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:30:47.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:30:50.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:30:50.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:30:50.012 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:30:50.012 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:30:50.020 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:30:50.032 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:30:50.032 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:30:50.032 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:30:50.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:30:50.032 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:30:50.032 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:30:50.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:30:50.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:30:50.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:30:50.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:30:50.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:30:50.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:30:50.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:30:50.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:30:50.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:30:50.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:30:50.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:30:50.305 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:30:50.377 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:30:49
2026-06-03T21:30:50.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87099, datetime.datetime(2026, 6, 3, 21, 30, 49), datetime.datetime(2026, 6, 3, 21, 30, 49), 'salt', 2.49, 100.13, None, 40.4, 130.9, -0.02, 822.11, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:30:50.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:30:50.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:30:50.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:30:49, diff=1.384088s, valid=True
2026-06-03T21:30:50.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:30:50.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:30:50.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:31:12, diff=-21.612714s, valid=True
2026-06-03T21:30:50.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:30:50.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:30:50.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:30:48, diff=2.39474s, valid=True
2026-06-03T21:30:50.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:30:50.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:30:50.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:30:50.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:30:50.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:30:50.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:30:50.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:31:12, diff=-21.601854s, valid=True
2026-06-03T21:30:50.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:30:50.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:30:50.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:30:50.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89247.398895s, valid=True
2026-06-03T21:30:50.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:30:50.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:30:50.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:30:50.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:30:50.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:30:50.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:30:50.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:30:50.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:30:50.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:30:50.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:30:50.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:30:50.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:30:50.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:30:50.718 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:30:50.926 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:30:51.268 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:30:51.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:30:51.371 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:30:51.371 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:30:51.624 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:30:51.625 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:31:21.654 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:31:21.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:31:21.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:31:21.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:31:21.993 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:31:22.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:31:22.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:31:22.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:31:22.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:31:22.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:31:22.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:31:22.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:31:22.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:31:25.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:31:25.026 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:31:25.027 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:31:25.028 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:31:25.040 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:31:25.052 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:31:25.053 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:31:25.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:31:25.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:31:25.054 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:31:25.054 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:31:25.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:31:25.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:31:25.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:31:25.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:31:25.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:31:25.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:31:25.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:31:25.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:31:25.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:31:25.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:31:25.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:31:25.403 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:31:25.495 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:31:20
2026-06-03T21:31:25.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87100, datetime.datetime(2026, 6, 3, 21, 31, 20), datetime.datetime(2026, 6, 3, 21, 31, 19), 'salt', 2.45, 100.06, None, 49.78, 125.73, -0.02, 821.99, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:31:25.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:31:25.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:31:25.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:31:19, diff=6.502813s, valid=True
2026-06-03T21:31:25.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:31:25.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:31:25.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:31:12, diff=13.506305s, valid=True
2026-06-03T21:31:25.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:31:25.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:31:25.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:31:18, diff=7.51436s, valid=True
2026-06-03T21:31:25.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:31:25.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:31:25.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:31:25.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:31:25.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:31:25.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:31:25.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:31:12, diff=13.518095s, valid=True
2026-06-03T21:31:25.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:31:25.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:31:25.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:31:25.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89282.518907s, valid=True
2026-06-03T21:31:25.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:31:25.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:31:25.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:31:25.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:31:25.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:31:25.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:31:25.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:31:25.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:31:25.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:31:25.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:31:25.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:31:25.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:31:25.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:31:25.843 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:31:26.055 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:31:26.405 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:31:26.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:31:26.510 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:31:26.510 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:31:26.697 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:31:26.697 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:31:56.726 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:31:56.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:31:56.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:31:57.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:31:57.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:31:57.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:31:57.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:31:57.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:31:57.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:31:57.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:31:57.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:31:57.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:31:57.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:32:00.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:32:00.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:32:00.308 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:32:00.308 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:32:00.320 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:32:00.333 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:32:00.334 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:32:00.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:32:00.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:32:00.335 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:32:00.335 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:32:00.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:32:00.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:32:00.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:32:00.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:32:00.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:32:00.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:32:00.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:32:00.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:32:00.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:32:00.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:32:00.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:32:00.676 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:32:00.749 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:31:50
2026-06-03T21:32:00.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87101, datetime.datetime(2026, 6, 3, 21, 31, 50), datetime.datetime(2026, 6, 3, 21, 31, 49), 'salt', 2.49, 100.16, None, 45.69, 128.25, -0.02, 822.11, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:32:00.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:32:00.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:32:00.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:31:49, diff=11.756614s, valid=True
2026-06-03T21:32:00.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:32:00.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:32:00.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:32:12, diff=-11.239876s, valid=True
2026-06-03T21:32:00.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:32:00.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:32:00.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:31:49, diff=11.768198s, valid=True
2026-06-03T21:32:00.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:32:00.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:32:00.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:32:00.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:32:00.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:32:00.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:32:00.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:32:12, diff=-11.22811s, valid=True
2026-06-03T21:32:00.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:32:00.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:32:00.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:32:00.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89317.772708s, valid=True
2026-06-03T21:32:00.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:32:00.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:32:00.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:32:00.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:32:00.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:32:00.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:32:00.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:32:00.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:32:00.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:32:00.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:32:00.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:32:01.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:32:01.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:32:01.095 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:32:01.364 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:32:01.739 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:32:01.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:32:01.844 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:32:01.844 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:32:02.018 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:32:02.019 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:32:32.049 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:32:32.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:32:32.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:32:32.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:32:32.427 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:32:32.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:32:32.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:32:32.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:32:32.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:32:32.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:32:32.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:32:32.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:32:32.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:32:35.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:32:35.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:32:35.420 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:32:35.420 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:32:35.428 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:32:35.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:32:35.440 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:32:35.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:32:35.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:32:35.441 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:32:35.441 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:32:35.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:32:35.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:32:35.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:32:35.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:32:35.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:32:35.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:32:35.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:32:35.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:32:35.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:32:35.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:32:35.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:32:35.712 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:32:35.784 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:32:20
2026-06-03T21:32:35.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87102, datetime.datetime(2026, 6, 3, 21, 32, 20), datetime.datetime(2026, 6, 3, 21, 32, 19), 'salt', 2.42, 100.13, None, 42.59, 119.53, -0.02, 822.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:32:35.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:32:35.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:32:35.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:32:19, diff=16.790912s, valid=True
2026-06-03T21:32:35.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:32:35.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:32:35.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:32:12, diff=23.794064s, valid=True
2026-06-03T21:32:35.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:32:35.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:32:35.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:32:19, diff=16.801432s, valid=True
2026-06-03T21:32:35.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:32:35.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:32:35.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:32:35.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:32:35.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:32:35.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:32:35.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:32:12, diff=23.804809s, valid=True
2026-06-03T21:32:35.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:32:35.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:32:35.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:32:35.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89352.805538s, valid=True
2026-06-03T21:32:35.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:32:35.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:32:35.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:32:35.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:32:35.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:32:35.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:32:35.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:32:35.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:32:35.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:32:35.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:32:36.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:32:36.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:32:36.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:32:36.124 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:32:36.332 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:32:36.676 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:32:36.780 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:32:36.780 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:32:36.780 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:32:37.025 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:32:37.025 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:33:07.055 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:33:07.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:33:07.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:33:07.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:33:07.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:33:07.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:33:07.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:33:07.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:33:07.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:33:07.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:33:07.674 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:33:07.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:33:07.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:33:10.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:33:10.538 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:33:10.539 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:33:10.539 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:33:10.550 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:33:10.564 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:33:10.565 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:33:10.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:33:10.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:33:10.566 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:33:10.566 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:33:10.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:33:10.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:33:10.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:33:10.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:33:10.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:33:10.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:33:10.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:33:10.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:33:10.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:33:10.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:33:10.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:33:10.841 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:33:10.910 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:32:50
2026-06-03T21:33:10.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87103, datetime.datetime(2026, 6, 3, 21, 32, 50), datetime.datetime(2026, 6, 3, 21, 32, 50), 'salt', 2.49, 100.1, None, 46.93, 124.4, -0.01, 822.05, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:33:10.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:33:10.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:33:10.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:32:50, diff=20.917088s, valid=True
2026-06-03T21:33:10.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:33:10.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:33:10.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:33:12, diff=-1.079696s, valid=True
2026-06-03T21:33:10.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:33:10.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:33:10.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:32:49, diff=21.927841s, valid=True
2026-06-03T21:33:10.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:33:10.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:33:10.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:33:10.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:33:10.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:33:10.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:33:10.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:33:12, diff=-1.068762s, valid=True
2026-06-03T21:33:10.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:33:10.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:33:10.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:33:10.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89387.931986s, valid=True
2026-06-03T21:33:10.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:33:10.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:33:10.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:33:10.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:33:10.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:33:10.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:33:10.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:33:10.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:33:11.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:33:11.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:33:11.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:33:11.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:33:11.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:33:11.333 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:33:11.544 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:33:11.903 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:33:12.008 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:33:12.008 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:33:12.008 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:33:12.190 [WARNING] [MainThread] [clean.py] [copy_files()] Error uploading images and files to the web server: rsync: [sender] read errors mapping "/home/io/development/weatherplots/weatherplots/images/atlas/ref_zp.dat": No data available (61)
WARNING: atlas/ref_zp.dat failed verification -- update discarded (will try again).
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1338) [sender=3.2.7]

2026-06-03T21:33:12.191 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:33:42.221 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:33:42.221 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:33:42.221 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:33:42.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:33:42.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:33:42.601 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:33:42.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:33:42.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:33:42.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:33:42.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:33:42.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:33:42.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:33:42.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:33:45.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:33:45.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:33:45.245 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:33:45.245 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:33:45.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:33:45.268 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:33:45.269 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:33:45.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:33:45.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:33:45.270 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:33:45.271 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:33:45.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:33:45.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:33:45.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:33:45.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:33:45.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:33:45.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:33:45.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:33:45.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:33:45.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:33:45.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:33:45.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:33:45.608 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:33:45.680 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:33:21
2026-06-03T21:33:45.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87104, datetime.datetime(2026, 6, 3, 21, 33, 21), datetime.datetime(2026, 6, 3, 21, 33, 20), 'salt', 2.52, 100.13, None, 43.57, 129.47, -0.02, 822.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:33:45.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:33:45.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:33:45.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:33:20, diff=25.687658s, valid=True
2026-06-03T21:33:45.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:33:45.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:33:45.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:33:12, diff=33.691116s, valid=True
2026-06-03T21:33:45.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:33:45.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:33:45.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:33:19, diff=26.698866s, valid=True
2026-06-03T21:33:45.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:33:45.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:33:45.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:33:45.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:33:45.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:33:45.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:33:45.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:33:12, diff=33.702174s, valid=True
2026-06-03T21:33:45.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:33:45.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:33:45.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:33:45.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89422.702899s, valid=True
2026-06-03T21:33:45.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:33:45.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:33:45.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:33:45.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:33:45.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:33:45.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:33:45.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:33:45.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:33:45.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:33:45.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:33:45.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:33:45.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:33:45.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:33:46.026 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:33:46.235 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:33:46.581 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:33:46.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:33:46.684 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:33:46.684 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:33:46.763 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:33:46.763 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:34:16.770 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:34:16.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:34:16.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:34:16.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:34:16.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:34:17.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:34:17.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:34:17.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:34:17.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:34:17.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:34:17.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:34:17.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:34:17.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:34:20.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:34:20.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:34:20.032 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:34:20.032 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:34:20.042 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:34:20.053 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:34:20.054 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:34:20.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:34:20.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:34:20.054 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:34:20.054 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:34:20.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:34:20.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T21:34:20.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:34:20.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T21:34:20.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:34:20.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:34:20.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:34:20.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:34:20.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:34:20.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:34:20.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:34:20.337 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:34:20.410 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:33:51
2026-06-03T21:34:20.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87105, datetime.datetime(2026, 6, 3, 21, 33, 51), datetime.datetime(2026, 6, 3, 21, 33, 50), 'salt', 2.52, 100.16, None, 43.4, 115.71, -0.03, 822.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:34:20.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:34:20.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T21:34:20.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:33:50, diff=30.416169s, valid=True
2026-06-03T21:34:20.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:34:20.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:34:20.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:34:12, diff=8.419036s, valid=True
2026-06-03T21:34:20.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:34:20.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T21:34:20.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:33:50, diff=30.425654s, valid=True
2026-06-03T21:34:20.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:34:20.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:34:20.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:34:20.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:34:20.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:34:20.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:34:20.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:34:12, diff=8.428735s, valid=True
2026-06-03T21:34:20.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:34:20.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:34:20.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:34:20.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89457.429382s, valid=True
2026-06-03T21:34:20.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:34:20.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:34:20.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:34:20.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:34:20.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:34:20.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:34:20.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:34:20.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:34:20.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:34:20.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:34:20.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:34:20.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:34:20.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:34:20.815 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:34:21.029 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:34:21.377 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:34:21.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:34:21.480 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:34:21.480 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:34:24.233 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:34:24.233 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:34:54.234 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:34:54.235 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:34:54.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:34:54.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:34:54.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:34:54.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:34:54.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:34:54.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:34:54.715 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:34:54.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:34:54.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:34:54.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:34:54.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:34:57.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:34:57.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:34:57.398 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:34:57.399 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:34:57.409 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:34:57.422 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:34:57.422 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:34:57.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:34:57.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:34:57.423 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:34:57.424 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:34:57.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:34:57.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:34:57.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:34:57.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:34:57.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:34:57.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:34:57.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:34:57.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:34:57.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:34:57.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:34:57.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:34:57.766 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:34:57.837 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:34:51
2026-06-03T21:34:57.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87107, datetime.datetime(2026, 6, 3, 21, 34, 51), datetime.datetime(2026, 6, 3, 21, 34, 51), 'salt', 2.52, 100.16, None, 41.03, 122.78, -0.03, 822.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:34:57.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:34:57.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:34:57.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:34:51, diff=6.84454s, valid=True
2026-06-03T21:34:57.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:34:57.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:34:57.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:35:12, diff=-14.151957s, valid=True
2026-06-03T21:34:57.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:34:57.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:34:57.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:34:50, diff=7.856151s, valid=True
2026-06-03T21:34:57.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:34:57.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:34:57.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:34:57.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:34:57.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:34:57.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:34:57.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:35:12, diff=-14.140086s, valid=True
2026-06-03T21:34:57.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:34:57.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:34:57.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:34:57.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89494.860753s, valid=True
2026-06-03T21:34:57.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:34:57.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:34:57.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:34:57.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:34:57.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:34:57.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:34:57.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:34:57.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:34:57.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:34:58.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:34:58.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:34:58.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:34:58.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:34:58.186 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:34:58.392 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:34:58.733 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:34:58.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:34:58.837 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:34:58.837 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:34:58.995 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:34:58.995 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:35:29.025 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:35:29.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:35:29.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:35:29.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:35:29.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:35:29.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:35:29.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:35:29.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:35:29.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:35:29.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:35:29.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:35:29.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:35:29.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:35:32.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:35:32.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:35:32.322 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:35:32.322 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:35:32.333 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:35:32.347 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:35:32.348 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:35:32.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:35:32.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:35:32.349 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:35:32.349 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:35:32.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:35:32.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:35:32.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:35:32.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:35:32.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:35:32.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:35:32.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:35:32.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:35:32.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:35:32.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:35:32.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:35:32.662 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:35:32.732 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:35:22
2026-06-03T21:35:32.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87108, datetime.datetime(2026, 6, 3, 21, 35, 22), datetime.datetime(2026, 6, 3, 21, 35, 21), 'salt', 2.59, 100.19, None, 47.03, 115.73, -0.03, 822.17, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:35:32.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:35:32.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:35:32.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:35:21, diff=11.739839s, valid=True
2026-06-03T21:35:32.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:35:32.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:35:32.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:35:12, diff=20.743211s, valid=True
2026-06-03T21:35:32.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:35:32.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:35:32.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:35:20, diff=12.751101s, valid=True
2026-06-03T21:35:32.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:35:32.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:35:32.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:35:32.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:35:32.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:35:32.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:35:32.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:35:12, diff=20.754676s, valid=True
2026-06-03T21:35:32.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:35:32.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:35:32.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:35:32.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89529.75545s, valid=True
2026-06-03T21:35:32.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:35:32.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:35:32.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:35:32.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:35:32.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:35:32.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:35:32.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:35:32.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:35:32.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:35:32.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:35:32.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:35:32.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:35:33.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:35:33.074 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:35:33.290 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:35:33.636 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:35:33.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:35:33.738 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:35:33.738 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:35:33.928 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:35:33.928 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:36:03.930 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:36:03.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:36:03.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:36:04.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:36:04.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:36:04.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:36:04.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:36:04.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:36:04.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:36:04.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:36:04.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:36:04.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:36:04.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:36:07.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:36:07.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:36:07.244 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:36:07.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:36:07.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:36:07.266 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:36:07.267 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:36:07.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:36:07.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:36:07.268 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:36:07.268 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:36:07.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:36:07.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:36:07.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:36:07.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:36:07.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:36:07.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:36:07.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:36:07.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:36:07.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:36:07.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:36:07.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:36:07.597 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:36:07.666 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:35:52
2026-06-03T21:36:07.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87109, datetime.datetime(2026, 6, 3, 21, 35, 52), datetime.datetime(2026, 6, 3, 21, 35, 51), 'salt', 2.45, 100.16, None, 41.25, 135.62, -0.03, 822.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:36:07.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:36:07.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:36:07.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:35:51, diff=16.673661s, valid=True
2026-06-03T21:36:07.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:36:07.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:36:07.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:36:12, diff=-4.322958s, valid=True
2026-06-03T21:36:07.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:36:07.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:36:07.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:35:51, diff=16.684963s, valid=True
2026-06-03T21:36:07.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:36:07.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:36:07.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:36:07.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:36:07.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:36:07.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:36:07.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:36:12, diff=-4.311447s, valid=True
2026-06-03T21:36:07.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:36:07.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:36:07.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:36:07.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89564.689342s, valid=True
2026-06-03T21:36:07.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:36:07.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:36:07.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:36:07.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:36:07.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:36:07.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:36:07.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:36:07.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:36:07.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:36:07.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:36:07.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:36:07.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:36:07.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:36:08.010 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:36:08.218 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:36:08.620 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:36:08.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:36:08.721 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:36:08.722 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:36:08.904 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:36:08.904 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:36:38.918 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:36:38.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:36:38.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:36:39.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:36:39.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:36:39.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:36:39.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:36:39.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:36:39.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:36:39.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:36:39.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:36:39.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:36:39.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:36:42.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:36:42.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:36:42.188 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:36:42.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:36:42.198 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:36:42.211 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:36:42.211 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:36:42.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:36:42.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:36:42.213 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:36:42.213 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:36:42.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:36:42.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:36:42.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:36:42.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:36:42.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:36:42.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:36:42.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:36:42.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:36:42.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:36:42.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:36:42.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:36:42.566 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:36:42.638 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:36:22
2026-06-03T21:36:42.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87110, datetime.datetime(2026, 6, 3, 21, 36, 22), datetime.datetime(2026, 6, 3, 21, 36, 21), 'salt', 2.55, 100.19, None, 38.28, 133.53, -0.03, 822.11, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:36:42.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:36:42.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:36:42.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:36:21, diff=21.646123s, valid=True
2026-06-03T21:36:42.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:36:42.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:36:42.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:36:12, diff=30.649756s, valid=True
2026-06-03T21:36:42.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:36:42.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:36:42.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:36:21, diff=21.658203s, valid=True
2026-06-03T21:36:42.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:36:42.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:36:42.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:36:42.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:36:42.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:36:42.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:36:42.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:36:12, diff=30.662048s, valid=True
2026-06-03T21:36:42.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:36:42.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:36:42.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:36:42.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89599.662913s, valid=True
2026-06-03T21:36:42.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:36:42.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:36:42.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:36:42.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:36:42.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:36:42.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:36:42.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:36:42.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:36:42.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:36:42.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:36:42.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:36:42.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:36:42.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:36:42.983 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:36:43.188 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:36:43.529 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:36:43.631 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:36:43.631 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:36:43.631 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:36:43.887 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:36:43.887 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:37:13.890 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:37:13.890 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:37:13.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:37:14.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:37:14.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:37:14.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:37:14.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:37:14.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:37:14.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:37:14.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:37:14.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:37:14.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:37:14.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:37:17.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:37:17.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:37:17.587 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:37:17.587 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:37:17.598 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:37:17.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:37:17.611 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:37:17.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:37:17.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:37:17.612 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:37:17.612 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:37:17.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:37:17.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:37:17.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:37:17.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:37:17.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:37:17.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:37:17.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:37:17.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:37:17.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:37:17.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:37:17.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:37:17.942 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:37:18.017 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:36:52
2026-06-03T21:37:18.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87111, datetime.datetime(2026, 6, 3, 21, 36, 52), datetime.datetime(2026, 6, 3, 21, 36, 52), 'salt', 2.49, 100.13, None, 41.21, 128.37, -0.02, 822.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:37:18.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:37:18.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:37:18.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:36:52, diff=26.024684s, valid=True
2026-06-03T21:37:18.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:37:18.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:37:18.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:37:12, diff=6.02818s, valid=True
2026-06-03T21:37:18.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:37:18.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:37:18.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:36:52, diff=26.036345s, valid=True
2026-06-03T21:37:18.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:37:18.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:37:18.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:37:18.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:37:18.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:37:18.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:37:18.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:37:12, diff=6.040039s, valid=True
2026-06-03T21:37:18.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:37:18.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:37:18.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:37:18.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89635.04085s, valid=True
2026-06-03T21:37:18.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:37:18.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:37:18.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:37:18.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:37:18.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:37:18.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:37:18.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:37:18.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:37:18.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:37:18.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:37:18.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:37:18.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:37:18.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:37:18.437 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:37:18.641 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:37:18.980 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:37:19.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:37:19.083 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:37:19.083 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:37:19.295 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:37:19.295 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:37:49.326 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:37:49.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:37:49.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:37:49.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:37:49.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:37:49.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:37:49.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:37:49.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:37:49.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:37:49.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:37:49.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:37:49.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:37:49.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:37:52.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:37:52.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:37:52.476 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:37:52.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:37:52.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:37:52.499 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:37:52.500 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:37:52.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:37:52.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:37:52.501 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:37:52.501 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:37:52.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:37:52.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T21:37:52.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:37:52.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T21:37:52.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:37:52.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T21:37:52.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:37:52.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T21:37:52.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:37:52.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:37:52.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:37:52.842 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:37:52.912 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:37:23
2026-06-03T21:37:52.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87112, datetime.datetime(2026, 6, 3, 21, 37, 23), datetime.datetime(2026, 6, 3, 21, 37, 22), 'salt', 2.49, 100.13, None, 43.22, 118.2, -0.02, 822.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:37:52.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:37:52.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T21:37:52.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:37:22, diff=30.91986s, valid=True
2026-06-03T21:37:52.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:37:52.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T21:37:52.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:37:12, diff=40.923348s, valid=True
2026-06-03T21:37:52.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:37:52.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T21:37:52.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:37:22, diff=30.931641s, valid=True
2026-06-03T21:37:52.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:37:52.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:37:52.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:37:52.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:37:52.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:37:52.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T21:37:52.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:37:12, diff=40.935356s, valid=True
2026-06-03T21:37:52.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:37:52.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:37:52.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:37:52.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89669.93618s, valid=True
2026-06-03T21:37:52.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:37:52.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:37:52.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:37:52.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:37:52.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:37:53.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:37:53.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:37:53.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:37:53.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:37:53.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:37:53.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:37:53.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:37:53.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:37:53.257 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:37:53.455 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:37:53.791 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:37:53.892 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:37:53.892 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:37:53.892 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:37:54.103 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:37:54.103 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:38:24.104 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:38:24.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:38:24.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:38:24.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:38:24.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:38:24.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:38:24.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:38:24.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:38:24.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:38:24.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:38:24.849 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:38:24.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:38:24.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:38:27.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:38:27.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:38:27.711 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:38:27.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:38:27.722 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:38:27.734 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:38:27.735 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:38:27.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:38:27.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:38:27.736 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:38:27.736 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:38:27.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:38:27.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:38:27.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:38:27.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:38:27.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:38:28.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:38:28.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:38:28.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:38:28.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:38:28.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:38:28.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:38:28.070 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:38:28.139 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:38:23
2026-06-03T21:38:28.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87114, datetime.datetime(2026, 6, 3, 21, 38, 23), datetime.datetime(2026, 6, 3, 21, 38, 22), 'salt', 2.45, 100.13, None, 44.17, 120.99, -0.02, 822.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:38:28.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:38:28.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:38:28.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:38:22, diff=6.147016s, valid=True
2026-06-03T21:38:28.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:38:28.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:38:28.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:38:12, diff=16.150497s, valid=True
2026-06-03T21:38:28.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:38:28.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:38:28.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:38:23, diff=5.158541s, valid=True
2026-06-03T21:38:28.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:38:28.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:38:28.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:38:28.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:38:28.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:38:28.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:38:28.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:38:12, diff=16.162199s, valid=True
2026-06-03T21:38:28.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:38:28.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:38:28.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:38:28.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89705.162993s, valid=True
2026-06-03T21:38:28.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:38:28.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:38:28.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:38:28.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:38:28.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:38:28.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:38:28.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:38:28.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:38:28.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:38:28.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:38:28.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:38:28.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:38:28.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:38:28.552 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:38:28.755 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:38:29.087 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:38:29.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:38:29.188 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:38:29.188 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:38:29.275 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:38:29.275 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:38:59.277 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:38:59.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:38:59.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:38:59.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:38:59.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:38:59.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:38:59.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:38:59.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:38:59.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:38:59.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:38:59.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:38:59.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:38:59.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:39:02.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:39:02.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:39:02.360 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:39:02.360 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:39:02.371 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:39:02.383 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:39:02.384 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:39:02.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:39:02.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:39:02.385 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:39:02.385 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:39:02.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:39:02.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:39:02.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:39:02.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:39:02.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:39:02.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:39:02.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:39:02.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:39:02.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:39:02.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:39:02.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:39:02.699 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:39:02.770 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:38:53
2026-06-03T21:39:02.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87115, datetime.datetime(2026, 6, 3, 21, 38, 53), datetime.datetime(2026, 6, 3, 21, 38, 53), 'salt', 2.45, 100.19, None, 43.57, 122.28, -0.03, 822.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:39:02.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:39:02.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:39:02.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:38:53, diff=9.776923s, valid=True
2026-06-03T21:39:02.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:39:02.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:39:02.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:39:12, diff=-9.219814s, valid=True
2026-06-03T21:39:02.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:39:02.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:39:02.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:38:53, diff=9.787919s, valid=True
2026-06-03T21:39:02.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:39:02.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:39:02.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:39:02.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:39:02.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:39:02.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:39:02.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:39:12, diff=-9.208582s, valid=True
2026-06-03T21:39:02.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:39:02.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:39:02.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:39:02.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89739.79219s, valid=True
2026-06-03T21:39:02.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:39:02.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:39:02.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:39:02.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:39:02.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:39:02.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:39:02.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:39:02.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:39:02.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:39:02.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:39:02.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:39:03.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:39:03.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:39:03.112 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:39:03.312 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:39:03.646 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:39:03.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:39:03.747 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:39:03.747 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:39:03.929 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:39:03.929 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:39:33.958 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:39:33.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:39:33.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:39:34.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:39:34.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:39:34.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:39:34.698 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:39:34.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:39:34.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:39:34.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:39:34.728 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:39:34.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:39:34.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:39:37.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:39:37.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:39:37.401 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:39:37.402 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:39:37.411 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:39:37.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:39:37.425 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:39:37.425 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:39:37.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:39:37.426 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:39:37.426 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:39:37.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:39:37.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:39:37.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:39:37.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:39:37.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:39:37.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:39:37.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:39:37.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:39:37.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:39:37.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:39:37.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:39:37.807 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:39:37.887 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:39:24
2026-06-03T21:39:37.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87116, datetime.datetime(2026, 6, 3, 21, 39, 24), datetime.datetime(2026, 6, 3, 21, 39, 23), 'salt', 2.45, 100.13, None, 46.4, 120.05, -0.02, 822.35, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:39:37.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:39:37.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:39:37.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:39:23, diff=14.893191s, valid=True
2026-06-03T21:39:37.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:39:37.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:39:37.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:39:12, diff=25.896048s, valid=True
2026-06-03T21:39:37.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:39:37.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:39:37.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:39:23, diff=14.902604s, valid=True
2026-06-03T21:39:37.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:39:37.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:39:37.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:39:37.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:39:37.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:39:37.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:39:37.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:39:12, diff=25.905691s, valid=True
2026-06-03T21:39:37.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:39:37.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:39:37.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:39:37.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89774.90634s, valid=True
2026-06-03T21:39:37.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:39:37.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:39:37.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:39:37.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:39:37.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:39:37.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:39:37.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:39:37.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:39:37.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:39:38.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:39:38.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:39:38.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:39:38.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:39:38.244 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:39:38.444 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:39:38.778 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:39:38.880 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:39:38.880 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:39:38.880 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:39:39.101 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:39:39.101 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:40:09.131 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:40:09.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:40:09.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:40:09.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:40:09.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:40:09.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:40:09.768 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:40:09.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:40:09.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:40:09.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:40:09.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:40:09.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:40:09.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:40:12.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:40:12.457 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:40:12.458 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:40:12.458 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:40:12.469 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:40:12.481 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:40:12.482 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:40:12.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:40:12.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:40:12.483 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:40:12.483 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:40:12.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:40:12.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:40:12.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:40:12.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:40:12.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:40:12.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:40:12.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:40:12.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:40:12.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:40:12.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:40:12.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:40:12.811 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:40:12.881 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:39:54
2026-06-03T21:40:12.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87117, datetime.datetime(2026, 6, 3, 21, 39, 54), datetime.datetime(2026, 6, 3, 21, 39, 53), 'salt', 2.55, 100.16, None, 43.64, 119.25, -0.03, 822.29, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:40:12.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:40:12.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:40:12.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:39:53, diff=19.888503s, valid=True
2026-06-03T21:40:12.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:40:12.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:40:12.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:40:12, diff=0.89201s, valid=True
2026-06-03T21:40:12.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:40:12.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:40:12.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:39:54, diff=18.900123s, valid=True
2026-06-03T21:40:12.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:40:12.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:40:12.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:40:12.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:40:12.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:40:12.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:40:12.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:40:12, diff=0.903862s, valid=True
2026-06-03T21:40:12.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:40:12.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:40:12.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:40:12.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89809.904687s, valid=True
2026-06-03T21:40:12.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:40:12.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:40:12.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:40:12.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:40:12.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:40:12.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:40:12.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:40:12.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:40:12.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:40:13.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:40:13.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:40:13.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:40:13.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:40:13.229 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:40:13.425 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:40:13.754 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:40:13.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:40:13.910 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:40:13.910 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:40:14.094 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:40:14.095 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:40:44.125 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:40:44.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:40:44.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:40:44.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:40:44.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:40:44.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:40:44.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:40:44.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:40:44.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:40:44.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:40:44.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:40:44.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:40:44.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:40:47.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:40:47.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:40:47.933 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:40:47.933 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:40:47.943 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:40:47.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:40:47.956 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:40:47.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:40:47.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:40:47.957 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:40:47.958 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:40:47.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:40:48.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:40:48.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:40:48.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:40:48.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:40:48.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:40:48.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:40:48.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:40:48.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:40:48.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:40:48.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:40:48.289 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:40:48.360 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:40:24
2026-06-03T21:40:48.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87118, datetime.datetime(2026, 6, 3, 21, 40, 24), datetime.datetime(2026, 6, 3, 21, 40, 23), 'salt', 2.52, 100.1, None, 35.6, 127.9, -0.02, 822.42, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:40:48.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:40:48.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:40:48.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:40:23, diff=25.367993s, valid=True
2026-06-03T21:40:48.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:40:48.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:40:48.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:40:12, diff=36.371485s, valid=True
2026-06-03T21:40:48.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:40:48.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:40:48.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:40:24, diff=24.379616s, valid=True
2026-06-03T21:40:48.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:40:48.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:40:48.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:40:48.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:40:48.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:40:48.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:40:48.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:40:12, diff=36.383354s, valid=True
2026-06-03T21:40:48.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:40:48.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:40:48.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:40:48.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89845.38418s, valid=True
2026-06-03T21:40:48.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:40:48.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:40:48.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:40:48.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:40:48.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:40:48.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:40:48.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:40:48.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:40:48.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:40:48.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:40:48.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:40:48.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:40:48.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:40:48.704 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:40:48.903 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:40:49.241 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:40:49.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:40:49.344 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:40:49.344 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:40:49.551 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:40:49.551 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:41:19.582 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:41:19.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:41:19.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:41:20.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:41:20.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:41:20.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:41:20.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:41:20.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:41:20.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:41:20.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:41:20.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:41:20.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:41:20.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:41:23.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:41:23.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:41:23.975 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:41:23.976 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:41:23.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:41:23.998 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:41:23.999 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:41:23.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:41:24.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:41:24.000 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:41:24.000 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:41:24.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:41:24.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T21:41:24.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:41:24.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T21:41:24.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:41:24.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:41:24.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:41:24.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:41:24.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:41:24.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:41:24.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:41:24.337 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:41:24.405 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:40:54
2026-06-03T21:41:24.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87119, datetime.datetime(2026, 6, 3, 21, 40, 54), datetime.datetime(2026, 6, 3, 21, 40, 54), 'salt', 2.52, 100.19, None, 45.13, 128.74, -0.03, 822.23, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:41:24.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:41:24.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T21:41:24.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:40:54, diff=30.412947s, valid=True
2026-06-03T21:41:24.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:41:24.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:41:24.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:41:12, diff=12.416472s, valid=True
2026-06-03T21:41:24.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:41:24.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T21:41:24.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:40:54, diff=30.424782s, valid=True
2026-06-03T21:41:24.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:41:24.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:41:24.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:41:24.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:41:24.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:41:24.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:41:24.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:41:12, diff=12.429175s, valid=True
2026-06-03T21:41:24.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:41:24.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:41:24.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:41:24.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89881.430828s, valid=True
2026-06-03T21:41:24.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:41:24.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:41:24.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:41:24.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:41:24.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:41:24.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:41:24.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:41:24.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:41:24.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:41:24.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:41:24.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:41:24.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:41:24.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:41:24.762 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:41:25.032 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:41:25.364 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:41:25.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:41:25.464 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:41:25.464 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:41:25.656 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:41:25.656 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:41:55.675 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:41:55.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:41:55.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:41:55.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:41:56.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:41:56.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:41:56.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:41:56.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:41:56.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:41:56.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:41:56.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:41:56.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:41:56.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:41:58.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:41:58.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:41:58.991 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:41:58.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:41:59.002 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:41:59.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:41:59.016 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:41:59.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:41:59.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:41:59.017 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:41:59.017 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:41:59.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:41:59.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:41:59.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:41:59.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:41:59.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:41:59.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:41:59.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:41:59.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:41:59.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:41:59.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:41:59.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:41:59.360 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:41:59.432 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:41:55
2026-06-03T21:41:59.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87121, datetime.datetime(2026, 6, 3, 21, 41, 55), datetime.datetime(2026, 6, 3, 21, 41, 54), 'salt', 2.39, 100.06, None, 32.57, 126.98, -0.01, 822.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:41:59.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:41:59.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:41:59.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:41:54, diff=5.4406s, valid=True
2026-06-03T21:41:59.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:41:59.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:41:59.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:42:12, diff=-12.555897s, valid=True
2026-06-03T21:41:59.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:41:59.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:41:59.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:41:55, diff=4.452579s, valid=True
2026-06-03T21:41:59.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:41:59.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:41:59.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:41:59.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:41:59.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:41:59.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:41:59.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:42:12, diff=-12.543666s, valid=True
2026-06-03T21:41:59.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:41:59.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:41:59.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:41:59.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89916.457148s, valid=True
2026-06-03T21:41:59.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:41:59.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:41:59.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:41:59.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:41:59.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:41:59.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:41:59.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:41:59.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:41:59.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:41:59.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:41:59.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:41:59.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:41:59.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:41:59.780 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:41:59.991 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:42:00.330 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:42:00.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:42:00.431 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:42:00.431 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:42:00.719 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:42:00.719 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:42:30.749 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:42:30.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:42:30.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:42:31.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:42:31.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:42:31.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:42:31.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:42:31.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:42:31.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:42:31.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:42:31.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:42:31.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:42:31.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:42:34.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:42:34.107 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:42:34.107 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:42:34.108 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:42:34.119 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:42:34.132 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:42:34.133 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:42:34.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:42:34.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:42:34.134 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:42:34.134 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:42:34.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:42:34.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:42:34.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:42:34.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:42:34.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:42:34.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:42:34.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:42:34.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:42:34.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:42:34.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:42:34.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:42:34.476 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:42:34.550 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:42:25
2026-06-03T21:42:34.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87122, datetime.datetime(2026, 6, 3, 21, 42, 25), datetime.datetime(2026, 6, 3, 21, 42, 24), 'salt', 2.49, 100.16, None, 42.9, 134.97, -0.02, 822.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:42:34.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:42:34.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:42:34.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:42:24, diff=10.557461s, valid=True
2026-06-03T21:42:34.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:42:34.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:42:34.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:42:12, diff=22.560968s, valid=True
2026-06-03T21:42:34.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:42:34.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:42:34.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:42:25, diff=9.569199s, valid=True
2026-06-03T21:42:34.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:42:34.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:42:34.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:42:34.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:42:34.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:42:34.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:42:34.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:42:12, diff=22.57291s, valid=True
2026-06-03T21:42:34.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:42:34.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:42:34.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:42:34.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89951.573728s, valid=True
2026-06-03T21:42:34.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:42:34.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:42:34.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:42:34.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:42:34.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:42:34.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:42:34.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:42:34.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:42:34.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:42:34.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:42:34.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:42:34.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:42:34.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:42:34.964 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:42:35.160 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:42:35.492 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:42:35.592 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:42:35.593 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:42:35.593 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:42:35.860 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:42:35.860 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:43:05.886 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:43:05.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:43:05.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:43:06.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:43:06.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:43:06.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:43:06.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:43:06.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:43:06.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:43:06.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:43:06.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:43:06.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:43:06.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:43:09.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:43:09.333 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:43:09.334 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:43:09.334 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:43:09.344 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:43:09.357 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:43:09.358 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:43:09.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:43:09.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:43:09.359 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:43:09.359 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:43:09.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:43:09.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:43:09.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:43:09.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:43:09.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:43:09.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:43:09.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:43:09.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:43:09.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:43:09.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:43:09.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:43:09.701 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:43:09.777 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:42:55
2026-06-03T21:43:09.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87123, datetime.datetime(2026, 6, 3, 21, 42, 55), datetime.datetime(2026, 6, 3, 21, 42, 55), 'salt', 2.45, 100.13, None, 42.52, 130.15, -0.02, 822.35, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:43:09.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:43:09.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:43:09.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:42:55, diff=14.784495s, valid=True
2026-06-03T21:43:09.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:43:09.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:43:09.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:43:12, diff=-2.211982s, valid=True
2026-06-03T21:43:09.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:43:09.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:43:09.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:42:55, diff=14.796181s, valid=True
2026-06-03T21:43:09.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:43:09.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:43:09.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:43:09.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:43:09.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:43:09.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:43:09.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:43:12, diff=-2.200107s, valid=True
2026-06-03T21:43:09.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:43:09.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:43:09.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:43:09.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=89986.80072s, valid=True
2026-06-03T21:43:09.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:43:09.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:43:09.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:43:09.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:43:09.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:43:09.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:43:09.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:43:09.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:43:09.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:43:09.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:43:10.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:43:10.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:43:10.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:43:10.154 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:43:10.380 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:43:10.713 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:43:10.813 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:43:10.813 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:43:10.813 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:43:11.010 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:43:11.010 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:43:41.040 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:43:41.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:43:41.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:43:41.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:43:41.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:43:41.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:43:41.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:43:41.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:43:41.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:43:41.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:43:41.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:43:41.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:43:41.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:43:44.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:43:44.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:43:44.351 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:43:44.351 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:43:44.360 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:43:44.373 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:43:44.374 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:43:44.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:43:44.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:43:44.375 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:43:44.375 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:43:44.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:43:44.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:43:44.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:43:44.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:43:44.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:43:44.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:43:44.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:43:44.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:43:44.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:43:44.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:43:44.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:43:44.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:43:44.769 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:43:26
2026-06-03T21:43:44.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87124, datetime.datetime(2026, 6, 3, 21, 43, 26), datetime.datetime(2026, 6, 3, 21, 43, 25), 'salt', 2.52, 100.16, None, 43.86, 126.96, -0.03, 822.48, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:43:44.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:43:44.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:43:44.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:43:25, diff=19.775987s, valid=True
2026-06-03T21:43:44.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:43:44.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:43:44.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:43:12, diff=32.778857s, valid=True
2026-06-03T21:43:44.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:43:44.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:43:44.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:43:25, diff=19.78551s, valid=True
2026-06-03T21:43:44.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:43:44.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:43:44.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:43:44.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:43:44.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:43:44.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:43:44.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:43:12, diff=32.789048s, valid=True
2026-06-03T21:43:44.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:43:44.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:43:44.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:43:44.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90021.789837s, valid=True
2026-06-03T21:43:44.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:43:44.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:43:44.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:43:44.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:43:44.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:43:44.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:43:44.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:43:44.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:43:44.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:43:45.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:43:45.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:43:45.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:43:45.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:43:45.180 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:43:45.378 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:43:45.710 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:43:45.811 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:43:45.811 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:43:45.811 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:43:46.000 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:43:46.000 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:44:16.031 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:44:16.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:44:16.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:44:16.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:44:16.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:44:16.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:44:16.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:44:16.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:44:16.587 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:44:16.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:44:16.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:44:16.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:44:16.606 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:44:19.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:44:19.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:44:19.265 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:44:19.265 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:44:19.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:44:19.287 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:44:19.288 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:44:19.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:44:19.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:44:19.288 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:44:19.288 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:44:19.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:44:19.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:44:19.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:44:19.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:44:19.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:44:19.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:44:19.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:44:19.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:44:19.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:44:19.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:44:19.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:44:19.615 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:44:19.684 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:43:56
2026-06-03T21:44:19.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87125, datetime.datetime(2026, 6, 3, 21, 43, 56), datetime.datetime(2026, 6, 3, 21, 43, 55), 'salt', 2.39, 100.13, None, 48.2, 125.45, -0.02, 822.17, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:44:19.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:44:19.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:44:19.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:43:55, diff=24.691377s, valid=True
2026-06-03T21:44:19.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:44:19.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:44:19.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:44:12, diff=7.694741s, valid=True
2026-06-03T21:44:19.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:44:19.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:44:19.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:43:55, diff=24.702541s, valid=True
2026-06-03T21:44:19.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:44:19.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:44:19.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:44:19.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:44:19.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:44:19.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:44:19.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:44:12, diff=7.706136s, valid=True
2026-06-03T21:44:19.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:44:19.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:44:19.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:44:19.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90056.706915s, valid=True
2026-06-03T21:44:19.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:44:19.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:44:19.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:44:19.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:44:19.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:44:19.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:44:19.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:44:19.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:44:19.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:44:19.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:44:19.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:44:19.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:44:19.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:44:20.040 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:44:20.244 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:44:20.580 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:44:20.683 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:44:20.683 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:44:20.683 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:44:20.971 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:44:20.972 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:44:51.002 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:44:51.002 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:44:51.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:44:51.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:44:51.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:44:51.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:44:51.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:44:51.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:44:51.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:44:51.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:44:51.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:44:51.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:44:51.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:44:54.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:44:54.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:44:54.359 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:44:54.359 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:44:54.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:44:54.382 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:44:54.382 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:44:54.383 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:44:54.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:44:54.383 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:44:54.384 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:44:54.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:44:54.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T21:44:54.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:44:54.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T21:44:54.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:44:54.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T21:44:54.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:44:54.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T21:44:54.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:44:54.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:44:54.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:44:54.711 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:44:54.792 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:44:26
2026-06-03T21:44:54.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87126, datetime.datetime(2026, 6, 3, 21, 44, 26), datetime.datetime(2026, 6, 3, 21, 44, 26), 'salt', 2.49, 100.19, None, 40.36, 123.5, -0.03, 822.35, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:44:54.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:44:54.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T21:44:54.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:44:26, diff=28.799834s, valid=True
2026-06-03T21:44:54.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:44:54.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T21:44:54.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:44:12, diff=42.803299s, valid=True
2026-06-03T21:44:54.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:44:54.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T21:44:54.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:44:26, diff=28.811322s, valid=True
2026-06-03T21:44:54.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:44:54.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:44:54.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:44:54.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:44:54.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:44:54.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T21:44:54.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:44:12, diff=42.815045s, valid=True
2026-06-03T21:44:54.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:44:54.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:44:54.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:44:54.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90091.815881s, valid=True
2026-06-03T21:44:54.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:44:54.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:44:54.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:44:54.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:44:54.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:44:54.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:44:54.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:44:54.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:44:54.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:44:54.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:44:55.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:44:55.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:44:55.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:44:55.135 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:44:55.333 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:44:55.666 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:44:55.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:44:55.779 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:44:55.780 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:44:55.956 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:44:55.956 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:45:25.964 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:45:25.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:45:25.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:45:26.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:45:26.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:45:26.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:45:26.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:45:26.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:45:26.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:45:26.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:45:26.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:45:26.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:45:26.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:45:29.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:45:29.148 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:45:29.149 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:45:29.149 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:45:29.161 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:45:29.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:45:29.175 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:45:29.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:45:29.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:45:29.176 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:45:29.176 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:45:29.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:45:29.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:45:29.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:45:29.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:45:29.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:45:29.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:45:29.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:45:29.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:45:29.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:45:29.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:45:29.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:45:29.507 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:45:29.577 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:45:27
2026-06-03T21:45:29.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87128, datetime.datetime(2026, 6, 3, 21, 45, 27), datetime.datetime(2026, 6, 3, 21, 45, 26), 'salt', 2.49, 100.16, None, 45.76, 134.36, -0.02, 822.23, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:45:29.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:45:29.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:45:29.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:45:26, diff=3.583019s, valid=True
2026-06-03T21:45:29.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:45:29.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:45:29.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:45:12, diff=17.585814s, valid=True
2026-06-03T21:45:29.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:45:29.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:45:29.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:45:26, diff=3.592318s, valid=True
2026-06-03T21:45:29.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:45:29.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:45:29.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:45:29.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:45:29.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:45:29.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:45:29.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:45:12, diff=17.595296s, valid=True
2026-06-03T21:45:29.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:45:29.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:45:29.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:45:29.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90126.595957s, valid=True
2026-06-03T21:45:29.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:45:29.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:45:29.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:45:29.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:45:29.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:45:29.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:45:29.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:45:29.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:45:29.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:45:29.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:45:29.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:45:29.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:45:29.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:45:29.929 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:45:30.175 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:45:30.572 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:45:30.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:45:30.672 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:45:30.672 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:45:30.855 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:45:30.856 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:46:00.862 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:46:00.863 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:46:00.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:46:01.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:46:01.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:46:01.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:46:01.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:46:01.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:46:01.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:46:01.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:46:01.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:46:01.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:46:01.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:46:04.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:46:04.686 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:46:04.688 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:46:04.688 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:46:04.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:46:04.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:46:04.712 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:46:04.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:46:04.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:46:04.713 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:46:04.714 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:46:04.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:46:04.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:46:04.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:46:04.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:46:04.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:46:04.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:46:04.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:46:05.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:46:05.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:46:05.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:46:05.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:46:05.045 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:46:05.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:45:57
2026-06-03T21:46:05.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87129, datetime.datetime(2026, 6, 3, 21, 45, 57), datetime.datetime(2026, 6, 3, 21, 45, 56), 'salt', 2.49, 100.19, None, 41.03, 134.9, -0.03, 822.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:46:05.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:46:05.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:46:05.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:45:56, diff=9.123719s, valid=True
2026-06-03T21:46:05.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:46:05.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:46:05.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:46:12, diff=-6.872894s, valid=True
2026-06-03T21:46:05.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:46:05.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:46:05.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:45:56, diff=9.135002s, valid=True
2026-06-03T21:46:05.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:46:05.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:46:05.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:46:05.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:46:05.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:46:05.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:46:05.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:46:12, diff=-6.861356s, valid=True
2026-06-03T21:46:05.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:46:05.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:46:05.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:46:05.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90162.139435s, valid=True
2026-06-03T21:46:05.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:46:05.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:46:05.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:46:05.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:46:05.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:46:05.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:46:05.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:46:05.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:46:05.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:46:05.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:46:05.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:46:05.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:46:05.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:46:05.462 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:46:05.664 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:46:06.003 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:46:06.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:46:06.108 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:46:06.108 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:46:06.291 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:46:06.292 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:46:36.293 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:46:36.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:46:36.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:46:36.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:46:36.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:46:36.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:46:36.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:46:36.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:46:36.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:46:36.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:46:36.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:46:36.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:46:36.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:46:39.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:46:39.428 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:46:39.429 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:46:39.429 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:46:39.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:46:39.453 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:46:39.453 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:46:39.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:46:39.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:46:39.454 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:46:39.455 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:46:39.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:46:39.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:46:39.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:46:39.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:46:39.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:46:39.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:46:39.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:46:39.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:46:39.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:46:39.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:46:39.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:46:39.785 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:46:39.858 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:46:27
2026-06-03T21:46:39.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87130, datetime.datetime(2026, 6, 3, 21, 46, 27), datetime.datetime(2026, 6, 3, 21, 46, 26), 'salt', 2.39, 100.06, None, 51.97, 135.74, -0.01, 822.35, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:46:39.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:46:39.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:46:39.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:46:26, diff=13.871921s, valid=True
2026-06-03T21:46:39.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:46:39.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:46:39.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:46:12, diff=27.876059s, valid=True
2026-06-03T21:46:39.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:46:39.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:46:39.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:46:27, diff=12.882767s, valid=True
2026-06-03T21:46:39.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:46:39.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:46:39.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:46:39.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:46:39.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:46:39.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:46:39.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:46:12, diff=27.885949s, valid=True
2026-06-03T21:46:39.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:46:39.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:46:39.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:46:39.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90196.886611s, valid=True
2026-06-03T21:46:39.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:46:39.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:46:39.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:46:39.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:46:39.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:46:39.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:46:39.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:46:39.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:46:39.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:46:40.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:46:40.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:46:40.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:46:40.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:46:40.226 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:46:40.501 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:46:40.836 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:46:40.939 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:46:40.940 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:46:40.940 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:46:41.123 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:46:41.124 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:47:11.153 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:47:11.153 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:47:11.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:47:11.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:47:11.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:47:11.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:47:11.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:47:11.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:47:11.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:47:11.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:47:11.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:47:11.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:47:11.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:47:14.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:47:14.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:47:14.501 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:47:14.501 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:47:14.513 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:47:14.525 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:47:14.526 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:47:14.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:47:14.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:47:14.527 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:47:14.527 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:47:14.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:47:14.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:47:14.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:47:14.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:47:14.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:47:14.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:47:14.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:47:14.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:47:14.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:47:14.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:47:14.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:47:14.827 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:47:14.899 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:46:57
2026-06-03T21:47:14.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87131, datetime.datetime(2026, 6, 3, 21, 46, 57), datetime.datetime(2026, 6, 3, 21, 46, 57), 'salt', 2.49, 100.06, None, 41.56, 136.23, -0.01, 822.35, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:47:14.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:47:14.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:47:14.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:46:57, diff=17.906119s, valid=True
2026-06-03T21:47:14.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:47:14.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:47:14.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:47:12, diff=2.909364s, valid=True
2026-06-03T21:47:14.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:47:14.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:47:14.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:46:57, diff=17.917028s, valid=True
2026-06-03T21:47:14.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:47:14.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:47:14.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:47:14.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:47:14.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:47:14.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:47:14.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:47:12, diff=2.920504s, valid=True
2026-06-03T21:47:14.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:47:14.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:47:14.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:47:14.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90231.921268s, valid=True
2026-06-03T21:47:14.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:47:14.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:47:14.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:47:14.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:47:14.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:47:14.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:47:14.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:47:14.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:47:15.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:47:15.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:47:15.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:47:15.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:47:15.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:47:15.244 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:47:15.446 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:47:15.782 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:47:15.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:47:15.887 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:47:15.887 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:47:15.976 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:47:15.976 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:47:46.006 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:47:46.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:47:46.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:47:46.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:47:46.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:47:46.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:47:46.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:47:46.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:47:46.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:47:46.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:47:46.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:47:46.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:47:46.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:47:49.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:47:49.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:47:49.314 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:47:49.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:47:49.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:47:49.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:47:49.337 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:47:49.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:47:49.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:47:49.338 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:47:49.339 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:47:49.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:47:49.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:47:49.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:47:49.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:47:49.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:47:49.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:47:49.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:47:49.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:47:49.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:47:49.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:47:49.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:47:49.668 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:47:49.740 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:47:28
2026-06-03T21:47:49.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87132, datetime.datetime(2026, 6, 3, 21, 47, 28), datetime.datetime(2026, 6, 3, 21, 47, 27), 'salt', 2.45, 100.16, None, 46.11, 124.66, -0.03, 822.29, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:47:49.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:47:49.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:47:49.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:47:27, diff=22.747853s, valid=True
2026-06-03T21:47:49.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:47:49.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:47:49.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:47:12, diff=37.751321s, valid=True
2026-06-03T21:47:49.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:47:49.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:47:49.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:47:27, diff=22.759544s, valid=True
2026-06-03T21:47:49.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:47:49.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:47:49.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:47:49.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:47:49.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:47:49.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:47:49.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:47:12, diff=37.763288s, valid=True
2026-06-03T21:47:49.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:47:49.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:47:49.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:47:49.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90266.764096s, valid=True
2026-06-03T21:47:49.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:47:49.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:47:49.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:47:49.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:47:49.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:47:49.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:47:49.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:47:49.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:47:49.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:47:49.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:47:50.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:47:50.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:47:50.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:47:50.197 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:47:50.396 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:47:50.734 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:47:50.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:47:50.837 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:47:50.837 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:47:51.021 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:47:51.021 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:48:21.043 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:48:21.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:48:21.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:48:21.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:48:21.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:48:21.601 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:48:21.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:48:21.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:48:21.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:48:21.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:48:21.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:48:21.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:48:21.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:48:24.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:48:24.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:48:24.347 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:48:24.347 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:48:24.358 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:48:24.371 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:48:24.371 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:48:24.372 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:48:24.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:48:24.373 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:48:24.373 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:48:24.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:48:24.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:48:24.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:48:24.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:48:24.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:48:24.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:48:24.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:48:24.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:48:24.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:48:24.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:48:24.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:48:24.720 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:48:24.793 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:47:58
2026-06-03T21:48:24.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87133, datetime.datetime(2026, 6, 3, 21, 47, 58), datetime.datetime(2026, 6, 3, 21, 47, 57), 'salt', 2.42, 100.16, None, 47.6, 122.64, -0.03, 822.35, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:48:24.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:48:24.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:48:24.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:47:57, diff=27.800575s, valid=True
2026-06-03T21:48:24.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:48:24.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:48:24.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:48:12, diff=12.80403s, valid=True
2026-06-03T21:48:24.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:48:24.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:48:24.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:47:58, diff=26.812208s, valid=True
2026-06-03T21:48:24.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:48:24.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:48:24.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:48:24.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:48:24.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:48:24.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:48:24.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:48:12, diff=12.816336s, valid=True
2026-06-03T21:48:24.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:48:24.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:48:24.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:48:24.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90301.817465s, valid=True
2026-06-03T21:48:24.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:48:24.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:48:24.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:48:24.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:48:24.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:48:24.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:48:24.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:48:24.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:48:24.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:48:24.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:48:25.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:48:25.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:48:25.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:48:25.154 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:48:25.365 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:48:25.703 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:48:25.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:48:25.804 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:48:25.804 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:48:25.996 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:48:25.996 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:48:56.021 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:48:56.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:48:56.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:48:56.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:48:56.363 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:48:56.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:48:56.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:48:56.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:48:56.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:48:56.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:48:56.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:48:56.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:48:56.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:48:59.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:48:59.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:48:59.261 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:48:59.261 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:48:59.271 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:48:59.284 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:48:59.284 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:48:59.285 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:48:59.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:48:59.285 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:48:59.286 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:48:59.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:48:59.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:48:59.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:48:59.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:48:59.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:48:59.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:48:59.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:48:59.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:48:59.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:48:59.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:48:59.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:48:59.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:48:59.773 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:48:58
2026-06-03T21:48:59.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87135, datetime.datetime(2026, 6, 3, 21, 48, 58), datetime.datetime(2026, 6, 3, 21, 48, 58), 'salt', 2.36, 100.33, None, 44.39, 125.43, -0.04, 822.29, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:48:59.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:48:59.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:48:59.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:48:58, diff=1.779234s, valid=True
2026-06-03T21:48:59.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:48:59.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:48:59.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:49:12, diff=-12.217875s, valid=True
2026-06-03T21:48:59.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:48:59.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:48:59.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:48:58, diff=1.788736s, valid=True
2026-06-03T21:48:59.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:48:59.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:48:59.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:48:59.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:48:59.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:48:59.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:48:59.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:49:12, diff=-12.208244s, valid=True
2026-06-03T21:48:59.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:48:59.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:48:59.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:48:59.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90336.792401s, valid=True
2026-06-03T21:48:59.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:48:59.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:48:59.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:48:59.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:48:59.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:48:59.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:48:59.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:48:59.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:48:59.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:48:59.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:48:59.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:49:00.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:49:00.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:49:00.131 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:49:00.331 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:49:00.664 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:49:00.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:49:00.765 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:49:00.765 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:49:00.993 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:49:00.993 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:49:31.024 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:49:31.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:49:31.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:49:31.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:49:31.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:49:31.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:49:31.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:49:31.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:49:31.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:49:31.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:49:31.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:49:31.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:49:31.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:49:34.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:49:34.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:49:34.235 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:49:34.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:49:34.245 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:49:34.258 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:49:34.259 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:49:34.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:49:34.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:49:34.260 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:49:34.260 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:49:34.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:49:34.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:49:34.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:49:34.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:49:34.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:49:34.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:49:34.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:49:34.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:49:34.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:49:34.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:49:34.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:49:34.612 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:49:34.688 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:49:29
2026-06-03T21:49:34.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87136, datetime.datetime(2026, 6, 3, 21, 49, 29), datetime.datetime(2026, 6, 3, 21, 49, 28), 'salt', 2.45, 100.1, None, 38.78, 121.27, -0.02, 822.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:49:34.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:49:34.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:49:34.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:49:28, diff=6.695698s, valid=True
2026-06-03T21:49:34.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:49:34.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:49:34.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:49:12, diff=22.699074s, valid=True
2026-06-03T21:49:34.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:49:34.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:49:34.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:49:28, diff=6.707034s, valid=True
2026-06-03T21:49:34.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:49:34.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:49:34.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:49:34.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:49:34.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:49:34.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:49:34.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:49:12, diff=22.710648s, valid=True
2026-06-03T21:49:34.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:49:34.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:49:34.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:49:34.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90371.711419s, valid=True
2026-06-03T21:49:34.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:49:34.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:49:34.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:49:34.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:49:34.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:49:34.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:49:34.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:49:34.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:49:34.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:49:34.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:49:34.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:49:34.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:49:34.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:49:35.038 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:49:35.237 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:49:35.576 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:49:35.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:49:35.677 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:49:35.678 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:49:35.866 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:49:35.866 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:50:05.868 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:50:05.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:50:05.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:50:06.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:50:06.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:50:06.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:50:06.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:50:06.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:50:06.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:50:06.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:50:06.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:50:06.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:50:06.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:50:09.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:50:09.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:50:09.092 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:50:09.092 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:50:09.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:50:09.115 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:50:09.116 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:50:09.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:50:09.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:50:09.117 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:50:09.117 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:50:09.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:50:09.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:50:09.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:50:09.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:50:09.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:50:09.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:50:09.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:50:09.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:50:09.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:50:09.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:50:09.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:50:09.453 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:50:09.526 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:49:59
2026-06-03T21:50:09.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87137, datetime.datetime(2026, 6, 3, 21, 49, 59), datetime.datetime(2026, 6, 3, 21, 49, 58), 'salt', 2.45, 100.13, None, 45.69, 116.46, -0.02, 822.29, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:50:09.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:50:09.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:50:09.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:49:58, diff=11.533968s, valid=True
2026-06-03T21:50:09.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:50:09.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:50:09.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:50:12, diff=-2.462544s, valid=True
2026-06-03T21:50:09.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:50:09.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:50:09.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:49:59, diff=10.545548s, valid=True
2026-06-03T21:50:09.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:50:09.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:50:09.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:50:09.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:50:09.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:50:09.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:50:09.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:50:12, diff=-2.450717s, valid=True
2026-06-03T21:50:09.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:50:09.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:50:09.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:50:09.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90406.550099s, valid=True
2026-06-03T21:50:09.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:50:09.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:50:09.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:50:09.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:50:09.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:50:09.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:50:09.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:50:09.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:50:09.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:50:09.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:50:09.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:50:09.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:50:09.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:50:09.878 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:50:10.102 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:50:10.442 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:50:10.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:50:10.544 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:50:10.544 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:50:10.810 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:50:10.810 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:50:40.840 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:50:40.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:50:40.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:50:41.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:50:41.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:50:41.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:50:41.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:50:41.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:50:41.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:50:41.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:50:41.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:50:41.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:50:41.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:50:44.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:50:44.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:50:44.119 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:50:44.119 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:50:44.129 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:50:44.142 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:50:44.142 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:50:44.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:50:44.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:50:44.143 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:50:44.144 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:50:44.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:50:44.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:50:44.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:50:44.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:50:44.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:50:44.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:50:44.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:50:44.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:50:44.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:50:44.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:50:44.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:50:44.494 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:50:44.568 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:50:29
2026-06-03T21:50:44.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87138, datetime.datetime(2026, 6, 3, 21, 50, 29), datetime.datetime(2026, 6, 3, 21, 50, 28), 'salt', 2.55, 100.1, None, 34.82, 124.3, -0.02, 822.42, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:50:44.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:50:44.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:50:44.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:50:28, diff=16.575778s, valid=True
2026-06-03T21:50:44.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:50:44.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:50:44.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:50:12, diff=32.57927s, valid=True
2026-06-03T21:50:44.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:50:44.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:50:44.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:50:29, diff=15.587542s, valid=True
2026-06-03T21:50:44.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:50:44.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:50:44.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:50:44.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:50:44.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:50:44.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:50:44.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:50:12, diff=32.591303s, valid=True
2026-06-03T21:50:44.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:50:44.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:50:44.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:50:44.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90441.592135s, valid=True
2026-06-03T21:50:44.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:50:44.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:50:44.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:50:44.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:50:44.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:50:44.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:50:44.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:50:44.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:50:44.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:50:44.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:50:44.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:50:44.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:50:44.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:50:44.918 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:50:45.129 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:50:45.533 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:50:45.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:50:45.639 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:50:45.639 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:50:45.894 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:50:45.894 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:51:15.924 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:51:15.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:51:15.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:51:16.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:51:16.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:51:16.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:51:16.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:51:16.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:51:16.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:51:16.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:51:16.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:51:16.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:51:16.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:51:19.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:51:19.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:51:19.365 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:51:19.365 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:51:19.377 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:51:19.390 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:51:19.390 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:51:19.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:51:19.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:51:19.391 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:51:19.392 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:51:19.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:51:19.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:51:19.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:51:19.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:51:19.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:51:19.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:51:19.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:51:19.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:51:19.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:51:19.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:51:19.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:51:19.738 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:51:19.809 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:51:00
2026-06-03T21:51:19.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87139, datetime.datetime(2026, 6, 3, 21, 51), datetime.datetime(2026, 6, 3, 21, 50, 59), 'salt', 2.49, 100.13, None, 38.0, 132.59, -0.02, 822.29, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:51:19.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:51:19.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:51:19.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:50:59, diff=20.816753s, valid=True
2026-06-03T21:51:19.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:51:19.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:51:19.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:51:12, diff=7.820225s, valid=True
2026-06-03T21:51:19.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:51:19.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:51:19.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:50:59, diff=20.82881s, valid=True
2026-06-03T21:51:19.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:51:19.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:51:19.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:51:19.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:51:19.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:51:19.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:51:19.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:51:12, diff=7.832308s, valid=True
2026-06-03T21:51:19.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:51:19.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:51:19.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:51:19.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90476.833569s, valid=True
2026-06-03T21:51:19.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:51:19.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:51:19.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:51:19.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:51:19.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:51:19.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:51:19.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:51:19.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:51:19.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:51:19.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:51:20.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:51:20.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:51:20.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:51:20.180 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:51:20.390 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:51:20.735 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:51:20.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:51:20.840 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:51:20.840 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:51:21.070 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:51:21.070 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:51:51.101 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:51:51.101 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:51:51.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:51:51.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:51:51.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:51:51.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:51:51.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:51:51.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:51:51.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:51:51.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:51:51.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:51:51.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:51:51.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:51:54.653 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:51:54.661 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:51:54.661 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:51:54.662 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:51:54.671 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:51:54.683 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:51:54.684 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:51:54.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:51:54.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:51:54.685 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:51:54.685 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:51:54.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:51:54.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:51:54.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:51:54.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:51:54.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:51:54.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:51:54.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:51:55.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:51:55.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:51:55.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:51:55.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:51:55.042 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:51:55.127 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:51:30
2026-06-03T21:51:55.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87140, datetime.datetime(2026, 6, 3, 21, 51, 30), datetime.datetime(2026, 6, 3, 21, 51, 29), 'salt', 2.59, 100.19, None, 39.41, 132.24, -0.03, 822.35, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:51:55.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:51:55.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:51:55.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:51:29, diff=26.134808s, valid=True
2026-06-03T21:51:55.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:51:55.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:51:55.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:51:12, diff=43.138418s, valid=True
2026-06-03T21:51:55.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:51:55.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:51:55.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:51:29, diff=26.146905s, valid=True
2026-06-03T21:51:55.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:51:55.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:51:55.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:51:55.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:51:55.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:51:55.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:51:55.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:51:12, diff=43.150752s, valid=True
2026-06-03T21:51:55.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:51:55.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:51:55.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:51:55.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90512.151578s, valid=True
2026-06-03T21:51:55.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:51:55.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:51:55.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:51:55.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:51:55.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:51:55.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:51:55.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:51:55.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:51:55.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:51:55.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:51:55.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:51:55.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:51:55.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:51:55.547 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:51:55.754 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:51:56.095 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:51:56.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:51:56.199 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:51:56.199 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:51:56.383 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:51:56.383 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:52:26.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:52:26.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:52:26.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:52:26.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:52:26.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:52:27.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:52:27.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:52:27.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:52:27.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:52:27.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:52:27.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:52:27.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:52:27.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:52:29.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:52:29.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:52:29.708 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:52:29.708 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:52:29.719 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:52:29.731 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:52:29.732 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:52:29.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:52:29.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:52:29.733 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:52:29.733 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:52:29.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:52:29.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T21:52:29.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:52:29.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T21:52:29.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:52:30.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:52:30.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:52:30.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:52:30.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:52:30.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:52:30.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:52:30.073 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:52:30.155 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:52:00
2026-06-03T21:52:30.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87141, datetime.datetime(2026, 6, 3, 21, 52), datetime.datetime(2026, 6, 3, 21, 51, 59), 'salt', 2.52, 100.13, None, 44.7, 133.06, -0.02, 822.35, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:52:30.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:52:30.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T21:52:30.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:51:59, diff=31.163274s, valid=True
2026-06-03T21:52:30.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:52:30.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:52:30.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:52:12, diff=18.166654s, valid=True
2026-06-03T21:52:30.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:52:30.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T21:52:30.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:51:59, diff=31.174433s, valid=True
2026-06-03T21:52:30.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:52:30.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:52:30.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:52:30.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:52:30.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:52:30.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:52:30.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:52:12, diff=18.178018s, valid=True
2026-06-03T21:52:30.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:52:30.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:52:30.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:52:30.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90547.178802s, valid=True
2026-06-03T21:52:30.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:52:30.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:52:30.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:52:30.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:52:30.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:52:30.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:52:30.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:52:30.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:52:30.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:52:30.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:52:30.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:52:30.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:52:30.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:52:30.500 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:52:30.707 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:52:31.049 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:52:31.151 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:52:31.152 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:52:31.152 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:52:31.333 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:52:31.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:53:01.364 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:53:01.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:53:01.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:53:01.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:53:01.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:53:01.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:53:01.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:53:01.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:53:01.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:53:01.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:53:01.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:53:01.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:53:01.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:53:04.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:53:04.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:53:04.577 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:53:04.577 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:53:04.587 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:53:04.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:53:04.601 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:53:04.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:53:04.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:53:04.602 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:53:04.602 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:53:04.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:53:04.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:53:04.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:53:04.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:53:04.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:53:04.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:53:04.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:53:05.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:53:05.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:53:05.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:53:05.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:53:05.035 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:53:05.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:53:00
2026-06-03T21:53:05.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87143, datetime.datetime(2026, 6, 3, 21, 53), datetime.datetime(2026, 6, 3, 21, 53), 'salt', 2.42, 100.03, None, 45.51, 128.15, -0.01, 822.29, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:53:05.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:53:05.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:53:05.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:53:00, diff=5.125698s, valid=True
2026-06-03T21:53:05.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:53:05.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:53:05.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:53:12, diff=-6.870191s, valid=True
2026-06-03T21:53:05.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:53:05.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:53:05.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:53:00, diff=5.139434s, valid=True
2026-06-03T21:53:05.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:53:05.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:53:05.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:53:05.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:53:05.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:53:05.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:53:05.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:53:12, diff=-6.856213s, valid=True
2026-06-03T21:53:05.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:53:05.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:53:05.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:53:05.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90582.144741s, valid=True
2026-06-03T21:53:05.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:53:05.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:53:05.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:53:05.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:53:05.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:53:05.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:53:05.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:53:05.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:53:05.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:53:05.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:53:05.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:53:05.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:53:05.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:53:05.538 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:53:05.747 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:53:06.092 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:53:06.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:53:06.195 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:53:06.196 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:53:08.727 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:53:08.727 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:53:38.732 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:53:38.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:53:38.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:53:39.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:53:39.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:53:39.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:53:39.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:53:39.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:53:39.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:53:39.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:53:39.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:53:39.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:53:39.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:53:42.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:53:42.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:53:42.061 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:53:42.062 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:53:42.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:53:42.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:53:42.086 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:53:42.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:53:42.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:53:42.087 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:53:42.087 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:53:42.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:53:42.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:53:42.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:53:42.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:53:42.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:53:42.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:53:42.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:53:42.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:53:42.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:53:42.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:53:42.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:53:42.432 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:53:42.512 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:53:31
2026-06-03T21:53:42.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87144, datetime.datetime(2026, 6, 3, 21, 53, 31), datetime.datetime(2026, 6, 3, 21, 53, 30), 'salt', 2.45, 100.03, None, 40.96, 134.19, -0.01, 822.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:53:42.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:53:42.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:53:42.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:53:30, diff=12.519686s, valid=True
2026-06-03T21:53:42.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:53:42.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:53:42.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:53:12, diff=30.523176s, valid=True
2026-06-03T21:53:42.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:53:42.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:53:42.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:53:30, diff=12.531345s, valid=True
2026-06-03T21:53:42.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:53:42.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:53:42.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:53:42.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:53:42.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:53:42.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:53:42.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:53:12, diff=30.535093s, valid=True
2026-06-03T21:53:42.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:53:42.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:53:42.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:53:42.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90619.535912s, valid=True
2026-06-03T21:53:42.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:53:42.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:53:42.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:53:42.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:53:42.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:53:42.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:53:42.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:53:42.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:53:42.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:53:42.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:53:42.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:53:42.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:53:42.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:53:42.858 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:53:43.065 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:53:43.408 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:53:43.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:53:43.514 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:53:43.514 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:53:43.602 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:53:43.602 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:54:13.633 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:54:13.633 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:54:13.633 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:54:13.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:54:13.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:54:14.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:54:14.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:54:14.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:54:14.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:54:14.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:54:14.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:54:14.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:54:14.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:54:16.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:54:16.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:54:16.975 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:54:16.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:54:16.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:54:16.998 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:54:16.999 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:54:17.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:54:17.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:54:17.000 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:54:17.000 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:54:17.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:54:17.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:54:17.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:54:17.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:54:17.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:54:17.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:54:17.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:54:17.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:54:17.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:54:17.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:54:17.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:54:17.353 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:54:17.432 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:54:01
2026-06-03T21:54:17.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87145, datetime.datetime(2026, 6, 3, 21, 54, 1), datetime.datetime(2026, 6, 3, 21, 54), 'salt', 2.52, 100.13, None, 44.1, 128.46, -0.02, 822.48, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:54:17.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:54:17.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:54:17.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:54:00, diff=17.440069s, valid=True
2026-06-03T21:54:17.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:54:17.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:54:17.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:54:12, diff=5.443692s, valid=True
2026-06-03T21:54:17.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:54:17.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:54:17.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:54:01, diff=16.452127s, valid=True
2026-06-03T21:54:17.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:54:17.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:54:17.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:54:17.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:54:17.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:54:17.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:54:17.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:54:12, diff=5.456017s, valid=True
2026-06-03T21:54:17.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:54:17.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:54:17.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:54:17.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90654.456882s, valid=True
2026-06-03T21:54:17.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:54:17.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:54:17.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:54:17.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:54:17.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:54:17.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:54:17.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:54:17.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:54:17.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:54:17.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:54:17.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:54:17.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:54:17.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:54:17.779 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:54:17.987 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:54:18.332 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:54:18.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:54:18.435 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:54:18.435 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:54:18.628 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:54:18.628 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:54:48.654 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:54:48.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:54:48.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:54:48.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:54:48.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:54:49.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:54:49.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:54:49.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:54:49.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:54:49.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:54:49.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:54:49.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:54:49.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:54:51.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:54:51.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:54:51.784 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:54:51.784 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:54:51.794 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:54:51.807 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:54:51.807 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:54:51.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:54:51.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:54:51.809 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:54:51.809 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:54:51.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:54:51.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:54:51.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:54:52.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:54:52.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:54:52.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:54:52.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:54:52.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T21:54:52.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:54:52.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:54:52.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:54:52.152 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:54:52.243 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:54:31
2026-06-03T21:54:52.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87146, datetime.datetime(2026, 6, 3, 21, 54, 31), datetime.datetime(2026, 6, 3, 21, 54, 31), 'salt', 2.55, 100.19, None, 48.55, 123.27, -0.03, 822.42, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:54:52.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:54:52.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:54:52.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:54:31, diff=21.250209s, valid=True
2026-06-03T21:54:52.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:54:52.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:54:52.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:54:12, diff=40.253105s, valid=True
2026-06-03T21:54:52.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:54:52.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:54:52.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:54:31, diff=21.25977s, valid=True
2026-06-03T21:54:52.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:54:52.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:54:52.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:54:52.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:54:52.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:54:52.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T21:54:52.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:54:12, diff=40.262802s, valid=True
2026-06-03T21:54:52.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:54:52.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:54:52.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:54:52.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90689.263458s, valid=True
2026-06-03T21:54:52.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:54:52.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:54:52.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:54:52.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:54:52.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:54:52.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:54:52.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:54:52.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:54:52.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:54:52.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:54:52.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:54:52.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:54:52.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:54:52.577 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:54:52.783 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:54:53.187 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:54:53.289 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:54:53.289 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:54:53.289 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:54:53.378 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:54:53.378 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:55:23.408 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:55:23.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:55:23.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:55:23.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:55:23.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:55:23.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:55:23.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:55:23.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:55:23.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:55:23.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:55:23.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:55:23.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:55:23.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:55:26.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:55:26.686 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:55:26.686 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:55:26.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:55:26.696 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:55:26.708 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:55:26.708 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:55:26.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:55:26.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:55:26.709 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:55:26.709 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:55:26.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:55:26.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:55:26.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:55:26.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:55:26.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:55:26.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T21:55:26.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:55:27.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T21:55:27.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:55:27.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:55:27.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:55:27.010 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:55:27.146 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:55:01
2026-06-03T21:55:27.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87147, datetime.datetime(2026, 6, 3, 21, 55, 1), datetime.datetime(2026, 6, 3, 21, 55, 1), 'salt', 2.52, 100.19, None, 37.93, 115.87, -0.03, 822.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:55:27.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:55:27.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:55:27.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:55:01, diff=26.154053s, valid=True
2026-06-03T21:55:27.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:55:27.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T21:55:27.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:54:12, diff=75.15718s, valid=True
2026-06-03T21:55:27.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:55:27.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:55:27.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:55:01, diff=26.164174s, valid=True
2026-06-03T21:55:27.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:55:27.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:55:27.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:55:27.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:55:27.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:55:27.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T21:55:27.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:54:12, diff=75.167217s, valid=True
2026-06-03T21:55:27.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:55:27.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:55:27.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:55:27.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90724.167877s, valid=True
2026-06-03T21:55:27.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:55:27.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:55:27.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:55:27.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:55:27.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:55:27.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:55:27.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:55:27.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:55:27.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:55:27.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:55:27.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:55:27.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:55:27.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:55:27.488 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:55:27.694 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:55:28.035 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:55:28.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:55:28.139 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:55:28.139 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:55:28.326 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:55:28.326 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:55:58.356 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:55:58.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:55:58.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:55:58.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:55:58.860 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:55:59.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:55:59.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:55:59.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:55:59.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:55:59.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:55:59.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:55:59.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:55:59.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:56:01.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:56:01.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:56:01.803 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:56:01.804 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:56:01.814 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:56:01.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:56:01.827 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:56:01.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:56:01.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:56:01.828 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:56:01.828 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:56:01.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:56:01.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-03T21:56:01.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:56:02.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-03T21:56:02.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:56:02.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T21:56:02.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:56:02.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T21:56:02.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:56:02.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:56:02.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:56:02.138 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:56:02.218 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:55:32
2026-06-03T21:56:02.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87148, datetime.datetime(2026, 6, 3, 21, 55, 32), datetime.datetime(2026, 6, 3, 21, 55, 31), 'salt', 2.49, 100.19, None, 50.03, 130.46, -0.03, 822.23, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:56:02.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:56:02.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-03T21:56:02.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:55:31, diff=31.225279s, valid=True
2026-06-03T21:56:02.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:56:02.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T21:56:02.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:54:12, diff=110.228231s, valid=True
2026-06-03T21:56:02.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:56:02.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-03T21:56:02.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:55:31, diff=31.235098s, valid=True
2026-06-03T21:56:02.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:56:02.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:56:02.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:56:02.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:56:02.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:56:02.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T21:56:02.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:54:12, diff=110.238253s, valid=True
2026-06-03T21:56:02.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:56:02.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:56:02.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:56:02.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90759.238965s, valid=True
2026-06-03T21:56:02.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:56:02.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:56:02.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:56:02.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:56:02.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:56:02.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:56:02.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:56:02.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:56:02.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:56:02.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:56:02.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:56:02.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:56:02.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:56:02.627 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:56:02.832 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:56:03.171 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:56:03.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:56:03.275 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:56:03.275 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:56:03.468 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:56:03.468 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:56:33.494 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:56:33.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:56:33.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:56:33.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:56:33.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:56:34.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:56:34.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:56:34.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:56:34.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:56:34.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:56:34.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:56:34.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:56:34.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:56:36.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:56:36.756 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:56:36.757 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:56:36.757 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:56:36.768 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:56:36.786 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:56:36.786 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:56:36.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:56:36.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:56:36.787 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:56:36.788 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:56:36.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:56:36.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:56:36.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:56:37.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:56:37.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:56:37.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T21:56:37.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:56:37.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T21:56:37.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:56:37.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:56:37.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:56:37.138 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:56:37.213 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:56:32
2026-06-03T21:56:37.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87150, datetime.datetime(2026, 6, 3, 21, 56, 32), datetime.datetime(2026, 6, 3, 21, 56, 31), 'salt', 2.55, 100.13, None, 43.5, 123.79, -0.02, 822.42, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:56:37.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:56:37.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:56:37.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:56:31, diff=6.220321s, valid=True
2026-06-03T21:56:37.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:56:37.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T21:56:37.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:54:12, diff=145.223798s, valid=True
2026-06-03T21:56:37.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:56:37.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:56:37.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:56:32, diff=5.231901s, valid=True
2026-06-03T21:56:37.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:56:37.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:56:37.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:56:37.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:56:37.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:56:37.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T21:56:37.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:54:12, diff=145.235567s, valid=True
2026-06-03T21:56:37.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:56:37.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:56:37.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:56:37.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90794.236374s, valid=True
2026-06-03T21:56:37.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:56:37.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:56:37.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:56:37.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:56:37.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:56:37.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:56:37.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:56:37.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:56:37.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:56:37.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:56:37.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:56:37.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:56:37.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:56:37.560 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:56:37.767 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:56:38.114 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:56:38.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:56:38.247 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:56:38.248 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:56:38.430 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:56:38.430 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:57:08.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:57:08.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:57:08.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:57:08.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:57:08.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:57:08.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:57:08.860 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:57:08.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:57:08.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:57:08.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:57:08.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:57:08.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:57:08.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:57:11.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:57:11.581 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:57:11.581 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:57:11.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:57:11.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:57:11.609 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:57:11.610 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:57:11.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:57:11.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:57:11.611 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:57:11.611 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:57:11.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:57:11.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:57:11.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:57:11.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:57:11.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:57:11.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:57:11.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:57:11.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:57:11.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:57:11.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:57:11.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:57:11.959 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:57:12.038 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:57:02
2026-06-03T21:57:12.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87151, datetime.datetime(2026, 6, 3, 21, 57, 2), datetime.datetime(2026, 6, 3, 21, 57, 2), 'salt', 2.55, 100.16, None, 45.76, 120.83, -0.03, 822.17, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T21:57:12.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:57:12.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:57:12.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:57:02, diff=10.045704s, valid=True
2026-06-03T21:57:12.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:57:12.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:57:12.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:54:12, diff=180.049156s, valid=True
2026-06-03T21:57:12.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:57:12.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:57:12.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:57:02, diff=10.057221s, valid=True
2026-06-03T21:57:12.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:57:12.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:57:12.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:57:12.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:57:12.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:57:12.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:57:12.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:54:12, diff=180.060938s, valid=True
2026-06-03T21:57:12.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:57:12.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:57:12.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:57:12.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90829.06174s, valid=True
2026-06-03T21:57:12.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:57:12.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:57:12.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:57:12.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:57:12.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:57:12.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:57:12.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:57:12.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:57:12.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:57:12.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:57:12.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:57:12.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:57:12.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:57:12.453 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:57:12.659 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:57:13.005 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:57:13.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:57:13.109 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:57:13.109 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:57:13.369 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:57:13.369 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:57:43.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:57:43.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:57:43.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:57:43.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:57:43.744 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:57:44.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:57:44.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:57:44.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:57:44.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:57:44.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:57:44.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:57:44.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:57:44.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:57:46.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:57:46.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:57:46.775 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:57:46.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:57:46.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:57:46.798 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:57:46.799 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:57:46.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:57:46.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:57:46.801 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:57:46.801 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:57:46.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:57:46.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:57:46.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:57:47.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:57:47.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:57:47.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:57:47.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:57:47.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:57:47.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:57:47.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:57:47.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:57:47.145 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:57:47.217 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:57:33
2026-06-03T21:57:47.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87152, datetime.datetime(2026, 6, 3, 21, 57, 33), datetime.datetime(2026, 6, 3, 21, 57, 32), 'salt', 2.52, 100.13, None, 39.38, 141.47, -0.02, 822.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T21:57:47.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:57:47.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:57:47.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:57:32, diff=15.224658s, valid=True
2026-06-03T21:57:47.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:57:47.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:57:47.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:54:12, diff=215.228132s, valid=True
2026-06-03T21:57:47.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:57:47.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:57:47.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:57:32, diff=15.236171s, valid=True
2026-06-03T21:57:47.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:57:47.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:57:47.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:57:47.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:57:47.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:57:47.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:57:47.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:54:12, diff=215.239885s, valid=True
2026-06-03T21:57:47.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:57:47.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:57:47.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:57:47.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90864.240713s, valid=True
2026-06-03T21:57:47.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:57:47.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:57:47.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:57:47.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:57:47.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:57:47.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:57:47.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:57:47.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:57:47.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:57:47.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:57:47.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:57:47.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:57:47.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:57:47.562 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:57:47.771 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:57:48.115 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:57:48.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:57:48.219 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:57:48.219 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:57:48.305 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:57:48.306 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:58:18.329 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:58:18.329 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:58:18.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:58:18.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:58:18.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:58:18.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:58:18.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:58:18.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:58:18.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:58:18.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:58:18.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:58:18.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:58:18.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:58:21.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:58:21.674 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:58:21.675 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:58:21.675 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:58:21.686 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:58:21.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:58:21.700 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:58:21.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:58:21.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:58:21.701 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:58:21.701 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:58:21.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:58:21.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:58:21.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:58:21.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:58:21.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:58:21.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:58:21.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:58:22.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:58:22.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:58:22.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:58:22.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:58:22.040 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:58:22.117 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:58:03
2026-06-03T21:58:22.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87153, datetime.datetime(2026, 6, 3, 21, 58, 3), datetime.datetime(2026, 6, 3, 21, 58, 2), 'salt', 2.62, 100.13, None, 41.03, 118.29, -0.02, 822.29, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T21:58:22.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:58:22.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:58:22.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:58:02, diff=20.125154s, valid=True
2026-06-03T21:58:22.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:58:22.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:58:22.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:54:12, diff=250.128627s, valid=True
2026-06-03T21:58:22.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:58:22.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:58:22.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:58:03, diff=19.136789s, valid=True
2026-06-03T21:58:22.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:58:22.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:58:22.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:58:22.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:58:22.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:58:22.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:58:22.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:54:12, diff=250.140476s, valid=True
2026-06-03T21:58:22.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:58:22.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:58:22.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:58:22.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90899.141286s, valid=True
2026-06-03T21:58:22.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:58:22.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:58:22.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:58:22.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:58:22.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:58:22.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:58:22.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:58:22.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:58:22.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:58:22.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:58:22.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:58:22.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:58:22.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:58:22.463 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:58:22.671 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:58:23.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:58:23.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:58:23.118 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:58:23.118 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:58:23.282 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:58:23.282 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:58:53.298 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:58:53.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:58:53.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:58:53.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:58:53.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:58:53.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:58:53.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:58:53.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:58:53.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:58:54.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:58:54.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:58:54.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:58:54.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:58:56.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:58:56.674 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:58:56.674 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:58:56.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:58:56.684 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:58:56.695 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:58:56.700 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:58:56.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:58:56.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:58:56.701 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:58:56.701 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:58:56.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:58:56.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:58:56.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:58:56.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:58:56.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:58:56.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:58:56.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:58:56.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T21:58:56.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:58:56.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:58:56.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:58:56.996 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:58:57.069 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:58:33
2026-06-03T21:58:57.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87154, datetime.datetime(2026, 6, 3, 21, 58, 33), datetime.datetime(2026, 6, 3, 21, 58, 32), 'salt', 2.59, 100.16, None, 45.16, 122.1, -0.02, 822.05, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T21:58:57.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:58:57.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:58:57.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:58:32, diff=25.07676s, valid=True
2026-06-03T21:58:57.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:58:57.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:58:57.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:59:12, diff=-14.919931s, valid=True
2026-06-03T21:58:57.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:58:57.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:58:57.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:58:33, diff=24.087545s, valid=True
2026-06-03T21:58:57.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:58:57.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:58:57.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:58:57.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:58:57.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:58:57.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T21:58:57.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:59:12, diff=-14.909022s, valid=True
2026-06-03T21:58:57.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:58:57.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:58:57.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:58:57.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90934.091729s, valid=True
2026-06-03T21:58:57.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:58:57.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:58:57.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:58:57.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:58:57.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:58:57.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:58:57.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:58:57.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:58:57.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:58:57.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:58:57.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:58:57.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:58:57.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:58:57.407 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:58:57.613 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:58:58.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:58:58.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:58:58.115 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:58:58.115 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:58:58.287 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:58:58.287 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T21:59:28.316 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T21:59:28.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T21:59:28.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T21:59:28.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T21:59:28.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T21:59:28.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T21:59:28.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T21:59:28.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T21:59:28.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T21:59:28.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T21:59:28.768 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T21:59:28.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T21:59:28.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T21:59:31.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T21:59:31.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T21:59:31.436 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T21:59:31.436 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T21:59:31.447 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T21:59:31.469 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T21:59:31.470 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T21:59:31.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T21:59:31.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T21:59:31.471 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T21:59:31.471 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T21:59:31.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T21:59:31.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T21:59:31.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T21:59:31.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T21:59:31.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:59:31.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:59:31.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T21:59:31.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T21:59:31.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T21:59:31.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T21:59:31.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T21:59:31.819 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T21:59:31.891 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 21:59:03
2026-06-03T21:59:31.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87155, datetime.datetime(2026, 6, 3, 21, 59, 3), datetime.datetime(2026, 6, 3, 21, 59, 3), 'salt', 2.52, 100.13, None, 38.95, 128.18, -0.02, 822.35, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T21:59:31.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T21:59:31.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T21:59:31.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:59:03, diff=28.898952s, valid=True
2026-06-03T21:59:31.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T21:59:31.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:59:31.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:59:12, diff=19.902298s, valid=True
2026-06-03T21:59:31.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T21:59:31.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T21:59:31.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:59:03, diff=28.910263s, valid=True
2026-06-03T21:59:31.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T21:59:31.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:59:31.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T21:59:31.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T21:59:31.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T21:59:31.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T21:59:31.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:59:12, diff=19.913895s, valid=True
2026-06-03T21:59:31.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T21:59:31.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T21:59:31.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T21:59:31.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=90968.914678s, valid=True
2026-06-03T21:59:31.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T21:59:31.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T21:59:31.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T21:59:31.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T21:59:31.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T21:59:31.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T21:59:31.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T21:59:31.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T21:59:31.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T21:59:32.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T21:59:32.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T21:59:32.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T21:59:32.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T21:59:32.236 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T21:59:32.442 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:59:32.783 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T21:59:32.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T21:59:32.886 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T21:59:32.886 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T21:59:33.054 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T21:59:33.054 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:00:03.059 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:00:03.059 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:00:03.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:00:03.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:00:03.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:00:03.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:00:03.485 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:00:03.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:00:03.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:00:03.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:00:03.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:00:03.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:00:03.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:00:06.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:00:06.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:00:06.103 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:00:06.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:00:06.112 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:00:06.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:00:06.126 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:00:06.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:00:06.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:00:06.127 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:00:06.127 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:00:06.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:00:06.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:00:06.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:00:06.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:00:06.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:00:06.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:00:06.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:00:06.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:00:06.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:00:06.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:00:06.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:00:06.463 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:00:06.534 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:00:04
2026-06-03T22:00:06.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87157, datetime.datetime(2026, 6, 3, 22, 0, 4), datetime.datetime(2026, 6, 3, 22, 0, 3), 'salt', 2.55, 100.16, None, 49.47, 123.32, -0.03, 822.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:00:06.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:00:06.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:00:06.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:00:03, diff=3.542466s, valid=True
2026-06-03T22:00:06.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:00:06.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:00:06.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:00:12, diff=-5.454121s, valid=True
2026-06-03T22:00:06.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:00:06.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:00:06.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 21:59:54, diff=12.553815s, valid=True
2026-06-03T22:00:06.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:00:06.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:00:06.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:00:06.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:00:06.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:00:06.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:00:06.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:00:12, diff=-5.442628s, valid=True
2026-06-03T22:00:06.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:00:06.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:00:06.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:00:06.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91003.558167s, valid=True
2026-06-03T22:00:06.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:00:06.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:00:06.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:00:06.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:00:06.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:00:06.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:00:06.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:00:06.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:00:06.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:00:06.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:00:06.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:00:06.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:00:06.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:00:06.964 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:00:07.175 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:00:07.521 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:00:07.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:00:07.624 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:00:07.624 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:00:10.186 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:00:10.186 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:00:40.204 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:00:40.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:00:40.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:00:40.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:00:40.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:00:40.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:00:40.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:00:40.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:00:40.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:00:40.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:00:40.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:00:40.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:00:40.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:00:43.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:00:43.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:00:43.482 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:00:43.482 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:00:43.494 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:00:43.508 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:00:43.508 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:00:43.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:00:43.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:00:43.509 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:00:43.510 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:00:43.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:00:43.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:00:43.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:00:43.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:00:43.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:00:43.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:00:43.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:00:43.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:00:43.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:00:43.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:00:43.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:00:43.862 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:00:43.931 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:00:34
2026-06-03T22:00:43.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87158, datetime.datetime(2026, 6, 3, 22, 0, 34), datetime.datetime(2026, 6, 3, 22, 0, 33), 'salt', 2.55, 100.19, None, 52.22, 123.32, -0.03, 822.42, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T22:00:43.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:00:43.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:00:43.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:00:33, diff=10.937413s, valid=True
2026-06-03T22:00:43.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:00:43.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:00:43.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:01:12, diff=-28.059733s, valid=True
2026-06-03T22:00:43.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:00:43.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:00:43.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:00:24, diff=19.948343s, valid=True
2026-06-03T22:00:43.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:00:43.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:00:43.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:00:43.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:00:43.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:00:43.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:00:43.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:01:12, diff=-28.047896s, valid=True
2026-06-03T22:00:43.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:00:43.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:00:43.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:00:43.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91040.952926s, valid=True
2026-06-03T22:00:43.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:00:43.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:00:43.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:00:43.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:00:43.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:00:44.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:00:44.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:00:44.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:00:44.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:00:44.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:00:44.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:00:44.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:00:44.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:00:44.273 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:00:44.479 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:00:44.820 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:00:44.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:00:44.922 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:00:44.922 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:00:45.029 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:00:45.030 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:01:15.044 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:01:15.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:01:15.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:01:15.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:01:15.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:01:15.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:01:15.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:01:15.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:01:15.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:01:15.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:01:15.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:01:15.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:01:15.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:01:18.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:01:18.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:01:18.201 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:01:18.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:01:18.211 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:01:18.223 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:01:18.224 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:01:18.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:01:18.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:01:18.225 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:01:18.225 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:01:18.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:01:18.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:01:18.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:01:18.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:01:18.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:01:18.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:01:18.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:01:18.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:01:18.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:01:18.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:01:18.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:01:18.529 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:01:18.600 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:01:04
2026-06-03T22:01:18.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87159, datetime.datetime(2026, 6, 3, 22, 1, 4), datetime.datetime(2026, 6, 3, 22, 1, 3), 'salt', 2.55, 100.16, None, 48.48, 126.18, -0.03, 822.05, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T22:01:18.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:01:18.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:01:18.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:01:03, diff=15.607538s, valid=True
2026-06-03T22:01:18.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:01:18.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:01:18.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:01:12, diff=6.610743s, valid=True
2026-06-03T22:01:18.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:01:18.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:01:18.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:00:54, diff=24.618339s, valid=True
2026-06-03T22:01:18.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:01:18.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:01:18.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:01:18.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:01:18.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:01:18.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:01:18.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:01:12, diff=6.621813s, valid=True
2026-06-03T22:01:18.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:01:18.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:01:18.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:01:18.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91075.622563s, valid=True
2026-06-03T22:01:18.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:01:18.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:01:18.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:01:18.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:01:18.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:01:18.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:01:18.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:01:18.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:01:18.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:01:18.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:01:18.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:01:18.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:01:18.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:01:19.012 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:01:19.218 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:01:19.562 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:01:19.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:01:19.664 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:01:19.664 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:01:19.769 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:01:19.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:01:49.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:01:49.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:01:49.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:01:49.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:01:49.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:01:50.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:01:50.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:01:50.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:01:50.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:01:50.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:01:50.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:01:50.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:01:50.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:01:52.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:01:53.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:01:53.004 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:01:53.004 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:01:53.014 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:01:53.027 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:01:53.028 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:01:53.028 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:01:53.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:01:53.029 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:01:53.029 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:01:53.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:01:53.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:01:53.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:01:53.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:01:53.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:01:53.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:01:53.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:01:53.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:01:53.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:01:53.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:01:53.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:01:53.372 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:01:53.444 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:01:35
2026-06-03T22:01:53.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87160, datetime.datetime(2026, 6, 3, 22, 1, 35), datetime.datetime(2026, 6, 3, 22, 1, 34), 'salt', 2.42, 100.1, None, 45.73, 126.44, -0.02, 822.11, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T22:01:53.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:01:53.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:01:53.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:01:34, diff=19.451935s, valid=True
2026-06-03T22:01:53.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:01:53.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:01:53.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:02:12, diff=-18.544615s, valid=True
2026-06-03T22:01:53.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:01:53.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:01:53.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:01:25, diff=28.463563s, valid=True
2026-06-03T22:01:53.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:01:53.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:01:53.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:01:53.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:01:53.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:01:53.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:01:53.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:02:12, diff=-18.532782s, valid=True
2026-06-03T22:01:53.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:01:53.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:01:53.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:01:53.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91110.46802s, valid=True
2026-06-03T22:01:53.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:01:53.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:01:53.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:01:53.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:01:53.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:01:53.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:01:53.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:01:53.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:01:53.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:01:53.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:01:53.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:01:53.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:01:53.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:01:53.790 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:01:53.997 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:01:54.337 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:01:54.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:01:54.440 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:01:54.440 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:01:54.541 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:01:54.541 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:02:24.571 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:02:24.571 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:02:24.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:02:25.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:02:25.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:02:25.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:02:25.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:02:25.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:02:25.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:02:25.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:02:25.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:02:25.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:02:25.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:02:28.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:02:28.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:02:28.104 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:02:28.105 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:02:28.117 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:02:28.130 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:02:28.131 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:02:28.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:02:28.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:02:28.132 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:02:28.132 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:02:28.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:02:28.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:02:28.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:02:28.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:02:28.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:02:28.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:02:28.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:02:28.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:02:28.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:02:28.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:02:28.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:02:28.461 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:02:28.532 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:02:05
2026-06-03T22:02:28.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87161, datetime.datetime(2026, 6, 3, 22, 2, 5), datetime.datetime(2026, 6, 3, 22, 2, 4), 'salt', 2.52, 100.16, None, 47.21, 121.67, -0.03, 822.35, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T22:02:28.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:02:28.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:02:28.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:02:04, diff=24.540204s, valid=True
2026-06-03T22:02:28.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:02:28.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:02:28.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:02:12, diff=16.543718s, valid=True
2026-06-03T22:02:28.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:02:28.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:02:28.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:02:05, diff=23.551884s, valid=True
2026-06-03T22:02:28.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:02:28.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:02:28.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:02:28.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:02:28.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:02:28.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:02:28.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:02:12, diff=16.555645s, valid=True
2026-06-03T22:02:28.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:02:28.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:02:28.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:02:28.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91145.556435s, valid=True
2026-06-03T22:02:28.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:02:28.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:02:28.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:02:28.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:02:28.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:02:28.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:02:28.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:02:28.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:02:28.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:02:28.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:02:28.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:02:28.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:02:28.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:02:28.875 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:02:29.080 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:02:29.421 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:02:29.523 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:02:29.523 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:02:29.523 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:02:29.612 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:02:29.612 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:02:59.639 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:02:59.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:02:59.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:03:00.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:03:00.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:03:00.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:03:00.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:03:00.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:03:00.355 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:03:00.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:03:00.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:03:00.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:03:00.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:03:03.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:03:03.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:03:03.092 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:03:03.092 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:03:03.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:03:03.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:03:03.115 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:03:03.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:03:03.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:03:03.115 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:03:03.115 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:03:03.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:03:03.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:03:03.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:03:03.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:03:03.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:03:03.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:03:03.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:03:03.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:03:03.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:03:03.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:03:03.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:03:03.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:03:03.458 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:02:35
2026-06-03T22:03:03.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87162, datetime.datetime(2026, 6, 3, 22, 2, 35), datetime.datetime(2026, 6, 3, 22, 2, 35), 'salt', 2.55, 100.16, None, 42.52, 130.48, -0.03, 822.29, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T22:03:03.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:03:03.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:03:03.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:02:35, diff=28.464858s, valid=True
2026-06-03T22:03:03.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:03:03.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:03:03.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:03:12, diff=-8.532019s, valid=True
2026-06-03T22:03:03.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:03:03.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:03:03.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:02:35, diff=28.47548s, valid=True
2026-06-03T22:03:03.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:03:03.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:03:03.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:03:03.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:03:03.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:03:03.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:03:03.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:03:12, diff=-8.52115s, valid=True
2026-06-03T22:03:03.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:03:03.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:03:03.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:03:03.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91180.479567s, valid=True
2026-06-03T22:03:03.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:03:03.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:03:03.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:03:03.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:03:03.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:03:03.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:03:03.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:03:03.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:03:03.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:03:03.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:03:03.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:03:03.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:03:03.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:03:03.798 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:03:04.004 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:03:04.408 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:03:04.510 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:03:04.510 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:03:04.510 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:03:04.582 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:03:04.583 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:03:34.607 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:03:34.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:03:34.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:03:34.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:03:34.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:03:35.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:03:35.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:03:35.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:03:35.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:03:35.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:03:35.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:03:35.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:03:35.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:03:37.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:03:37.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:03:37.719 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:03:37.719 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:03:37.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:03:37.739 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:03:37.740 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:03:37.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:03:37.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:03:37.740 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:03:37.740 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:03:37.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:03:37.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:03:37.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:03:37.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:03:37.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:03:37.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:03:37.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:03:38.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:03:38.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:03:38.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:03:38.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:03:38.004 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:03:38.073 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:03:36
2026-06-03T22:03:38.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87164, datetime.datetime(2026, 6, 3, 22, 3, 36), datetime.datetime(2026, 6, 3, 22, 3, 35), 'salt', 2.52, 100.13, None, 49.08, 121.67, -0.02, 822.05, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T22:03:38.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:03:38.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:03:38.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:03:35, diff=3.082573s, valid=True
2026-06-03T22:03:38.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:03:38.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:03:38.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:04:12, diff=-33.913898s, valid=True
2026-06-03T22:03:38.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:03:38.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:03:38.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:03:36, diff=2.094565s, valid=True
2026-06-03T22:03:38.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:03:38.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:03:38.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:03:38.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:03:38.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:03:38.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:03:38.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:04:12, diff=-33.901952s, valid=True
2026-06-03T22:03:38.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:03:38.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:03:38.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:03:38.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91215.098781s, valid=True
2026-06-03T22:03:38.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:03:38.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:03:38.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:03:38.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:03:38.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:03:38.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:03:38.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:03:38.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:03:38.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:03:38.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:03:38.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:03:38.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:03:38.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:03:38.477 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:03:38.687 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:03:39.033 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:03:39.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:03:39.138 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:03:39.138 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:03:39.227 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:03:39.227 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:04:09.248 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:04:09.248 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:04:09.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:04:09.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:04:09.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:04:10.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:04:10.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:04:10.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:04:10.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:04:10.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:04:10.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:04:10.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:04:10.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:04:12.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:04:12.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:04:12.799 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:04:12.800 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:04:12.811 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:04:12.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:04:12.824 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:04:12.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:04:12.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:04:12.825 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:04:12.825 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:04:12.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:04:12.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:04:12.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:04:13.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:04:13.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:04:13.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:04:13.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:04:13.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:04:13.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:04:13.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:04:13.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:04:13.161 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:04:13.239 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:04:06
2026-06-03T22:04:13.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87165, datetime.datetime(2026, 6, 3, 22, 4, 6), datetime.datetime(2026, 6, 3, 22, 4, 5), 'salt', 2.45, 100.1, None, 49.82, 122.05, -0.02, 822.05, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:04:13.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:04:13.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:04:13.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:04:05, diff=8.247412s, valid=True
2026-06-03T22:04:13.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:04:13.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:04:13.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:04:12, diff=1.250909s, valid=True
2026-06-03T22:04:13.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:04:13.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:04:13.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:04:06, diff=7.259075s, valid=True
2026-06-03T22:04:13.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:04:13.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:04:13.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:04:13.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:04:13.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:04:13.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:04:13.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:04:12, diff=1.262788s, valid=True
2026-06-03T22:04:13.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:04:13.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:04:13.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:04:13.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91250.263582s, valid=True
2026-06-03T22:04:13.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:04:13.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:04:13.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:04:13.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:04:13.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:04:13.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:04:13.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:04:13.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:04:13.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:04:13.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:04:13.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:04:13.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:04:13.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:04:13.658 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:04:13.864 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:04:14.205 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:04:14.308 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:04:14.308 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:04:14.308 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:04:14.476 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:04:14.476 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:04:44.478 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:04:44.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:04:44.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:04:44.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:04:44.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:04:44.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:04:44.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:04:44.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:04:44.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:04:44.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:04:44.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:04:44.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:04:44.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:04:47.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:04:47.616 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:04:47.617 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:04:47.617 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:04:47.627 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:04:47.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:04:47.640 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:04:47.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:04:47.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:04:47.641 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:04:47.641 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:04:47.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:04:47.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:04:47.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:04:47.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:04:47.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:04:47.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:04:47.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:04:47.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:04:47.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:04:47.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:04:47.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:04:47.969 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:04:48.038 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:04:36
2026-06-03T22:04:48.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87166, datetime.datetime(2026, 6, 3, 22, 4, 36), datetime.datetime(2026, 6, 3, 22, 4, 36), 'salt', 2.55, 100.1, None, 42.8, 117.56, -0.02, 822.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T22:04:48.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:04:48.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:04:48.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:04:36, diff=12.046515s, valid=True
2026-06-03T22:04:48.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:04:48.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:04:48.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:05:12, diff=-23.95001s, valid=True
2026-06-03T22:04:48.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:04:48.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:04:48.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:04:32, diff=16.060431s, valid=True
2026-06-03T22:04:48.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:04:48.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:04:48.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:04:48.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:04:48.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:04:48.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:04:48.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:05:12, diff=-23.935373s, valid=True
2026-06-03T22:04:48.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:04:48.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:04:48.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:04:48.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91285.06545s, valid=True
2026-06-03T22:04:48.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:04:48.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:04:48.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:04:48.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:04:48.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:04:48.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:04:48.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:04:48.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:04:48.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:04:48.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:04:48.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:04:48.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:04:48.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:04:48.394 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:04:48.599 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:04:48.941 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:04:49.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:04:49.043 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:04:49.043 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:04:49.206 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:04:49.206 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:05:19.222 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:05:19.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:05:19.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:05:19.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:05:19.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:05:19.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:05:19.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:05:19.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:05:19.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:05:19.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:05:19.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:05:19.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:05:19.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:05:22.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:05:22.828 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:05:22.829 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:05:22.829 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:05:22.840 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:05:22.852 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:05:22.853 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:05:22.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:05:22.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:05:22.854 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:05:22.854 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:05:22.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:05:22.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:05:22.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:05:23.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:05:23.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:05:23.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:05:23.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:05:23.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:05:23.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:05:23.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:05:23.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:05:23.195 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:05:23.270 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:05:07
2026-06-03T22:05:23.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87167, datetime.datetime(2026, 6, 3, 22, 5, 7), datetime.datetime(2026, 6, 3, 22, 5, 6), 'salt', 2.55, 100.2, None, 38.99, 123.93, -0.03, 822.42, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T22:05:23.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:05:23.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:05:23.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:05:06, diff=17.277727s, valid=True
2026-06-03T22:05:23.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:05:23.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:05:23.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:05:12, diff=11.281196s, valid=True
2026-06-03T22:05:23.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:05:23.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:05:23.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:05:04, diff=19.28924s, valid=True
2026-06-03T22:05:23.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:05:23.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:05:23.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:05:23.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:05:23.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:05:23.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:05:23.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:05:12, diff=11.292946s, valid=True
2026-06-03T22:05:23.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:05:23.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:05:23.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:05:23.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91320.293762s, valid=True
2026-06-03T22:05:23.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:05:23.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:05:23.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:05:23.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:05:23.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:05:23.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:05:23.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:05:23.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:05:23.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:05:23.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:05:23.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:05:23.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:05:23.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:05:23.683 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:05:23.889 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:05:24.240 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:05:24.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:05:24.354 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:05:24.355 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:05:24.518 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:05:24.518 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:05:54.539 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:05:54.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:05:54.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:05:54.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:05:54.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:05:54.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:05:54.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:05:55.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:05:55.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:05:55.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:05:55.019 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:05:55.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:05:55.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:05:58.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:05:58.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:05:58.818 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:05:58.818 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:05:58.829 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:05:58.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:05:58.842 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:05:58.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:05:58.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:05:58.843 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:05:58.843 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:05:58.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:05:58.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:05:58.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:05:59.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:05:59.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:05:59.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:05:59.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:05:59.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:05:59.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:05:59.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:05:59.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:05:59.195 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:05:59.266 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:05:37
2026-06-03T22:05:59.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87168, datetime.datetime(2026, 6, 3, 22, 5, 37), datetime.datetime(2026, 6, 3, 22, 5, 36), 'salt', 2.52, 100.13, None, 48.62, 121.04, -0.02, 822.23, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T22:05:59.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:05:59.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:05:59.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:05:36, diff=23.274378s, valid=True
2026-06-03T22:05:59.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:05:59.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:05:59.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:06:12, diff=-12.722089s, valid=True
2026-06-03T22:05:59.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:05:59.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:05:59.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:05:35, diff=24.286237s, valid=True
2026-06-03T22:05:59.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:05:59.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:05:59.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:05:59.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:05:59.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:05:59.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:05:59.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:06:12, diff=-12.710012s, valid=True
2026-06-03T22:05:59.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:05:59.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:05:59.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:05:59.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91356.290816s, valid=True
2026-06-03T22:05:59.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:05:59.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:05:59.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:05:59.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:05:59.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:05:59.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:05:59.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:05:59.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:05:59.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:05:59.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:05:59.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:05:59.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:05:59.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:05:59.611 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:05:59.816 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:06:00.195 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:06:00.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:06:00.299 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:06:00.299 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:06:00.519 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:06:00.519 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:06:30.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:06:30.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:06:30.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:06:30.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:06:30.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:06:31.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:06:31.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:06:31.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:06:31.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:06:31.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:06:31.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:06:31.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:06:31.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:06:33.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:06:33.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:06:33.890 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:06:33.890 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:06:33.900 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:06:33.913 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:06:33.913 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:06:33.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:06:33.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:06:33.915 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:06:33.915 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:06:33.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:06:34.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:06:34.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:06:34.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:06:34.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:06:34.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:06:34.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:06:34.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:06:34.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:06:34.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:06:34.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:06:34.249 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:06:34.324 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:06:07
2026-06-03T22:06:34.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87169, datetime.datetime(2026, 6, 3, 22, 6, 7), datetime.datetime(2026, 6, 3, 22, 6, 6), 'salt', 2.42, 100.06, None, 48.16, 106.85, -0.01, 822.17, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T22:06:34.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:06:34.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:06:34.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:06:06, diff=28.331878s, valid=True
2026-06-03T22:06:34.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:06:34.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:06:34.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:06:12, diff=22.335351s, valid=True
2026-06-03T22:06:34.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:06:34.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:06:34.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:06:07, diff=27.343455s, valid=True
2026-06-03T22:06:34.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:06:34.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:06:34.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:06:34.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:06:34.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:06:34.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:06:34.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:06:12, diff=22.347161s, valid=True
2026-06-03T22:06:34.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:06:34.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:06:34.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:06:34.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91391.347975s, valid=True
2026-06-03T22:06:34.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:06:34.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:06:34.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:06:34.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:06:34.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:06:34.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:06:34.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:06:34.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:06:34.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:06:34.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:06:34.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:06:34.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:06:34.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:06:34.670 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:06:34.878 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:06:35.224 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:06:35.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:06:35.327 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:06:35.327 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:06:35.537 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:06:35.537 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:07:05.540 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:07:05.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:07:05.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:07:06.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:07:06.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:07:06.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:07:06.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:07:06.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:07:06.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:07:06.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:07:06.310 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:07:06.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:07:06.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:07:09.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:07:09.029 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:07:09.030 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:07:09.030 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:07:09.040 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:07:09.055 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:07:09.056 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:07:09.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:07:09.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:07:09.057 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:07:09.057 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:07:09.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:07:09.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:07:09.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:07:09.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:07:09.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:07:09.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:07:09.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:07:09.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:07:09.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:07:09.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:07:09.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:07:09.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:07:09.455 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:07:08
2026-06-03T22:07:09.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87171, datetime.datetime(2026, 6, 3, 22, 7, 8), datetime.datetime(2026, 6, 3, 22, 7, 7), 'salt', 2.55, 100.13, None, 54.58, 118.9, -0.02, 821.87, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:07:09.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:07:09.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:07:09.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:07:07, diff=2.463392s, valid=True
2026-06-03T22:07:09.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:07:09.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:07:09.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:07:12, diff=-2.53315s, valid=True
2026-06-03T22:07:09.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:07:09.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:07:09.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:06:59, diff=10.474888s, valid=True
2026-06-03T22:07:09.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:07:09.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:07:09.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:07:09.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:07:09.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:07:09.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:07:09.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:07:12, diff=-2.521171s, valid=True
2026-06-03T22:07:09.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:07:09.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:07:09.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:07:09.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91426.479659s, valid=True
2026-06-03T22:07:09.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:07:09.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:07:09.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:07:09.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:07:09.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:07:09.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:07:09.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:07:09.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:07:09.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:07:09.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:07:09.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:07:09.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:07:09.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:07:09.797 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:07:10.029 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:07:10.469 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:07:10.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:07:10.582 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:07:10.582 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:07:10.771 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:07:10.771 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:07:40.785 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:07:40.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:07:40.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:07:41.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:07:41.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:07:41.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:07:41.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:07:41.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:07:41.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:07:41.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:07:41.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:07:41.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:07:41.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:07:44.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:07:44.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:07:44.095 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:07:44.095 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:07:44.105 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:07:44.118 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:07:44.119 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:07:44.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:07:44.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:07:44.120 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:07:44.120 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:07:44.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:07:44.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:07:44.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:07:44.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:07:44.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:07:44.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:07:44.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:07:44.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:07:44.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:07:44.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:07:44.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:07:44.461 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:07:44.537 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:07:38
2026-06-03T22:07:44.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87172, datetime.datetime(2026, 6, 3, 22, 7, 38), datetime.datetime(2026, 6, 3, 22, 7, 37), 'salt', 2.45, 100.06, None, 49.18, 121.7, -0.02, 822.29, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:07:44.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:07:44.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:07:44.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:07:37, diff=7.544777s, valid=True
2026-06-03T22:07:44.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:07:44.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:07:44.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:08:12, diff=-27.451638s, valid=True
2026-06-03T22:07:44.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:07:44.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:07:44.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:07:31, diff=13.556747s, valid=True
2026-06-03T22:07:44.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:07:44.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:07:44.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:07:44.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:07:44.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:07:44.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:07:44.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:08:12, diff=-27.439407s, valid=True
2026-06-03T22:07:44.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:07:44.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:07:44.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:07:44.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91461.561456s, valid=True
2026-06-03T22:07:44.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:07:44.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:07:44.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:07:44.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:07:44.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:07:44.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:07:44.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:07:44.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:07:44.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:07:44.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:07:44.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:07:44.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:07:44.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:07:44.884 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:07:45.091 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:07:45.434 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:07:45.537 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:07:45.538 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:07:45.538 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:07:45.620 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:07:45.621 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:08:15.622 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:08:15.622 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:08:15.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:08:15.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:08:15.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:08:16.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:08:16.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:08:16.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:08:16.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:08:16.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:08:16.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:08:16.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:08:16.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:08:18.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:08:18.865 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:08:18.866 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:08:18.866 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:08:18.876 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:08:18.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:08:18.889 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:08:18.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:08:18.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:08:18.890 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:08:18.890 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:08:18.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:08:19.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:08:19.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:08:19.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:08:19.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:08:19.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:08:19.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:08:19.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:08:19.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:08:19.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:08:19.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:08:19.221 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:08:19.291 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:08:08
2026-06-03T22:08:19.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87173, datetime.datetime(2026, 6, 3, 22, 8, 8), datetime.datetime(2026, 6, 3, 22, 8, 8), 'salt', 2.49, 100.13, None, 50.63, 114.95, -0.02, 822.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:08:19.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:08:19.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:08:19.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:08:08, diff=11.299376s, valid=True
2026-06-03T22:08:19.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:08:19.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:08:19.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:08:12, diff=7.302877s, valid=True
2026-06-03T22:08:19.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:08:19.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:08:19.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:08:02, diff=17.310911s, valid=True
2026-06-03T22:08:19.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:08:19.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:08:19.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:08:19.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:08:19.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:08:19.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:08:19.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:08:12, diff=7.314633s, valid=True
2026-06-03T22:08:19.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:08:19.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:08:19.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:08:19.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91496.315414s, valid=True
2026-06-03T22:08:19.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:08:19.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:08:19.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:08:19.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:08:19.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:08:19.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:08:19.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:08:19.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:08:19.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:08:19.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:08:19.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:08:19.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:08:19.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:08:19.709 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:08:19.925 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:08:20.284 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:08:20.386 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:08:20.387 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:08:20.387 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:08:20.524 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:08:20.524 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:08:50.554 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:08:50.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:08:50.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:08:50.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:08:50.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:08:50.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:08:50.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:08:50.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:08:50.993 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:08:51.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:08:51.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:08:51.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:08:51.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:08:53.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:08:53.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:08:53.674 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:08:53.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:08:53.682 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:08:53.695 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:08:53.695 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:08:53.696 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:08:53.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:08:53.697 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:08:53.697 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:08:53.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:08:53.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:08:53.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:08:53.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:08:53.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:08:53.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:08:53.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:08:54.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:08:54.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:08:54.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:08:54.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:08:54.037 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:08:54.108 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:08:38
2026-06-03T22:08:54.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87174, datetime.datetime(2026, 6, 3, 22, 8, 38), datetime.datetime(2026, 6, 3, 22, 8, 38), 'salt', 2.42, 100.1, None, 40.58, 113.85, -0.02, 822.11, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T22:08:54.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:08:54.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:08:54.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:08:38, diff=16.115767s, valid=True
2026-06-03T22:08:54.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:08:54.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:08:54.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:09:12, diff=-17.880736s, valid=True
2026-06-03T22:08:54.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:08:54.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:08:54.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:08:33, diff=21.127484s, valid=True
2026-06-03T22:08:54.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:08:54.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:08:54.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:08:54.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:08:54.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:08:54.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:08:54.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:09:12, diff=-17.868716s, valid=True
2026-06-03T22:08:54.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:08:54.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:08:54.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:08:54.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91531.132202s, valid=True
2026-06-03T22:08:54.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:08:54.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:08:54.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:08:54.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:08:54.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:08:54.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:08:54.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:08:54.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:08:54.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:08:54.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:08:54.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:08:54.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:08:54.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:08:54.453 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:08:54.659 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:08:55.001 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:08:55.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:08:55.105 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:08:55.106 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:08:55.703 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:08:55.703 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:09:25.733 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:09:25.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:09:25.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:09:25.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:09:25.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:09:26.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:09:26.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:09:26.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:09:26.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:09:26.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:09:26.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:09:26.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:09:26.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:09:28.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:09:28.806 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:09:28.806 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:09:28.807 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:09:28.818 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:09:28.831 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:09:28.831 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:09:28.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:09:28.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:09:28.833 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:09:28.833 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:09:28.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:09:28.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:09:28.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:09:29.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:09:29.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:09:29.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:09:29.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:09:29.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:09:29.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:09:29.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:09:29.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:09:29.184 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:09:29.261 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:09:09
2026-06-03T22:09:29.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87175, datetime.datetime(2026, 6, 3, 22, 9, 9), datetime.datetime(2026, 6, 3, 22, 9, 8), 'salt', 2.52, 100.1, None, 47.98, 132.92, -0.02, 822.11, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:09:29.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:09:29.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:09:29.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:09:08, diff=21.268584s, valid=True
2026-06-03T22:09:29.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:09:29.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:09:29.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:09:12, diff=17.271947s, valid=True
2026-06-03T22:09:29.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:09:29.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:09:29.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:09:05, diff=24.279779s, valid=True
2026-06-03T22:09:29.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:09:29.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:09:29.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:09:29.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:09:29.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:09:29.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:09:29.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:09:12, diff=17.283386s, valid=True
2026-06-03T22:09:29.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:09:29.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:09:29.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:09:29.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91566.284197s, valid=True
2026-06-03T22:09:29.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:09:29.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:09:29.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:09:29.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:09:29.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:09:29.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:09:29.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:09:29.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:09:29.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:09:29.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:09:29.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:09:29.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:09:29.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:09:29.677 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:09:29.901 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:09:30.267 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:09:30.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:09:30.371 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:09:30.371 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:09:30.639 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:09:30.639 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:10:00.669 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:10:00.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:10:00.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:10:00.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:10:01.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:10:01.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:10:01.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:10:01.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:10:01.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:10:01.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:10:01.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:10:01.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:10:01.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:10:03.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:10:03.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:10:03.873 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:10:03.873 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:10:03.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:10:03.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:10:03.894 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:10:03.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:10:03.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:10:03.894 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:10:03.894 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:10:03.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:10:03.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:10:03.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:10:04.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:10:04.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:10:04.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:10:04.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:10:04.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:10:04.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:10:04.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:10:04.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:10:04.178 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:10:04.255 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:09:39
2026-06-03T22:10:04.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87176, datetime.datetime(2026, 6, 3, 22, 9, 39), datetime.datetime(2026, 6, 3, 22, 9, 38), 'salt', 2.49, 100.1, None, 46.15, 125.38, -0.01, 822.11, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T22:10:04.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:10:04.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:10:04.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:09:38, diff=26.261723s, valid=True
2026-06-03T22:10:04.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:10:04.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:10:04.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:10:12, diff=-7.735041s, valid=True
2026-06-03T22:10:04.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:10:04.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:10:04.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:09:36, diff=28.272128s, valid=True
2026-06-03T22:10:04.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:10:04.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:10:04.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:10:04.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:10:04.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:10:04.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:10:04.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:10:12, diff=-7.724786s, valid=True
2026-06-03T22:10:04.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:10:04.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:10:04.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:10:04.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91601.275935s, valid=True
2026-06-03T22:10:04.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:10:04.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:10:04.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:10:04.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:10:04.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:10:04.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:10:04.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:10:04.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:10:04.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:10:04.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:10:04.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:10:04.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:10:04.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:10:04.602 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:10:04.814 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:10:05.162 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:10:05.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:10:05.270 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:10:05.270 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:10:05.464 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:10:05.464 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:10:35.494 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:10:35.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:10:35.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:10:35.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:10:35.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:10:35.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:10:35.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:10:35.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:10:35.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:10:35.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:10:35.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:10:36.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:10:36.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:10:38.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:10:38.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:10:38.648 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:10:38.649 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:10:38.660 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:10:38.673 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:10:38.673 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:10:38.674 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:10:38.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:10:38.674 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:10:38.675 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:10:38.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:10:38.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:10:38.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:10:38.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:10:38.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:10:38.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:10:38.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:10:38.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:10:38.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:10:39.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:10:39.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:10:39.000 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:10:39.069 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:10:09
2026-06-03T22:10:39.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87177, datetime.datetime(2026, 6, 3, 22, 10, 9), datetime.datetime(2026, 6, 3, 22, 10, 9), 'salt', 2.59, 100.2, None, 41.0, 117.94, -0.03, 822.11, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T22:10:39.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:10:39.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:10:39.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:10:09, diff=30.07677s, valid=True
2026-06-03T22:10:39.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:10:39.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:10:39.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:10:12, diff=27.080223s, valid=True
2026-06-03T22:10:39.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:10:39.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:10:39.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:10:08, diff=31.088273s, valid=True
2026-06-03T22:10:39.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:10:39.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:10:39.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:10:39.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:10:39.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:10:39.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:10:39.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:10:12, diff=27.091974s, valid=True
2026-06-03T22:10:39.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:10:39.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:10:39.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:10:39.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91636.092805s, valid=True
2026-06-03T22:10:39.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:10:39.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:10:39.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:10:39.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:10:39.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:10:39.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:10:39.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:10:39.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:10:39.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:10:39.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:10:39.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:10:39.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:10:39.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:10:39.412 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:10:39.619 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:10:39.969 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:10:40.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:10:40.076 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:10:40.076 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:10:40.266 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:10:40.266 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:11:10.296 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:11:10.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:11:10.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:11:10.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:11:10.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:11:10.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:11:10.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:11:10.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:11:10.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:11:10.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:11:10.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:11:10.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:11:10.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:11:13.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:11:13.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:11:13.591 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:11:13.591 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:11:13.603 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:11:13.615 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:11:13.616 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:11:13.616 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:11:13.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:11:13.617 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:11:13.617 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:11:13.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:11:13.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:11:13.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:11:13.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:11:13.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:11:13.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:11:13.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:11:13.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:11:13.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:11:13.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:11:13.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:11:13.941 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:11:14.019 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:11:10
2026-06-03T22:11:14.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87179, datetime.datetime(2026, 6, 3, 22, 11, 10), datetime.datetime(2026, 6, 3, 22, 11, 9), 'salt', 2.45, 100.16, None, 41.28, 116.25, -0.03, 822.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T22:11:14.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:11:14.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:11:14.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:11:09, diff=5.02714s, valid=True
2026-06-03T22:11:14.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:11:14.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:11:14.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:11:12, diff=2.030543s, valid=True
2026-06-03T22:11:14.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:11:14.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:11:14.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:11:00, diff=14.03848s, valid=True
2026-06-03T22:11:14.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:11:14.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:11:14.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:11:14.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:11:14.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:11:14.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:11:14.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:11:12, diff=2.042091s, valid=True
2026-06-03T22:11:14.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:11:14.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:11:14.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:11:14.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91671.042873s, valid=True
2026-06-03T22:11:14.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:11:14.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:11:14.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:11:14.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:11:14.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:11:14.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:11:14.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:11:14.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:11:14.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:11:14.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:11:14.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:11:14.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:11:14.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:11:14.362 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:11:14.568 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:11:14.969 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:11:15.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:11:15.071 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:11:15.071 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:11:15.264 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:11:15.264 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:11:45.284 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:11:45.284 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:11:45.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:11:45.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:11:45.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:11:45.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:11:45.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:11:45.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:11:45.728 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:11:45.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:11:45.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:11:45.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:11:45.746 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:11:48.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:11:48.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:11:48.362 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:11:48.362 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:11:48.370 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:11:48.382 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:11:48.382 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:11:48.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:11:48.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:11:48.382 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:11:48.382 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:11:48.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:11:48.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:11:48.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:11:48.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:11:48.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:11:48.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:11:48.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:11:48.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:11:48.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:11:48.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:11:48.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:11:48.701 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:11:48.777 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:11:40
2026-06-03T22:11:48.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87180, datetime.datetime(2026, 6, 3, 22, 11, 40), datetime.datetime(2026, 6, 3, 22, 11, 39), 'salt', 2.49, 100.13, None, 38.71, 116.08, -0.02, 822.11, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T22:11:48.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:11:48.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:11:48.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:11:39, diff=9.784465s, valid=True
2026-06-03T22:11:48.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:11:48.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:11:48.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:12:12, diff=-23.212193s, valid=True
2026-06-03T22:11:48.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:11:48.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:11:48.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:11:32, diff=16.795698s, valid=True
2026-06-03T22:11:48.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:11:48.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:11:48.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:11:48.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:11:48.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:11:48.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:11:48.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:12:12, diff=-23.200727s, valid=True
2026-06-03T22:11:48.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:11:48.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:11:48.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:11:48.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91705.800048s, valid=True
2026-06-03T22:11:48.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:11:48.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:11:48.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:11:48.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:11:48.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:11:48.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:11:48.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:11:48.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:11:48.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:11:48.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:11:48.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:11:49.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:11:49.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:11:49.119 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:11:49.325 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:11:49.666 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:11:49.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:11:49.769 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:11:49.769 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:11:50.048 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:11:50.048 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:12:20.078 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:12:20.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:12:20.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:12:20.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:12:20.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:12:20.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:12:20.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:12:20.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:12:20.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:12:20.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:12:20.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:12:20.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:12:20.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:12:23.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:12:23.129 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:12:23.130 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:12:23.130 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:12:23.141 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:12:23.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:12:23.155 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:12:23.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:12:23.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:12:23.156 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:12:23.156 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:12:23.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:12:23.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:12:23.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:12:23.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:12:23.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:12:23.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:12:23.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:12:23.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:12:23.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:12:23.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:12:23.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:12:23.484 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:12:23.554 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:12:10
2026-06-03T22:12:23.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87181, datetime.datetime(2026, 6, 3, 22, 12, 10), datetime.datetime(2026, 6, 3, 22, 12, 9), 'salt', 2.62, 100.2, None, 41.39, 114.79, -0.03, 822.23, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T22:12:23.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:12:23.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:12:23.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:12:09, diff=14.561332s, valid=True
2026-06-03T22:12:23.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:12:23.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:12:23.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:12:12, diff=11.564843s, valid=True
2026-06-03T22:12:23.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:12:23.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:12:23.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:12:03, diff=20.572981s, valid=True
2026-06-03T22:12:23.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:12:23.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:12:23.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:12:23.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:12:23.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:12:23.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:12:23.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:12:12, diff=11.576662s, valid=True
2026-06-03T22:12:23.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:12:23.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:12:23.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:12:23.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91740.577466s, valid=True
2026-06-03T22:12:23.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:12:23.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:12:23.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:12:23.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:12:23.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:12:23.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:12:23.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:12:23.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:12:23.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:12:23.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:12:23.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:12:23.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:12:23.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:12:23.974 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:12:24.182 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:12:24.525 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:12:24.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:12:24.629 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:12:24.630 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:12:24.818 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:12:24.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:12:54.848 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:12:54.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:12:54.849 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:12:55.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:12:55.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:12:55.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:12:55.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:12:55.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:12:55.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:12:55.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:12:55.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:12:55.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:12:55.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:12:57.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:12:57.973 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:12:57.974 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:12:57.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:12:57.983 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:12:57.996 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:12:57.997 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:12:57.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:12:57.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:12:57.998 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:12:57.998 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:12:58.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:12:58.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:12:58.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:12:58.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:12:58.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:12:58.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:12:58.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:12:58.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:12:58.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:12:58.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:12:58.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:12:58.329 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:12:58.400 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:12:40
2026-06-03T22:12:58.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87182, datetime.datetime(2026, 6, 3, 22, 12, 40), datetime.datetime(2026, 6, 3, 22, 12, 40), 'salt', 2.52, 100.16, None, 36.73, 121.18, -0.03, 822.11, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T22:12:58.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:12:58.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:12:58.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:12:40, diff=18.407593s, valid=True
2026-06-03T22:12:58.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:12:58.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:12:58.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:13:12, diff=-13.588962s, valid=True
2026-06-03T22:12:58.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:12:58.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:12:58.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:12:34, diff=24.419255s, valid=True
2026-06-03T22:12:58.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:12:58.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:12:58.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:12:58.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:12:58.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:12:58.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:12:58.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:13:12, diff=-13.577068s, valid=True
2026-06-03T22:12:58.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:12:58.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:12:58.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:12:58.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91775.423744s, valid=True
2026-06-03T22:12:58.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:12:58.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:12:58.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:12:58.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:12:58.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:12:58.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:12:58.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:12:58.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:12:58.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:12:58.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:12:58.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:12:58.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:12:58.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:12:58.743 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:12:58.948 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:12:59.289 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:12:59.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:12:59.390 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:12:59.390 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:12:59.547 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:12:59.547 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:13:29.566 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:13:29.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:13:29.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:13:30.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:13:30.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:13:30.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:13:30.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:13:30.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:13:30.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:13:30.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:13:30.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:13:30.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:13:30.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:13:33.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:13:33.017 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:13:33.017 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:13:33.018 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:13:33.028 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:13:33.041 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:13:33.041 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:13:33.042 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:13:33.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:13:33.042 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:13:33.043 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:13:33.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:13:33.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:13:33.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:13:33.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:13:33.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:13:33.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:13:33.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:13:33.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:13:33.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:13:33.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:13:33.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:13:33.373 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:13:33.444 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:13:11
2026-06-03T22:13:33.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87183, datetime.datetime(2026, 6, 3, 22, 13, 11), datetime.datetime(2026, 6, 3, 22, 13, 10), 'salt', 2.59, 100.23, None, 35.64, 126.56, -0.03, 822.29, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T22:13:33.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:13:33.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:13:33.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:13:10, diff=23.45174s, valid=True
2026-06-03T22:13:33.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:13:33.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:13:33.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:13:12, diff=21.455259s, valid=True
2026-06-03T22:13:33.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:13:33.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:13:33.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:13:06, diff=27.463428s, valid=True
2026-06-03T22:13:33.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:13:33.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:13:33.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:13:33.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:13:33.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:13:33.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:13:33.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:13:12, diff=21.467141s, valid=True
2026-06-03T22:13:33.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:13:33.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:13:33.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:13:33.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91810.467962s, valid=True
2026-06-03T22:13:33.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:13:33.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:13:33.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:13:33.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:13:33.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:13:33.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:13:33.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:13:33.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:13:33.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:13:33.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:13:33.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:13:33.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:13:33.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:13:33.866 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:13:34.073 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:13:34.419 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:13:34.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:13:34.528 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:13:34.528 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:13:34.714 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:13:34.714 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:14:04.744 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:14:04.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:14:04.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:14:05.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:14:05.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:14:05.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:14:05.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:14:05.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:14:05.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:14:05.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:14:05.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:14:05.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:14:05.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:14:07.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:14:07.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:14:07.907 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:14:07.907 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:14:07.918 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:14:07.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:14:07.932 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:14:07.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:14:07.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:14:07.933 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:14:07.933 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:14:07.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:14:08.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:14:08.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:14:08.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:14:08.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:14:08.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:14:08.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:14:08.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:14:08.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:14:08.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:14:08.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:14:08.268 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:14:08.341 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:13:41
2026-06-03T22:14:08.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87184, datetime.datetime(2026, 6, 3, 22, 13, 41), datetime.datetime(2026, 6, 3, 22, 13, 40), 'salt', 2.65, 100.23, None, 40.15, 126.23, -0.04, 822.05, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T22:14:08.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:14:08.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:14:08.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:13:40, diff=28.348332s, valid=True
2026-06-03T22:14:08.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:14:08.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:14:08.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:14:12, diff=-3.648219s, valid=True
2026-06-03T22:14:08.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:14:08.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:14:08.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:13:37, diff=31.359899s, valid=True
2026-06-03T22:14:08.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:14:08.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:14:08.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:14:08.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:14:08.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:14:08.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:14:08.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:14:12, diff=-3.636354s, valid=True
2026-06-03T22:14:08.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:14:08.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:14:08.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:14:08.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91845.364459s, valid=True
2026-06-03T22:14:08.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:14:08.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:14:08.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:14:08.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:14:08.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:14:08.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:14:08.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:14:08.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:14:08.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:14:08.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:14:08.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:14:08.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:14:08.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:14:08.687 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:14:08.895 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:14:09.244 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:14:09.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:14:09.347 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:14:09.347 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:14:11.173 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:14:11.174 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:14:41.204 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:14:41.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:14:41.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:14:41.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:14:41.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:14:41.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:14:41.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:14:41.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:14:41.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:14:41.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:14:41.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:14:41.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:14:41.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:14:44.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:14:44.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:14:44.357 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:14:44.357 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:14:44.368 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:14:44.380 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:14:44.381 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:14:44.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:14:44.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:14:44.382 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:14:44.382 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:14:44.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:14:44.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:14:44.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:14:44.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:14:44.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:14:44.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:14:44.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:14:44.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:14:44.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:14:44.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:14:44.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:14:44.712 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:14:44.783 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:14:41
2026-06-03T22:14:44.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87186, datetime.datetime(2026, 6, 3, 22, 14, 41), datetime.datetime(2026, 6, 3, 22, 14, 41), 'salt', 2.55, 100.16, None, 47.77, 123.86, -0.03, 822.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:14:44.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:14:44.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:14:44.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:14:41, diff=3.791068s, valid=True
2026-06-03T22:14:44.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:14:44.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:14:44.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:15:12, diff=-27.205435s, valid=True
2026-06-03T22:14:44.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:14:44.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:14:44.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:14:40, diff=4.80279s, valid=True
2026-06-03T22:14:44.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:14:44.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:14:44.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:14:44.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:14:44.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:14:44.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:14:44.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:15:12, diff=-27.193462s, valid=True
2026-06-03T22:14:44.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:14:44.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:14:44.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:14:44.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91881.80736s, valid=True
2026-06-03T22:14:44.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:14:44.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:14:44.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:14:44.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:14:44.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:14:44.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:14:44.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:14:44.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:14:44.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:14:45.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:14:45.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:14:45.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:14:45.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:14:45.195 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:14:45.400 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:14:45.743 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:14:45.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:14:45.845 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:14:45.845 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:14:46.108 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:14:46.108 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:15:16.138 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:15:16.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:15:16.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:15:16.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:15:16.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:15:16.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:15:16.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:15:16.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:15:16.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:15:16.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:15:16.587 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:15:16.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:15:16.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:15:19.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:15:19.240 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:15:19.241 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:15:19.241 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:15:19.252 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:15:19.264 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:15:19.265 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:15:19.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:15:19.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:15:19.266 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:15:19.266 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:15:19.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:15:19.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:15:19.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:15:19.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:15:19.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:15:19.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:15:19.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:15:19.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:15:19.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:15:19.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:15:19.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:15:19.596 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:15:19.668 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:15:12
2026-06-03T22:15:19.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87187, datetime.datetime(2026, 6, 3, 22, 15, 12), datetime.datetime(2026, 6, 3, 22, 15, 11), 'salt', 2.55, 100.2, None, 48.2, 129.05, -0.03, 822.36, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:15:19.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:15:19.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:15:19.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:15:11, diff=8.675635s, valid=True
2026-06-03T22:15:19.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:15:19.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:15:19.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:15:12, diff=7.679169s, valid=True
2026-06-03T22:15:19.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:15:19.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:15:19.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:15:02, diff=17.687612s, valid=True
2026-06-03T22:15:19.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:15:19.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:15:19.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:15:19.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:15:19.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:15:19.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:15:19.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:15:12, diff=7.691412s, valid=True
2026-06-03T22:15:19.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:15:19.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:15:19.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:15:19.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91916.692284s, valid=True
2026-06-03T22:15:19.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:15:19.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:15:19.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:15:19.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:15:19.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:15:19.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:15:19.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:15:19.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:15:19.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:15:19.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:15:19.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:15:19.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:15:19.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:15:20.030 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:15:20.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:15:20.598 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:15:20.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:15:20.700 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:15:20.700 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:15:20.885 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:15:20.885 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:15:50.908 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:15:50.908 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:15:50.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:15:51.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:15:51.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:15:51.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:15:51.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:15:51.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:15:51.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:15:51.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:15:51.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:15:51.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:15:51.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:15:54.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:15:54.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:15:54.256 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:15:54.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:15:54.265 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:15:54.277 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:15:54.278 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:15:54.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:15:54.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:15:54.279 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:15:54.279 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:15:54.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:15:54.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:15:54.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:15:54.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:15:54.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:15:54.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T22:15:54.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:15:54.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T22:15:54.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:15:54.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:15:54.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:15:54.601 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:15:54.673 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:15:42
2026-06-03T22:15:54.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87188, datetime.datetime(2026, 6, 3, 22, 15, 42), datetime.datetime(2026, 6, 3, 22, 15, 41), 'salt', 2.45, 100.1, None, 52.85, 127.4, -0.02, 822.05, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:15:54.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:15:54.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:15:54.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:15:41, diff=13.680371s, valid=True
2026-06-03T22:15:54.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:15:54.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T22:15:54.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:16:12, diff=-17.316403s, valid=True
2026-06-03T22:15:54.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:15:54.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:15:54.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:15:32, diff=22.691277s, valid=True
2026-06-03T22:15:54.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:15:54.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:15:54.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:15:54.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:15:54.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:15:54.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T22:15:54.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:16:12, diff=-17.305252s, valid=True
2026-06-03T22:15:54.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:15:54.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:15:54.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:15:54.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91951.695536s, valid=True
2026-06-03T22:15:54.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:15:54.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:15:54.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:15:54.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:15:54.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:15:54.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:15:54.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:15:54.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:15:54.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:15:54.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:15:54.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:15:54.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:15:54.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:15:55.013 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:15:55.218 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:15:55.559 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:15:55.661 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:15:55.661 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:15:55.661 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:15:55.843 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:15:55.843 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:16:25.872 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:16:25.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:16:25.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:16:26.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:16:26.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:16:26.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:16:26.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:16:26.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:16:26.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:16:26.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:16:26.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:16:26.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:16:26.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:16:29.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:16:29.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:16:29.304 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:16:29.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:16:29.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:16:29.331 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:16:29.331 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:16:29.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:16:29.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:16:29.332 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:16:29.333 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:16:29.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:16:29.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:16:29.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:16:29.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:16:29.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:16:29.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T22:16:29.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:16:29.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T22:16:29.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:16:29.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:16:29.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:16:29.679 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:16:29.753 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:16:12
2026-06-03T22:16:29.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87189, datetime.datetime(2026, 6, 3, 22, 16, 12), datetime.datetime(2026, 6, 3, 22, 16, 12), 'salt', 2.49, 100.1, None, 42.87, 118.29, -0.01, 822.11, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T22:16:29.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:16:29.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:16:29.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:16:12, diff=17.7605s, valid=True
2026-06-03T22:16:29.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:16:29.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T22:16:29.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:16:12, diff=17.764215s, valid=True
2026-06-03T22:16:29.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:16:29.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:16:29.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:16:02, diff=27.772553s, valid=True
2026-06-03T22:16:29.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:16:29.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:16:29.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:16:29.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:16:29.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:16:29.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T22:16:29.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:16:12, diff=17.776349s, valid=True
2026-06-03T22:16:29.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:16:29.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:16:29.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:16:29.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=91986.777171s, valid=True
2026-06-03T22:16:29.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:16:29.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:16:29.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:16:29.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:16:29.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:16:29.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:16:29.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:16:29.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:16:29.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:16:29.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:16:29.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:16:30.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:16:30.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:16:30.134 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:16:30.405 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:16:30.748 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:16:30.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:16:30.850 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:16:30.850 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:16:31.035 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:16:31.035 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:17:01.053 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:17:01.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:17:01.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:17:01.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:17:01.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:17:01.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:17:01.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:17:01.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:17:01.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:17:01.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:17:01.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:17:01.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:17:01.661 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:17:04.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:17:04.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:17:04.233 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:17:04.234 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:17:04.245 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:17:04.257 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:17:04.258 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:17:04.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:17:04.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:17:04.259 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:17:04.259 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:17:04.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:17:04.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:17:04.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:17:04.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:17:04.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:17:04.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T22:17:04.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:17:04.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T22:17:04.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:17:04.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:17:04.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:17:04.604 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:17:04.676 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:16:43
2026-06-03T22:17:04.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87190, datetime.datetime(2026, 6, 3, 22, 16, 43), datetime.datetime(2026, 6, 3, 22, 16, 42), 'salt', 2.42, 100.03, None, 51.44, 130.06, -0.01, 821.99, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:17:04.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:17:04.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:17:04.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:16:42, diff=22.683854s, valid=True
2026-06-03T22:17:04.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:17:04.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T22:17:04.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:17:12, diff=-7.312669s, valid=True
2026-06-03T22:17:04.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:17:04.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:17:04.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:16:34, diff=30.695629s, valid=True
2026-06-03T22:17:04.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:17:04.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:17:04.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:17:04.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:17:04.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:17:04.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T22:17:04.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:17:12, diff=-7.300664s, valid=True
2026-06-03T22:17:04.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:17:04.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:17:04.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:17:04.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92021.700154s, valid=True
2026-06-03T22:17:04.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:17:04.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:17:04.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:17:04.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:17:04.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:17:04.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:17:04.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:17:04.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:17:04.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:17:04.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:17:04.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:17:04.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:17:04.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:17:05.023 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:17:05.238 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:17:05.578 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:17:05.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:17:05.680 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:17:05.680 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:17:05.836 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:17:05.836 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:17:35.844 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:17:35.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:17:35.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:17:36.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:17:36.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:17:36.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:17:36.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:17:36.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:17:36.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:17:36.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:17:36.618 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:17:36.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:17:36.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:17:39.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:17:39.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:17:39.392 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:17:39.393 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:17:39.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:17:39.415 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:17:39.416 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:17:39.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:17:39.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:17:39.417 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:17:39.417 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:17:39.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:17:39.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:17:39.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:17:39.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:17:39.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:17:39.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T22:17:39.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:17:39.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T22:17:39.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:17:39.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:17:39.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:17:39.755 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:17:39.827 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:17:13
2026-06-03T22:17:39.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87191, datetime.datetime(2026, 6, 3, 22, 17, 13), datetime.datetime(2026, 6, 3, 22, 17, 12), 'salt', 2.46, 100.1, None, 53.95, 119.35, -0.01, 822.18, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:17:39.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:17:39.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:17:39.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:17:12, diff=27.834985s, valid=True
2026-06-03T22:17:39.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:17:39.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T22:17:39.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:17:12, diff=27.838322s, valid=True
2026-06-03T22:17:39.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:17:39.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:17:39.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:17:05, diff=34.846687s, valid=True
2026-06-03T22:17:39.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:17:39.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:17:39.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:17:39.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:17:39.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:17:39.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T22:17:39.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:17:12, diff=27.850435s, valid=True
2026-06-03T22:17:39.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:17:39.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:17:39.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:17:39.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92056.851327s, valid=True
2026-06-03T22:17:39.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:17:39.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:17:39.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:17:39.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:17:39.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:17:39.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:17:39.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:17:39.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:17:39.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:17:39.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:17:40.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:17:40.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:17:40.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:17:40.255 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:17:40.461 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:17:40.802 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:17:40.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:17:40.904 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:17:40.904 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:17:41.081 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:17:41.082 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:18:11.096 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:18:11.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:18:11.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:18:11.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:18:11.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:18:11.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:18:11.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:18:11.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:18:11.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:18:11.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:18:11.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:18:11.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:18:11.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:18:14.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:18:14.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:18:14.235 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:18:14.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:18:14.246 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:18:14.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:18:14.259 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:18:14.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:18:14.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:18:14.261 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:18:14.261 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:18:14.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:18:14.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-03T22:18:14.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:18:14.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-03T22:18:14.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:18:14.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:18:14.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:18:14.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:18:14.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:18:14.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:18:14.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:18:14.602 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:18:14.674 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:18:13
2026-06-03T22:18:14.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87193, datetime.datetime(2026, 6, 3, 22, 18, 13), datetime.datetime(2026, 6, 3, 22, 18, 13), 'salt', 2.46, 100.13, None, 49.11, 131.37, -0.02, 821.93, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:18:14.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:18:14.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-03T22:18:14.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:18:13, diff=1.681578s, valid=True
2026-06-03T22:18:14.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:18:14.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:18:14.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:18:12, diff=2.685074s, valid=True
2026-06-03T22:18:14.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:18:14.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-03T22:18:14.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:18:08, diff=6.693173s, valid=True
2026-06-03T22:18:14.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:18:14.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:18:14.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:18:14.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:18:14.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:18:14.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:18:14.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:18:12, diff=2.696909s, valid=True
2026-06-03T22:18:14.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:18:14.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:18:14.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:18:14.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92091.697721s, valid=True
2026-06-03T22:18:14.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:18:14.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:18:14.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:18:14.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:18:14.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:18:14.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:18:14.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:18:14.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:18:14.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:18:14.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:18:14.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:18:14.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:18:14.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:18:15.020 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:18:15.228 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:18:15.576 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:18:15.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:18:15.678 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:18:15.678 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:18:15.863 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:18:15.863 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:18:45.875 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:18:45.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:18:45.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:18:46.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:18:46.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:18:46.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:18:46.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:18:46.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:18:46.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:18:46.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:18:46.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:18:46.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:18:46.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:18:48.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:18:49.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:18:49.002 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:18:49.002 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:18:49.012 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:18:49.025 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:18:49.026 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:18:49.026 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:18:49.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:18:49.027 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:18:49.027 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:18:49.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:18:49.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:18:49.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:18:49.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:18:49.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:18:49.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:18:49.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:18:49.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:18:49.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:18:49.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:18:49.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:18:49.390 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:18:49.462 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:18:44
2026-06-03T22:18:49.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87194, datetime.datetime(2026, 6, 3, 22, 18, 44), datetime.datetime(2026, 6, 3, 22, 18, 43), 'salt', 2.42, 100.13, None, 51.34, 125.92, -0.02, 822.24, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:18:49.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:18:49.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:18:49.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:18:43, diff=6.469862s, valid=True
2026-06-03T22:18:49.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:18:49.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:18:49.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:19:12, diff=-22.526572s, valid=True
2026-06-03T22:18:49.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:18:49.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:18:49.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:18:40, diff=9.481593s, valid=True
2026-06-03T22:18:49.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:18:49.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:18:49.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:18:49.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:18:49.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:18:49.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:18:49.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:19:12, diff=-22.51469s, valid=True
2026-06-03T22:18:49.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:18:49.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:18:49.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:18:49.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92126.486119s, valid=True
2026-06-03T22:18:49.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:18:49.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:18:49.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:18:49.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:18:49.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:18:49.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:18:49.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:18:49.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:18:49.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:18:49.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:18:49.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:18:49.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:18:49.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:18:49.885 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:18:50.107 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:18:50.455 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:18:50.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:18:50.557 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:18:50.557 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:18:50.741 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:18:50.741 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:19:20.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:19:20.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:19:20.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:19:20.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:19:20.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:19:21.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:19:21.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:19:21.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:19:21.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:19:21.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:19:21.268 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:19:21.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:19:21.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:19:23.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:19:23.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:19:23.945 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:19:23.946 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:19:23.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:19:23.969 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:19:23.969 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:19:23.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:19:23.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:19:23.970 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:19:23.971 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:19:23.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:19:24.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:19:24.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:19:24.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:19:24.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:19:24.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:19:24.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:19:24.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:19:24.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:19:24.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:19:24.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:19:24.322 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:19:24.403 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:19:14
2026-06-03T22:19:24.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87195, datetime.datetime(2026, 6, 3, 22, 19, 14), datetime.datetime(2026, 6, 3, 22, 19, 13), 'salt', 2.46, 100.16, None, 49.64, 127.38, -0.02, 822.05, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:19:24.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:19:24.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:19:24.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:19:13, diff=11.410833s, valid=True
2026-06-03T22:19:24.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:19:24.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:19:24.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:19:12, diff=12.414483s, valid=True
2026-06-03T22:19:24.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:19:24.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:19:24.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:19:11, diff=13.422802s, valid=True
2026-06-03T22:19:24.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:19:24.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:19:24.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:19:24.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:19:24.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:19:24.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:19:24.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:19:12, diff=12.426404s, valid=True
2026-06-03T22:19:24.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:19:24.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:19:24.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:19:24.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92161.42716s, valid=True
2026-06-03T22:19:24.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:19:24.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:19:24.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:19:24.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:19:24.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:19:24.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:19:24.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:19:24.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:19:24.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:19:24.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:19:24.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:19:24.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:19:24.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:19:24.745 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:19:24.951 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:19:25.294 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:19:25.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:19:25.396 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:19:25.396 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:19:25.653 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:19:25.654 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:19:55.684 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:19:55.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:19:55.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:19:55.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:19:55.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:19:56.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:19:56.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:19:56.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:19:56.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:19:56.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:19:56.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:19:56.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:19:56.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:19:58.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:19:58.838 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:19:58.838 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:19:58.838 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:19:58.849 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:19:58.862 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:19:58.862 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:19:58.863 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:19:58.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:19:58.863 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:19:58.864 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:19:58.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:19:58.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:19:58.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:19:59.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:19:59.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:19:59.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:19:59.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:19:59.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:19:59.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:19:59.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:19:59.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:19:59.166 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:19:59.238 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:19:44
2026-06-03T22:19:59.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87196, datetime.datetime(2026, 6, 3, 22, 19, 44), datetime.datetime(2026, 6, 3, 22, 19, 43), 'salt', 2.42, 100.1, None, 49.78, 123.88, -0.02, 822.12, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:19:59.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:19:59.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:19:59.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:19:43, diff=16.245408s, valid=True
2026-06-03T22:19:59.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:19:59.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:19:59.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:20:12, diff=-12.751396s, valid=True
2026-06-03T22:19:59.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:19:59.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:19:59.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:19:42, diff=17.256126s, valid=True
2026-06-03T22:19:59.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:19:59.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:19:59.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:19:59.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:19:59.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:19:59.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:19:59.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:20:12, diff=-12.740451s, valid=True
2026-06-03T22:19:59.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:19:59.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:19:59.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:19:59.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92196.26031s, valid=True
2026-06-03T22:19:59.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:19:59.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:19:59.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:19:59.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:19:59.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:19:59.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:19:59.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:19:59.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:19:59.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:19:59.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:19:59.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:19:59.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:19:59.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:19:59.645 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:19:59.856 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:20:00.219 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:20:00.322 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:20:00.322 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:20:00.323 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:20:00.503 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:20:00.503 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:20:30.525 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:20:30.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:20:30.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:20:30.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:20:30.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:20:30.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:20:30.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:20:30.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:20:30.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:20:30.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:20:30.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:20:30.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:20:30.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:20:33.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:20:33.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:20:33.622 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:20:33.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:20:33.632 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:20:33.644 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:20:33.645 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:20:33.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:20:33.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:20:33.646 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:20:33.646 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:20:33.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:20:33.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:20:33.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:20:33.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:20:33.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:20:33.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:20:33.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:20:33.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:20:33.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:20:33.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:20:33.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:20:33.985 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:20:34.057 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:20:14
2026-06-03T22:20:34.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87197, datetime.datetime(2026, 6, 3, 22, 20, 14), datetime.datetime(2026, 6, 3, 22, 20, 14), 'salt', 2.32, 100.1, None, 48.73, 120.88, -0.02, 822.0, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:20:34.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:20:34.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:20:34.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:20:14, diff=20.064816s, valid=True
2026-06-03T22:20:34.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:20:34.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:20:34.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:20:12, diff=22.068302s, valid=True
2026-06-03T22:20:34.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:20:34.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:20:34.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:20:05, diff=29.076287s, valid=True
2026-06-03T22:20:34.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:20:34.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:20:34.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:20:34.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:20:34.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:20:34.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:20:34.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:20:12, diff=22.079994s, valid=True
2026-06-03T22:20:34.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:20:34.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:20:34.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:20:34.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92231.080814s, valid=True
2026-06-03T22:20:34.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:20:34.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:20:34.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:20:34.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:20:34.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:20:34.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:20:34.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:20:34.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:20:34.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:20:34.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:20:34.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:20:34.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:20:34.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:20:34.403 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:20:34.615 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:20:34.959 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:20:35.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:20:35.062 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:20:35.062 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:20:35.147 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:20:35.147 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:21:05.155 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:21:05.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:21:05.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:21:05.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:21:05.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:21:05.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:21:05.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:21:05.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:21:05.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:21:05.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:21:05.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:21:05.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:21:05.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:21:08.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:21:08.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:21:08.422 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:21:08.422 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:21:08.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:21:08.451 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:21:08.451 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:21:08.452 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:21:08.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:21:08.452 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:21:08.453 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:21:08.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:21:08.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:21:08.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:21:08.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:21:08.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:21:08.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:21:08.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:21:08.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:21:08.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:21:08.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:21:08.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:21:08.781 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:21:08.850 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:20:45
2026-06-03T22:21:08.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87198, datetime.datetime(2026, 6, 3, 22, 20, 45), datetime.datetime(2026, 6, 3, 22, 20, 44), 'salt', 2.46, 100.2, None, 46.89, 108.22, -0.03, 822.06, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:21:08.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:21:08.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:21:08.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:20:44, diff=24.857747s, valid=True
2026-06-03T22:21:08.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:21:08.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:21:08.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:21:12, diff=-3.138774s, valid=True
2026-06-03T22:21:08.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:21:08.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:21:08.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:20:44, diff=24.869346s, valid=True
2026-06-03T22:21:08.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:21:08.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:21:08.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:21:08.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:21:08.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:21:08.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:21:08.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:21:12, diff=-3.126936s, valid=True
2026-06-03T22:21:08.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:21:08.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:21:08.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:21:08.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92265.87387s, valid=True
2026-06-03T22:21:08.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:21:08.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:21:08.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:21:08.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:21:08.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:21:08.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:21:08.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:21:08.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:21:08.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:21:09.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:21:09.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:21:09.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:21:09.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:21:09.193 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:21:09.399 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:21:09.742 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:21:09.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:21:09.846 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:21:09.846 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:21:10.099 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:21:10.099 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:21:40.129 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:21:40.129 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:21:40.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:21:40.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:21:40.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:21:40.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:21:40.726 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:21:40.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:21:40.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:21:40.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:21:40.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:21:40.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:21:40.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:21:43.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:21:43.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:21:43.409 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:21:43.409 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:21:43.421 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:21:43.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:21:43.434 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:21:43.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:21:43.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:21:43.435 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:21:43.435 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:21:43.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:21:43.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:21:43.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:21:43.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:21:43.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:21:43.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:21:43.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:21:43.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:21:43.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:21:43.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:21:43.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:21:43.779 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:21:43.851 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:21:15
2026-06-03T22:21:43.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87199, datetime.datetime(2026, 6, 3, 22, 21, 15), datetime.datetime(2026, 6, 3, 22, 21, 14), 'salt', 2.39, 100.1, None, 52.61, 119.58, -0.02, 822.12, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T22:21:43.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:21:43.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:21:43.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:21:14, diff=29.858887s, valid=True
2026-06-03T22:21:43.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:21:43.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:21:43.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:21:12, diff=31.86239s, valid=True
2026-06-03T22:21:43.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:21:43.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:21:43.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:21:05, diff=38.870585s, valid=True
2026-06-03T22:21:43.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:21:43.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:21:43.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:21:43.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:21:43.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:21:43.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:21:43.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:21:12, diff=31.874331s, valid=True
2026-06-03T22:21:43.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:21:43.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:21:43.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:21:43.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92300.875188s, valid=True
2026-06-03T22:21:43.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:21:43.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:21:43.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:21:43.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:21:43.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:21:43.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:21:43.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:21:43.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:21:43.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:21:44.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:21:44.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:21:44.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:21:44.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:21:44.198 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:21:44.403 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:21:44.801 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:21:44.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:21:44.903 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:21:44.903 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:21:45.059 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:21:45.059 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:22:15.090 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:22:15.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:22:15.090 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:22:15.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:22:15.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:22:15.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:22:15.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:22:15.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:22:15.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:22:15.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:22:15.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:22:15.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:22:15.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:22:18.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:22:18.381 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:22:18.383 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:22:18.383 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:22:18.394 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:22:18.407 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:22:18.408 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:22:18.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:22:18.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:22:18.409 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:22:18.409 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:22:18.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:22:18.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:22:18.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:22:18.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:22:18.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:22:18.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:22:18.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:22:18.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:22:18.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:22:18.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:22:18.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:22:18.739 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:22:18.808 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:22:15
2026-06-03T22:22:18.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87201, datetime.datetime(2026, 6, 3, 22, 22, 15), datetime.datetime(2026, 6, 3, 22, 22, 15), 'salt', 2.46, 100.2, None, 42.55, 122.1, -0.03, 822.18, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T22:22:18.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:22:18.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:22:18.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:22:15, diff=3.815885s, valid=True
2026-06-03T22:22:18.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:22:18.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:22:18.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:22:12, diff=6.81938s, valid=True
2026-06-03T22:22:18.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:22:18.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:22:18.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:22:06, diff=12.827408s, valid=True
2026-06-03T22:22:18.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:22:18.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:22:18.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:22:18.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:22:18.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:22:18.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:22:18.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:22:12, diff=6.831117s, valid=True
2026-06-03T22:22:18.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:22:18.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:22:18.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:22:18.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92335.83193s, valid=True
2026-06-03T22:22:18.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:22:18.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:22:18.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:22:18.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:22:18.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:22:18.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:22:18.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:22:18.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:22:18.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:22:18.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:22:19.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:22:19.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:22:19.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:22:19.150 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:22:19.355 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:22:19.697 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:22:19.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:22:19.799 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:22:19.799 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:22:20.006 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:22:20.006 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:22:50.035 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:22:50.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:22:50.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:22:50.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:22:50.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:22:50.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:22:50.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:22:50.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:22:50.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:22:50.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:22:50.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:22:50.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:22:50.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:22:53.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:22:53.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:22:53.638 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:22:53.638 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:22:53.648 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:22:53.663 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:22:53.663 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:22:53.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:22:53.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:22:53.665 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:22:53.665 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:22:53.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:22:53.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:22:53.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:22:53.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:22:53.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:22:53.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:22:53.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:22:54.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:22:54.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:22:54.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:22:54.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:22:54.008 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:22:54.079 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:22:46
2026-06-03T22:22:54.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87202, datetime.datetime(2026, 6, 3, 22, 22, 46), datetime.datetime(2026, 6, 3, 22, 22, 45), 'salt', 2.39, 100.1, None, 41.35, 115.24, -0.02, 822.3, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T22:22:54.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:22:54.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:22:54.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:22:45, diff=9.086949s, valid=True
2026-06-03T22:22:54.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:22:54.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:22:54.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:23:12, diff=-17.909544s, valid=True
2026-06-03T22:22:54.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:22:54.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:22:54.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:22:46, diff=8.098608s, valid=True
2026-06-03T22:22:54.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:22:54.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:22:54.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:22:54.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:22:54.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:22:54.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:22:54.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:23:12, diff=-17.897674s, valid=True
2026-06-03T22:22:54.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:22:54.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:22:54.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:22:54.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92371.103142s, valid=True
2026-06-03T22:22:54.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:22:54.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:22:54.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:22:54.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:22:54.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:22:54.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:22:54.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:22:54.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:22:54.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:22:54.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:22:54.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:22:54.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:22:54.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:22:54.425 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:22:54.713 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:22:55.060 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:22:55.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:22:55.164 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:22:55.164 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:22:55.385 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:22:55.385 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:23:25.406 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:23:25.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:23:25.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:23:25.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:23:25.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:23:25.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:23:25.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:23:25.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:23:25.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:23:25.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:23:25.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:23:25.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:23:25.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:23:28.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:23:28.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:23:28.523 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:23:28.523 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:23:28.534 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:23:28.546 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:23:28.547 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:23:28.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:23:28.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:23:28.548 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:23:28.548 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:23:28.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:23:28.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:23:28.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:23:28.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:23:28.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:23:28.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:23:28.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:23:28.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:23:28.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:23:28.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:23:28.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:23:28.888 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:23:28.960 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:23:16
2026-06-03T22:23:28.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87203, datetime.datetime(2026, 6, 3, 22, 23, 16), datetime.datetime(2026, 6, 3, 22, 23, 16), 'salt', 2.49, 100.17, None, 36.06, 128.81, -0.03, 822.06, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T22:23:28.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:23:28.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:23:28.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:23:16, diff=12.967548s, valid=True
2026-06-03T22:23:28.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:23:28.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:23:28.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:23:12, diff=16.970559s, valid=True
2026-06-03T22:23:28.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:23:28.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:23:28.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:23:16, diff=12.977344s, valid=True
2026-06-03T22:23:28.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:23:28.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:23:28.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:23:28.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:23:28.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:23:28.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:23:28.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:23:12, diff=16.980981s, valid=True
2026-06-03T22:23:28.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:23:28.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:23:28.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:23:28.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92405.981798s, valid=True
2026-06-03T22:23:28.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:23:28.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:23:28.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:23:28.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:23:28.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:23:29.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:23:29.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:23:29.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:23:29.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:23:29.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:23:29.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:23:29.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:23:29.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:23:29.300 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:23:29.506 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:23:29.852 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:23:29.960 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:23:29.960 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:23:29.960 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:23:30.115 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:23:30.115 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:24:00.145 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:24:00.145 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:24:00.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:24:00.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:24:00.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:24:00.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:24:00.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:24:00.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:24:00.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:24:00.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:24:00.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:24:00.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:24:00.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:24:03.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:24:03.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:24:03.389 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:24:03.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:24:03.400 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:24:03.413 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:24:03.413 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:24:03.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:24:03.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:24:03.415 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:24:03.415 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:24:03.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:24:03.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:24:03.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:24:03.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:24:03.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:24:03.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:24:03.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:24:03.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:24:03.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:24:03.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:24:03.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:24:03.736 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:24:03.857 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:23:47
2026-06-03T22:24:03.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87204, datetime.datetime(2026, 6, 3, 22, 23, 47), datetime.datetime(2026, 6, 3, 22, 23, 46), 'salt', 2.49, 100.17, None, 51.69, 129.64, -0.03, 821.94, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T22:24:03.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:24:03.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:24:03.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:23:46, diff=17.864751s, valid=True
2026-06-03T22:24:03.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:24:03.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:24:03.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:24:12, diff=-8.131888s, valid=True
2026-06-03T22:24:03.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:24:03.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:24:03.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:23:46, diff=17.876125s, valid=True
2026-06-03T22:24:03.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:24:03.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:24:03.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:24:03.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:24:03.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:24:03.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:24:03.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:24:12, diff=-8.120259s, valid=True
2026-06-03T22:24:03.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:24:03.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:24:03.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:24:03.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92440.880527s, valid=True
2026-06-03T22:24:03.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:24:03.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:24:03.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:24:03.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:24:03.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:24:03.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:24:03.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:24:03.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:24:03.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:24:04.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:24:04.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:24:04.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:24:04.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:24:04.272 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:24:04.476 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:24:04.818 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:24:04.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:24:04.920 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:24:04.920 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:24:05.120 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:24:05.120 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:24:35.140 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:24:35.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:24:35.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:24:35.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:24:35.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:24:35.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:24:35.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:24:35.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:24:35.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:24:35.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:24:35.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:24:35.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:24:35.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:24:38.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:24:38.596 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:24:38.597 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:24:38.597 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:24:38.608 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:24:38.621 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:24:38.622 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:24:38.622 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:24:38.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:24:38.623 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:24:38.623 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:24:38.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:24:38.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:24:38.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:24:38.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:24:38.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:24:38.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:24:38.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:24:38.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:24:38.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:24:38.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:24:38.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:24:38.974 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:24:39.045 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:24:17
2026-06-03T22:24:39.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87205, datetime.datetime(2026, 6, 3, 22, 24, 17), datetime.datetime(2026, 6, 3, 22, 24, 17), 'salt', 2.39, 100.1, None, 41.78, 126.0, -0.02, 822.06, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T22:24:39.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:24:39.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:24:39.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:24:17, diff=22.052403s, valid=True
2026-06-03T22:24:39.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:24:39.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:24:39.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:24:12, diff=27.055937s, valid=True
2026-06-03T22:24:39.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:24:39.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:24:39.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:24:17, diff=22.063974s, valid=True
2026-06-03T22:24:39.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:24:39.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:24:39.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:24:39.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:24:39.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:24:39.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:24:39.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:24:12, diff=27.067706s, valid=True
2026-06-03T22:24:39.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:24:39.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:24:39.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:24:39.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92476.068511s, valid=True
2026-06-03T22:24:39.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:24:39.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:24:39.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:24:39.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:24:39.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:24:39.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:24:39.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:24:39.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:24:39.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:24:39.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:24:39.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:24:39.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:24:39.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:24:39.387 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:24:39.592 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:24:39.945 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:24:40.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:24:40.054 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:24:40.054 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:24:40.235 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:24:40.235 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:25:10.247 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:25:10.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:25:10.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:25:10.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:25:10.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:25:10.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:25:10.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:25:10.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:25:10.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:25:10.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:25:10.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:25:10.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:25:10.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:25:13.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:25:13.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:25:13.551 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:25:13.551 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:25:13.563 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:25:13.576 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:25:13.576 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:25:13.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:25:13.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:25:13.577 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:25:13.578 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:25:13.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:25:13.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:25:13.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:25:13.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:25:13.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:25:13.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:25:13.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:25:13.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:25:13.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:25:13.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:25:13.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:25:13.913 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:25:13.994 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:24:48
2026-06-03T22:25:13.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87206, datetime.datetime(2026, 6, 3, 22, 24, 48), datetime.datetime(2026, 6, 3, 22, 24, 47), 'salt', 2.39, 100.07, None, 52.39, 123.04, -0.01, 822.12, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T22:25:13.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:25:13.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:25:14.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:24:47, diff=27.001844s, valid=True
2026-06-03T22:25:14.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:25:14.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:25:14.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:25:12, diff=2.005315s, valid=True
2026-06-03T22:25:14.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:25:14.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:25:14.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:24:47, diff=27.013493s, valid=True
2026-06-03T22:25:14.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:25:14.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:25:14.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:25:14.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:25:14.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:25:14.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:25:14.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:25:12, diff=2.017265s, valid=True
2026-06-03T22:25:14.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:25:14.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:25:14.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:25:14.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92511.018094s, valid=True
2026-06-03T22:25:14.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:25:14.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:25:14.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:25:14.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:25:14.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:25:14.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:25:14.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:25:14.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:25:14.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:25:14.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:25:14.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:25:14.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:25:14.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:25:14.411 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:25:14.643 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:25:14.989 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:25:15.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:25:15.092 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:25:15.092 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:25:15.276 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:25:15.277 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:25:45.307 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:25:45.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:25:45.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:25:45.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:25:45.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:25:45.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:25:45.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:25:45.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:25:45.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:25:45.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:25:45.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:25:45.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:25:45.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:25:48.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:25:48.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:25:48.567 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:25:48.567 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:25:48.576 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:25:48.588 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:25:48.588 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:25:48.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:25:48.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:25:48.588 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:25:48.588 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:25:48.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:25:48.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-03T22:25:48.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:25:48.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-03T22:25:48.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:25:48.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:25:48.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:25:48.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:25:48.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:25:48.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:25:48.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:25:48.851 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:25:48.919 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:25:48
2026-06-03T22:25:48.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87208, datetime.datetime(2026, 6, 3, 22, 25, 48), datetime.datetime(2026, 6, 3, 22, 25, 47), 'salt', 2.39, 100.07, None, 43.43, 117.61, -0.01, 822.24, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T22:25:48.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:25:48.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-03T22:25:48.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:25:47, diff=1.926324s, valid=True
2026-06-03T22:25:48.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:25:48.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:25:48.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:26:12, diff=-23.070576s, valid=True
2026-06-03T22:25:48.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:25:48.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-03T22:25:48.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:25:48, diff=0.936865s, valid=True
2026-06-03T22:25:48.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:25:48.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:25:48.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:25:48.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:25:48.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:25:48.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:25:48.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:26:12, diff=-23.059742s, valid=True
2026-06-03T22:25:48.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:25:48.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:25:48.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:25:48.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92545.941s, valid=True
2026-06-03T22:25:48.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:25:48.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:25:48.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:25:48.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:25:48.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:25:49.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:25:49.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:25:49.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:25:49.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:25:49.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:25:49.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:25:49.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:25:49.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:25:49.259 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:25:49.467 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:25:49.811 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:25:49.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:25:49.924 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:25:49.924 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:25:50.004 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:25:50.005 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:26:20.034 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:26:20.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:26:20.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:26:20.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:26:20.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:26:20.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:26:20.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:26:20.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:26:20.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:26:20.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:26:20.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:26:20.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:26:20.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:26:23.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:26:23.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:26:23.233 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:26:23.233 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:26:23.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:26:23.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:26:23.256 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:26:23.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:26:23.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:26:23.257 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:26:23.257 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:26:23.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:26:23.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:26:23.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:26:23.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:26:23.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:26:23.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:26:23.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:26:23.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:26:23.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:26:23.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:26:23.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:26:23.526 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:26:23.595 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:26:18
2026-06-03T22:26:23.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87209, datetime.datetime(2026, 6, 3, 22, 26, 18), datetime.datetime(2026, 6, 3, 22, 26, 18), 'salt', 2.52, 100.2, None, 47.63, 118.81, -0.03, 821.94, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:26:23.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:26:23.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:26:23.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:26:18, diff=5.602183s, valid=True
2026-06-03T22:26:23.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:26:23.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:26:23.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:26:12, diff=11.605365s, valid=True
2026-06-03T22:26:23.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:26:23.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:26:23.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:26:18, diff=5.61266s, valid=True
2026-06-03T22:26:23.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:26:23.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:26:23.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:26:23.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:26:23.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:26:23.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:26:23.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:26:12, diff=11.616027s, valid=True
2026-06-03T22:26:23.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:26:23.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:26:23.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:26:23.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92580.616758s, valid=True
2026-06-03T22:26:23.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:26:23.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:26:23.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:26:23.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:26:23.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:26:23.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:26:23.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:26:23.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:26:23.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:26:23.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:26:23.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:26:23.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:26:23.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:26:24.003 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:26:24.210 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:26:24.558 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:26:24.661 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:26:24.662 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:26:24.662 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:26:24.913 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:26:24.913 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:26:54.943 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:26:54.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:26:54.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:26:55.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:26:55.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:26:55.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:26:55.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:26:55.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:26:55.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:26:55.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:26:55.310 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:26:55.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:26:55.314 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:26:57.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:26:57.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:26:57.899 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:26:57.899 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:26:57.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:26:57.922 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:26:57.922 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:26:57.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:26:57.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:26:57.924 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:26:57.924 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:26:57.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:26:58.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:26:58.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:26:58.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:26:58.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:26:58.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:26:58.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:26:58.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:26:58.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:26:58.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:26:58.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:26:58.254 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:26:58.324 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:26:49
2026-06-03T22:26:58.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87210, datetime.datetime(2026, 6, 3, 22, 26, 49), datetime.datetime(2026, 6, 3, 22, 26, 48), 'salt', 2.39, 100.13, None, 49.15, 119.37, -0.02, 821.94, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:26:58.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:26:58.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:26:58.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:26:48, diff=10.331442s, valid=True
2026-06-03T22:26:58.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:26:58.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:26:58.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:27:12, diff=-13.665185s, valid=True
2026-06-03T22:26:58.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:26:58.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:26:58.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:26:48, diff=10.342841s, valid=True
2026-06-03T22:26:58.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:26:58.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:26:58.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:26:58.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:26:58.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:26:58.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:26:58.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:27:12, diff=-13.653562s, valid=True
2026-06-03T22:26:58.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:26:58.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:26:58.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:26:58.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92615.347248s, valid=True
2026-06-03T22:26:58.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:26:58.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:26:58.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:26:58.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:26:58.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:26:58.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:26:58.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:26:58.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:26:58.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:26:58.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:26:58.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:26:58.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:26:58.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:26:58.666 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:26:58.874 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:26:59.220 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:26:59.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:26:59.324 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:26:59.324 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:26:59.576 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:26:59.576 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:27:29.577 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:27:29.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:27:29.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:27:29.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:27:29.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:27:30.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:27:30.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:27:30.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:27:30.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:27:30.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:27:30.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:27:30.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:27:30.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:27:32.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:27:32.806 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:27:32.807 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:27:32.808 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:27:32.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:27:32.830 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:27:32.831 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:27:32.831 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:27:32.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:27:32.832 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:27:32.832 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:27:32.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:27:32.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:27:32.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:27:33.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:27:33.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:27:33.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:27:33.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:27:33.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:27:33.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:27:33.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:27:33.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:27:33.182 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:27:33.253 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:27:19
2026-06-03T22:27:33.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87211, datetime.datetime(2026, 6, 3, 22, 27, 19), datetime.datetime(2026, 6, 3, 22, 27, 18), 'salt', 2.42, 100.17, None, 57.37, 125.62, -0.03, 822.0, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:27:33.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:27:33.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:27:33.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:27:18, diff=15.26119s, valid=True
2026-06-03T22:27:33.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:27:33.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:27:33.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:27:12, diff=21.264765s, valid=True
2026-06-03T22:27:33.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:27:33.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:27:33.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:27:19, diff=14.272916s, valid=True
2026-06-03T22:27:33.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:27:33.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:27:33.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:27:33.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:27:33.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:27:33.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:27:33.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:27:12, diff=21.276631s, valid=True
2026-06-03T22:27:33.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:27:33.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:27:33.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:27:33.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92650.277421s, valid=True
2026-06-03T22:27:33.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:27:33.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:27:33.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:27:33.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:27:33.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:27:33.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:27:33.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:27:33.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:27:33.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:27:33.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:27:33.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:27:33.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:27:33.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:27:33.598 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:27:33.803 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:27:34.147 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:27:34.251 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:27:34.251 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:27:34.251 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:27:34.486 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:27:34.486 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:28:04.489 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:28:04.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:28:04.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:28:04.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:28:04.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:28:05.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:28:05.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:28:05.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:28:05.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:28:05.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:28:05.052 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:28:05.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:28:05.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:28:07.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:28:07.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:28:07.622 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:28:07.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:28:07.632 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:28:07.645 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:28:07.645 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:28:07.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:28:07.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:28:07.647 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:28:07.647 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:28:07.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:28:07.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:28:07.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:28:07.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:28:07.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:28:07.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:28:07.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:28:07.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:28:07.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:28:07.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:28:07.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:28:07.983 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:28:08.054 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:27:49
2026-06-03T22:28:08.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87212, datetime.datetime(2026, 6, 3, 22, 27, 49), datetime.datetime(2026, 6, 3, 22, 27, 48), 'salt', 2.39, 100.1, None, 52.96, 121.44, -0.02, 821.94, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:28:08.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:28:08.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:28:08.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:27:48, diff=20.061661s, valid=True
2026-06-03T22:28:08.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:28:08.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:28:08.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:28:12, diff=-3.934885s, valid=True
2026-06-03T22:28:08.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:28:08.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:28:08.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:27:49, diff=19.073057s, valid=True
2026-06-03T22:28:08.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:28:08.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:28:08.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:28:08.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:28:08.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:28:08.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:28:08.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:28:12, diff=-3.92343s, valid=True
2026-06-03T22:28:08.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:28:08.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:28:08.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:28:08.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92685.077332s, valid=True
2026-06-03T22:28:08.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:28:08.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:28:08.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:28:08.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:28:08.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:28:08.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:28:08.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:28:08.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:28:08.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:28:08.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:28:08.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:28:08.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:28:08.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:28:08.397 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:28:08.663 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:28:09.003 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:28:09.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:28:09.105 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:28:09.105 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:28:09.193 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:28:09.193 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:28:39.222 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:28:39.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:28:39.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:28:39.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:28:39.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:28:39.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:28:39.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:28:39.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:28:39.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:28:39.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:28:39.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:28:39.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:28:39.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:28:42.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:28:42.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:28:42.715 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:28:42.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:28:42.725 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:28:42.738 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:28:42.739 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:28:42.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:28:42.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:28:42.740 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:28:42.740 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:28:42.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:28:42.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:28:42.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:28:42.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:28:42.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:28:43.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:28:43.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:28:43.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:28:43.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:28:43.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:28:43.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:28:43.082 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:28:43.154 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:28:19
2026-06-03T22:28:43.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87213, datetime.datetime(2026, 6, 3, 22, 28, 19), datetime.datetime(2026, 6, 3, 22, 28, 19), 'salt', 2.29, 100.07, None, 50.0, 124.0, -0.01, 822.06, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:28:43.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:28:43.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:28:43.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:28:19, diff=24.161582s, valid=True
2026-06-03T22:28:43.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:28:43.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:28:43.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:28:12, diff=31.16508s, valid=True
2026-06-03T22:28:43.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:28:43.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:28:43.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:28:19, diff=24.173085s, valid=True
2026-06-03T22:28:43.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:28:43.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:28:43.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:28:43.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:28:43.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:28:43.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:28:43.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:28:12, diff=31.17683s, valid=True
2026-06-03T22:28:43.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:28:43.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:28:43.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:28:43.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92720.177643s, valid=True
2026-06-03T22:28:43.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:28:43.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:28:43.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:28:43.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:28:43.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:28:43.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:28:43.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:28:43.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:28:43.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:28:43.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:28:43.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:28:43.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:28:43.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:28:43.496 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:28:43.701 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:28:44.040 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:28:44.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:28:44.143 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:28:44.143 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:28:44.299 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:28:44.299 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:29:14.318 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:29:14.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:29:14.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:29:14.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:29:14.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:29:14.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:29:14.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:29:14.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:29:14.933 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:29:14.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:29:14.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:29:14.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:29:14.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:29:17.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:29:17.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:29:17.933 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:29:17.933 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:29:17.944 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:29:17.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:29:17.957 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:29:17.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:29:17.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:29:17.958 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:29:17.958 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:29:17.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:29:18.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:29:18.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:29:18.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:29:18.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:29:18.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:29:18.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:29:18.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:29:18.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:29:18.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:29:18.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:29:18.314 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:29:18.398 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:28:50
2026-06-03T22:29:18.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87214, datetime.datetime(2026, 6, 3, 22, 28, 50), datetime.datetime(2026, 6, 3, 22, 28, 49), 'salt', 2.42, 100.13, None, 51.27, 117.96, -0.03, 822.06, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:29:18.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:29:18.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:29:18.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:28:49, diff=29.405477s, valid=True
2026-06-03T22:29:18.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:29:18.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:29:18.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:29:12, diff=6.409047s, valid=True
2026-06-03T22:29:18.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:29:18.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:29:18.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:28:49, diff=29.417251s, valid=True
2026-06-03T22:29:18.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:29:18.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:29:18.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:29:18.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:29:18.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:29:18.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:29:18.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:29:12, diff=6.421017s, valid=True
2026-06-03T22:29:18.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:29:18.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:29:18.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:29:18.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92755.421844s, valid=True
2026-06-03T22:29:18.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:29:18.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:29:18.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:29:18.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:29:18.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:29:18.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:29:18.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:29:18.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:29:18.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:29:18.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:29:18.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:29:18.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:29:18.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:29:18.819 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:29:19.025 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:29:19.368 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:29:19.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:29:19.470 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:29:19.470 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:29:19.655 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:29:19.655 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:29:49.656 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:29:49.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:29:49.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:29:49.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:29:49.940 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:29:50.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:29:50.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:29:50.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:29:50.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:29:50.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:29:50.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:29:50.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:29:50.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:29:53.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:29:53.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:29:53.046 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:29:53.046 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:29:53.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:29:53.068 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:29:53.069 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:29:53.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:29:53.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:29:53.070 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:29:53.070 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:29:53.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:29:53.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:29:53.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:29:53.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:29:53.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:29:53.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:29:53.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:29:53.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:29:53.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:29:53.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:29:53.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:29:53.418 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:29:53.508 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:29:50
2026-06-03T22:29:53.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87216, datetime.datetime(2026, 6, 3, 22, 29, 50), datetime.datetime(2026, 6, 3, 22, 29, 50), 'salt', 2.39, 100.17, None, 49.64, 131.38, -0.03, 822.31, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:29:53.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:29:53.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:29:53.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:29:50, diff=3.515718s, valid=True
2026-06-03T22:29:53.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:29:53.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:29:53.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:30:12, diff=-18.480675s, valid=True
2026-06-03T22:29:53.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:29:53.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:29:53.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:29:50, diff=3.52785s, valid=True
2026-06-03T22:29:53.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:29:53.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:29:53.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:29:53.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:29:53.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:29:53.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:29:53.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:30:12, diff=-18.468261s, valid=True
2026-06-03T22:29:53.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:29:53.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:29:53.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:29:53.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92790.532582s, valid=True
2026-06-03T22:29:53.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:29:53.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:29:53.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:29:53.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:29:53.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:29:53.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:29:53.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:29:53.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:29:53.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:29:53.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:29:53.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:29:53.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:29:53.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:29:53.853 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:29:54.058 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:29:54.399 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:29:54.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:29:54.502 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:29:54.502 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:29:54.756 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:29:54.757 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:30:24.787 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:30:24.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:30:24.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:30:25.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:30:25.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:30:25.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:30:25.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:30:25.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:30:25.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:30:25.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:30:25.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:30:25.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:30:25.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:30:27.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:30:27.973 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:30:27.974 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:30:27.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:30:27.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:30:27.998 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:30:27.999 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:30:27.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:30:27.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:30:28.000 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:30:28.000 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:30:28.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:30:28.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:30:28.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:30:28.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:30:28.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:30:28.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:30:28.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:30:28.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:30:28.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:30:28.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:30:28.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:30:28.403 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:30:28.473 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:30:21
2026-06-03T22:30:28.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87217, datetime.datetime(2026, 6, 3, 22, 30, 21), datetime.datetime(2026, 6, 3, 22, 30, 20), 'salt', 2.36, 100.17, None, 52.22, 126.77, -0.02, 821.94, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:30:28.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:30:28.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:30:28.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:30:20, diff=8.480727s, valid=True
2026-06-03T22:30:28.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:30:28.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:30:28.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:30:12, diff=16.484322s, valid=True
2026-06-03T22:30:28.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:30:28.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:30:28.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:30:20, diff=8.4927s, valid=True
2026-06-03T22:30:28.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:30:28.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:30:28.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:30:28.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:30:28.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:30:28.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:30:28.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:30:12, diff=16.49655s, valid=True
2026-06-03T22:30:28.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:30:28.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:30:28.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:30:28.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92825.497392s, valid=True
2026-06-03T22:30:28.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:30:28.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:30:28.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:30:28.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:30:28.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:30:28.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:30:28.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:30:28.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:30:28.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:30:28.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:30:28.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:30:28.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:30:28.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:30:28.911 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:30:29.117 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:30:29.455 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:30:29.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:30:29.555 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:30:29.555 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:30:29.740 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:30:29.740 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:30:59.771 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:30:59.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:30:59.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:31:00.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:31:00.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:31:00.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:31:00.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:31:00.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:31:00.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:31:00.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:31:00.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:31:00.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:31:00.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:31:02.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:31:02.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:31:02.991 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:31:02.992 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:31:03.002 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:31:03.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:31:03.016 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:31:03.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:31:03.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:31:03.017 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:31:03.017 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:31:03.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:31:03.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:31:03.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:31:03.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:31:03.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:31:03.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:31:03.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:31:03.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:31:03.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:31:03.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:31:03.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:31:03.383 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:31:03.453 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:30:51
2026-06-03T22:31:03.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87218, datetime.datetime(2026, 6, 3, 22, 30, 51), datetime.datetime(2026, 6, 3, 22, 30, 50), 'salt', 2.32, 100.17, None, 45.02, 121.11, -0.03, 822.0, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:31:03.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:31:03.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:31:03.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:30:50, diff=13.46138s, valid=True
2026-06-03T22:31:03.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:31:03.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:31:03.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:31:12, diff=-8.535124s, valid=True
2026-06-03T22:31:03.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:31:03.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:31:03.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:30:50, diff=13.47322s, valid=True
2026-06-03T22:31:03.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:31:03.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:31:03.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:31:03.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:31:03.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:31:03.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:31:03.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:31:12, diff=-8.522984s, valid=True
2026-06-03T22:31:03.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:31:03.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:31:03.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:31:03.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92860.477843s, valid=True
2026-06-03T22:31:03.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:31:03.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:31:03.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:31:03.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:31:03.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:31:03.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:31:03.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:31:03.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:31:03.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:31:03.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:31:03.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:31:03.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:31:03.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:31:03.798 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:31:04.005 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:31:04.349 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:31:04.452 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:31:04.452 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:31:04.452 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:31:04.636 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:31:04.636 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:31:34.666 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:31:34.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:31:34.666 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:31:34.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:31:34.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:31:35.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:31:35.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:31:35.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:31:35.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:31:35.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:31:35.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:31:35.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:31:35.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:31:38.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:31:38.343 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:31:38.344 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:31:38.344 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:31:38.357 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:31:38.370 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:31:38.371 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:31:38.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:31:38.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:31:38.372 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:31:38.372 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:31:38.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:31:38.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:31:38.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:31:38.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:31:38.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:31:38.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:31:38.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:31:38.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:31:38.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:31:38.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:31:38.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:31:38.716 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:31:38.786 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:31:22
2026-06-03T22:31:38.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87219, datetime.datetime(2026, 6, 3, 22, 31, 22), datetime.datetime(2026, 6, 3, 22, 31, 21), 'salt', 2.39, 100.13, None, 42.76, 126.33, -0.02, 822.06, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T22:31:38.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:31:38.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:31:38.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:31:21, diff=17.793503s, valid=True
2026-06-03T22:31:38.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:31:38.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:31:38.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:31:12, diff=26.79686s, valid=True
2026-06-03T22:31:38.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:31:38.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:31:38.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:31:21, diff=17.804629s, valid=True
2026-06-03T22:31:38.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:31:38.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:31:38.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:31:38.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:31:38.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:31:38.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:31:38.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:31:12, diff=26.808208s, valid=True
2026-06-03T22:31:38.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:31:38.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:31:38.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:31:38.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92895.808994s, valid=True
2026-06-03T22:31:38.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:31:38.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:31:38.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:31:38.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:31:38.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:31:38.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:31:38.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:31:38.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:31:38.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:31:39.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:31:39.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:31:39.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:31:39.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:31:39.206 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:31:39.417 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:31:39.765 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:31:39.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:31:39.875 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:31:39.875 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:31:40.055 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:31:40.055 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:32:10.085 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:32:10.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:32:10.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:32:10.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:32:10.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:32:10.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:32:10.458 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:32:10.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:32:10.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:32:10.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:32:10.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:32:10.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:32:10.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:32:13.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:32:13.340 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:32:13.341 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:32:13.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:32:13.351 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:32:13.364 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:32:13.365 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:32:13.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:32:13.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:32:13.366 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:32:13.366 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:32:13.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:32:13.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:32:13.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:32:13.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:32:13.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:32:13.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:32:13.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:32:13.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:32:13.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:32:13.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:32:13.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:32:13.717 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:32:13.789 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:31:52
2026-06-03T22:32:13.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87220, datetime.datetime(2026, 6, 3, 22, 31, 52), datetime.datetime(2026, 6, 3, 22, 31, 51), 'salt', 2.42, 100.2, None, 51.62, 128.63, -0.04, 821.88, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:32:13.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:32:13.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:32:13.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:31:51, diff=22.797072s, valid=True
2026-06-03T22:32:13.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:32:13.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:32:13.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:32:12, diff=1.800826s, valid=True
2026-06-03T22:32:13.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:32:13.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:32:13.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:31:51, diff=22.809009s, valid=True
2026-06-03T22:32:13.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:32:13.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:32:13.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:32:13.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:32:13.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:32:13.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:32:13.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:32:12, diff=1.812767s, valid=True
2026-06-03T22:32:13.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:32:13.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:32:13.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:32:13.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92930.813644s, valid=True
2026-06-03T22:32:13.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:32:13.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:32:13.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:32:13.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:32:13.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:32:13.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:32:13.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:32:13.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:32:13.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:32:13.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:32:14.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:32:14.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:32:14.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:32:14.145 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:32:14.355 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:32:15.081 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:32:15.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:32:15.184 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:32:15.184 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:32:16.032 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:32:16.032 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:32:46.049 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:32:46.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:32:46.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:32:46.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:32:46.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:32:46.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:32:46.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:32:46.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:32:46.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:32:46.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:32:46.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:32:46.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:32:46.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:32:49.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:32:49.584 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:32:49.585 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:32:49.586 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:32:49.595 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:32:49.607 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:32:49.607 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:32:49.608 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:32:49.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:32:49.608 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:32:49.608 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:32:49.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:32:49.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:32:49.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:32:49.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:32:49.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:32:49.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:32:49.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:32:49.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:32:49.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:32:49.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:32:49.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:32:49.940 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:32:50.011 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:32:22
2026-06-03T22:32:50.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87221, datetime.datetime(2026, 6, 3, 22, 32, 22), datetime.datetime(2026, 6, 3, 22, 32, 21), 'salt', 2.42, 100.2, None, 54.93, 120.95, -0.04, 821.94, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:32:50.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:32:50.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:32:50.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:32:21, diff=29.018737s, valid=True
2026-06-03T22:32:50.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:32:50.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:32:50.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:32:12, diff=38.022205s, valid=True
2026-06-03T22:32:50.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:32:50.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:32:50.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:32:21, diff=29.030216s, valid=True
2026-06-03T22:32:50.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:32:50.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:32:50.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:32:50.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:32:50.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:32:50.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:32:50.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:32:12, diff=38.033503s, valid=True
2026-06-03T22:32:50.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:32:50.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:32:50.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:32:50.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=92967.03424s, valid=True
2026-06-03T22:32:50.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:32:50.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:32:50.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:32:50.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:32:50.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:32:50.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:32:50.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:32:50.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:32:50.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:32:50.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:32:50.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:32:50.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:32:50.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:32:50.359 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:32:50.567 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:32:50.910 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:32:51.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:32:51.014 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:32:51.014 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:32:51.251 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:32:51.251 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:33:21.281 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:33:21.281 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:33:21.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:33:21.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:33:21.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:33:21.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:33:21.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:33:21.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:33:21.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:33:21.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:33:21.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:33:21.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:33:21.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:33:24.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:33:24.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:33:24.598 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:33:24.598 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:33:24.608 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:33:24.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:33:24.621 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:33:24.622 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:33:24.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:33:24.622 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:33:24.623 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:33:24.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:33:24.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:33:24.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:33:24.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:33:24.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:33:24.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:33:24.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:33:24.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:33:24.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:33:24.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:33:24.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:33:24.964 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:33:25.058 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:33:23
2026-06-03T22:33:25.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87223, datetime.datetime(2026, 6, 3, 22, 33, 23), datetime.datetime(2026, 6, 3, 22, 33, 22), 'salt', 2.32, 100.17, None, 52.25, 114.86, -0.03, 821.88, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:33:25.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:33:25.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:33:25.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:33:22, diff=3.066097s, valid=True
2026-06-03T22:33:25.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:33:25.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:33:25.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:33:12, diff=13.069493s, valid=True
2026-06-03T22:33:25.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:33:25.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:33:25.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:33:22, diff=3.077494s, valid=True
2026-06-03T22:33:25.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:33:25.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:33:25.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:33:25.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:33:25.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:33:25.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:33:25.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:33:12, diff=13.081225s, valid=True
2026-06-03T22:33:25.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:33:25.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:33:25.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:33:25.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93002.082011s, valid=True
2026-06-03T22:33:25.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:33:25.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:33:25.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:33:25.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:33:25.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:33:25.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:33:25.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:33:25.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:33:25.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:33:25.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:33:25.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:33:25.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:33:25.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:33:25.401 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:33:25.667 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:33:26.008 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:33:26.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:33:26.109 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:33:26.109 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:33:26.196 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:33:26.196 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:33:56.218 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:33:56.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:33:56.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:33:56.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:33:56.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:33:57.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:33:57.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:33:57.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:33:57.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:33:57.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:33:57.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:33:57.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:33:57.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:33:59.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:33:59.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:33:59.734 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:33:59.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:33:59.746 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:33:59.759 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:33:59.760 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:33:59.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:33:59.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:33:59.761 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:33:59.761 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:33:59.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:33:59.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:33:59.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:33:59.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:33:59.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:34:00.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:34:00.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:34:00.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:34:00.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:34:00.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:34:00.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:34:00.070 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:34:00.171 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:33:53
2026-06-03T22:34:00.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87224, datetime.datetime(2026, 6, 3, 22, 33, 53), datetime.datetime(2026, 6, 3, 22, 33, 52), 'salt', 2.26, 100.13, None, 57.51, 119.96, -0.02, 821.88, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:34:00.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:34:00.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:34:00.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:33:52, diff=8.177927s, valid=True
2026-06-03T22:34:00.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:34:00.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:34:00.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:34:12, diff=-11.819185s, valid=True
2026-06-03T22:34:00.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:34:00.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:34:00.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:33:52, diff=8.187724s, valid=True
2026-06-03T22:34:00.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:34:00.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:34:00.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:34:00.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:34:00.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:34:00.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:34:00.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:34:12, diff=-11.809223s, valid=True
2026-06-03T22:34:00.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:34:00.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:34:00.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:34:00.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93037.191436s, valid=True
2026-06-03T22:34:00.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:34:00.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:34:00.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:34:00.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:34:00.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:34:00.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:34:00.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:34:00.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:34:00.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:34:00.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:34:00.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:34:00.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:34:00.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:34:00.506 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:34:00.711 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:34:01.052 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:34:01.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:34:01.155 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:34:01.155 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:34:01.383 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:34:01.383 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:34:31.414 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:34:31.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:34:31.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:34:31.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:34:31.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:34:31.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:34:31.993 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:34:32.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:34:32.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:34:32.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:34:32.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:34:32.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:34:32.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:34:34.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:34:34.689 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:34:34.689 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:34:34.690 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:34:34.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:34:34.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:34:34.712 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:34:34.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:34:34.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:34:34.713 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:34:34.714 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:34:34.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:34:34.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:34:34.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:34:34.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:34:34.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:34:35.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:34:35.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:34:35.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:34:35.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:34:35.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:34:35.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:34:35.066 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:34:35.151 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:34:23
2026-06-03T22:34:35.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87225, datetime.datetime(2026, 6, 3, 22, 34, 23), datetime.datetime(2026, 6, 3, 22, 34, 22), 'salt', 2.29, 100.1, None, 52.25, 121.65, -0.02, 821.94, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:34:35.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:34:35.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:34:35.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:34:22, diff=13.158985s, valid=True
2026-06-03T22:34:35.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:34:35.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:34:35.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:34:12, diff=23.162828s, valid=True
2026-06-03T22:34:35.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:34:35.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:34:35.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:34:22, diff=13.171257s, valid=True
2026-06-03T22:34:35.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:34:35.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:34:35.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:34:35.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:34:35.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:34:35.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:34:35.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:34:12, diff=23.175149s, valid=True
2026-06-03T22:34:35.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:34:35.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:34:35.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:34:35.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93072.176014s, valid=True
2026-06-03T22:34:35.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:34:35.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:34:35.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:34:35.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:34:35.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:34:35.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:34:35.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:34:35.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:34:35.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:34:35.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:34:35.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:34:35.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:34:35.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:34:35.591 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:34:35.796 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:34:36.137 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:34:36.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:34:36.239 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:34:36.239 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:34:36.421 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:34:36.421 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:35:06.452 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:35:06.452 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:35:06.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:35:06.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:35:06.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:35:07.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:35:07.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:35:07.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:35:07.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:35:07.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:35:07.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:35:07.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:35:07.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:35:09.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:35:09.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:35:09.811 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:35:09.811 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:35:09.821 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:35:09.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:35:09.834 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:35:09.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:35:09.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:35:09.835 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:35:09.835 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:35:09.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:35:09.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:35:09.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:35:10.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:35:10.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:35:10.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:35:10.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:35:10.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:35:10.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:35:10.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:35:10.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:35:10.139 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:35:10.232 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:34:53
2026-06-03T22:35:10.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87226, datetime.datetime(2026, 6, 3, 22, 34, 53), datetime.datetime(2026, 6, 3, 22, 34, 53), 'salt', 2.29, 100.13, None, 47.81, 123.53, -0.02, 821.94, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:35:10.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:35:10.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:35:10.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:34:53, diff=17.239777s, valid=True
2026-06-03T22:35:10.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:35:10.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:35:10.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:35:12, diff=-1.756719s, valid=True
2026-06-03T22:35:10.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:35:10.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:35:10.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:34:52, diff=18.251307s, valid=True
2026-06-03T22:35:10.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:35:10.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:35:10.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:35:10.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:35:10.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:35:10.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:35:10.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:35:12, diff=-1.745014s, valid=True
2026-06-03T22:35:10.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:35:10.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:35:10.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:35:10.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93107.255835s, valid=True
2026-06-03T22:35:10.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:35:10.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:35:10.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:35:10.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:35:10.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:35:10.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:35:10.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:35:10.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:35:10.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:35:10.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:35:10.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:35:10.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:35:10.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:35:10.611 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:35:10.839 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:35:11.184 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:35:11.287 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:35:11.287 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:35:11.287 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:35:11.472 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:35:11.472 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:35:41.503 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:35:41.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:35:41.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:35:41.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:35:41.849 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:35:42.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:35:42.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:35:42.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:35:42.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:35:42.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:35:42.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:35:42.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:35:42.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:35:44.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:35:44.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:35:44.798 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:35:44.799 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:35:44.809 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:35:44.822 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:35:44.823 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:35:44.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:35:44.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:35:44.824 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:35:44.824 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:35:44.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:35:44.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:35:44.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:35:45.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:35:45.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:35:45.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:35:45.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:35:45.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:35:45.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:35:45.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:35:45.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:35:45.181 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:35:45.256 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:35:24
2026-06-03T22:35:45.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87227, datetime.datetime(2026, 6, 3, 22, 35, 24), datetime.datetime(2026, 6, 3, 22, 35, 23), 'salt', 2.29, 100.13, None, 49.82, 120.92, -0.02, 822.0, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:35:45.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:35:45.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:35:45.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:35:23, diff=22.264039s, valid=True
2026-06-03T22:35:45.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:35:45.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:35:45.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:35:12, diff=33.267859s, valid=True
2026-06-03T22:35:45.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:35:45.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:35:45.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:35:23, diff=22.276659s, valid=True
2026-06-03T22:35:45.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:35:45.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:35:45.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:35:45.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:35:45.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:35:45.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:35:45.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:35:12, diff=33.280631s, valid=True
2026-06-03T22:35:45.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:35:45.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:35:45.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:35:45.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93142.281474s, valid=True
2026-06-03T22:35:45.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:35:45.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:35:45.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:35:45.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:35:45.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:35:45.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:35:45.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:35:45.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:35:45.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:35:45.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:35:45.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:35:45.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:35:45.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:35:45.681 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:35:45.891 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:35:46.235 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:35:46.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:35:46.338 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:35:46.338 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:35:46.514 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:35:46.515 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:36:16.545 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:36:16.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:36:16.545 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:36:16.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:36:16.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:36:17.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:36:17.144 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:36:17.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:36:17.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:36:17.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:36:17.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:36:17.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:36:17.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:36:19.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:36:19.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:36:19.835 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:36:19.836 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:36:19.844 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:36:19.856 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:36:19.856 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:36:19.857 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:36:19.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:36:19.857 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:36:19.857 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:36:19.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:36:19.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:36:19.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:36:20.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:36:20.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:36:20.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:36:20.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:36:20.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:36:20.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:36:20.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:36:20.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:36:20.154 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:36:20.223 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:35:54
2026-06-03T22:36:20.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87228, datetime.datetime(2026, 6, 3, 22, 35, 54), datetime.datetime(2026, 6, 3, 22, 35, 53), 'salt', 2.23, 100.07, None, 48.83, 123.98, -0.01, 822.18, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:36:20.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:36:20.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:36:20.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:35:53, diff=27.230536s, valid=True
2026-06-03T22:36:20.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:36:20.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:36:20.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:36:12, diff=8.23368s, valid=True
2026-06-03T22:36:20.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:36:20.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:36:20.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:35:53, diff=27.240958s, valid=True
2026-06-03T22:36:20.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:36:20.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:36:20.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:36:20.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:36:20.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:36:20.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:36:20.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:36:12, diff=8.244297s, valid=True
2026-06-03T22:36:20.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:36:20.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:36:20.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:36:20.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93177.245012s, valid=True
2026-06-03T22:36:20.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:36:20.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:36:20.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:36:20.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:36:20.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:36:20.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:36:20.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:36:20.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:36:20.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:36:20.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:36:20.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:36:20.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:36:20.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:36:20.563 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:36:20.784 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:36:21.127 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:36:21.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:36:21.229 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:36:21.230 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:36:21.483 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:36:21.483 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:36:51.484 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:36:51.484 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:36:51.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:36:51.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:36:51.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:36:51.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:36:51.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:36:52.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:36:52.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:36:52.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:36:52.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:36:52.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:36:52.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:36:54.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:36:54.696 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:36:54.697 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:36:54.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:36:54.707 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:36:54.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:36:54.720 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:36:54.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:36:54.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:36:54.721 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:36:54.722 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:36:54.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:36:54.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-03T22:36:54.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:36:54.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-03T22:36:54.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:36:54.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T22:36:54.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:36:55.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T22:36:55.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:36:55.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:36:55.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:36:55.014 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:36:55.088 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:36:55
2026-06-03T22:36:55.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87230, datetime.datetime(2026, 6, 3, 22, 36, 55), datetime.datetime(2026, 6, 3, 22, 36, 54), 'salt', 2.36, 100.23, None, 49.36, 121.18, -0.03, 822.0, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:36:55.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:36:55.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-03T22:36:55.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:36:54, diff=1.098138s, valid=True
2026-06-03T22:36:55.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:36:55.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T22:36:55.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:37:12, diff=-16.897513s, valid=True
2026-06-03T22:36:55.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:36:55.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-03T22:36:55.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:36:53, diff=2.113243s, valid=True
2026-06-03T22:36:55.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:36:55.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:36:55.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:36:55.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:36:55.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:36:55.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T22:36:55.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:37:12, diff=-16.881462s, valid=True
2026-06-03T22:36:55.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:36:55.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:36:55.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:36:55.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93212.119712s, valid=True
2026-06-03T22:36:55.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:36:55.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:36:55.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:36:55.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:36:55.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:36:55.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:36:55.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:36:55.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:36:55.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:36:55.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:36:55.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:36:55.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:36:55.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:36:55.536 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:36:55.745 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:36:56.089 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:36:56.191 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:36:56.191 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:36:56.191 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:36:56.337 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:36:56.337 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:37:26.359 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:37:26.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:37:26.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:37:26.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:37:26.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:37:26.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:37:26.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:37:26.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:37:26.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:37:26.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:37:26.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:37:26.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:37:26.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:37:29.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:37:29.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:37:29.705 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:37:29.705 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:37:29.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:37:29.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:37:29.728 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:37:29.729 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:37:29.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:37:29.730 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:37:29.730 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:37:29.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:37:29.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:37:29.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:37:29.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:37:29.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:37:30.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:37:30.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:37:30.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:37:30.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:37:30.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:37:30.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:37:30.050 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:37:30.125 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:37:25
2026-06-03T22:37:30.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87231, datetime.datetime(2026, 6, 3, 22, 37, 25), datetime.datetime(2026, 6, 3, 22, 37, 24), 'salt', 2.29, 100.1, None, 52.36, 123.01, -0.02, 821.94, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:37:30.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:37:30.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:37:30.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:37:24, diff=6.139205s, valid=True
2026-06-03T22:37:30.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:37:30.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:37:30.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:37:12, diff=18.142494s, valid=True
2026-06-03T22:37:30.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:37:30.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:37:30.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:37:24, diff=6.150157s, valid=True
2026-06-03T22:37:30.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:37:30.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:37:30.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:37:30.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:37:30.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:37:30.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:37:30.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:37:12, diff=18.153611s, valid=True
2026-06-03T22:37:30.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:37:30.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:37:30.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:37:30.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93247.15436s, valid=True
2026-06-03T22:37:30.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:37:30.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:37:30.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:37:30.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:37:30.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:37:30.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:37:30.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:37:30.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:37:30.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:37:30.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:37:30.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:37:30.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:37:30.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:37:30.473 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:37:30.669 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:37:31.002 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:37:31.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:37:31.102 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:37:31.102 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:37:31.258 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:37:31.258 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:38:01.273 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:38:01.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:38:01.274 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:38:01.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:38:01.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:38:01.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:38:01.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:38:01.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:38:01.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:38:01.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:38:01.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:38:01.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:38:01.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:38:04.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:38:04.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:38:04.546 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:38:04.546 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:38:04.557 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:38:04.569 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:38:04.570 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:38:04.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:38:04.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:38:04.571 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:38:04.571 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:38:04.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:38:04.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:38:04.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:38:04.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:38:04.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:38:04.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:38:04.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:38:04.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:38:04.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:38:04.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:38:04.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:38:04.899 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:38:04.971 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:37:55
2026-06-03T22:38:04.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87232, datetime.datetime(2026, 6, 3, 22, 37, 55), datetime.datetime(2026, 6, 3, 22, 37, 54), 'salt', 2.29, 100.1, None, 48.27, 116.88, -0.02, 821.94, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:38:04.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:38:04.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:38:04.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:37:54, diff=10.978578s, valid=True
2026-06-03T22:38:04.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:38:04.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:38:04.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:38:12, diff=-7.017909s, valid=True
2026-06-03T22:38:04.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:38:04.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:38:04.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:37:54, diff=10.990225s, valid=True
2026-06-03T22:38:04.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:38:04.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:38:04.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:38:04.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:38:04.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:38:04.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:38:04.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:38:12, diff=-7.006029s, valid=True
2026-06-03T22:38:04.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:38:04.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:38:04.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:38:04.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93281.994778s, valid=True
2026-06-03T22:38:04.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:38:04.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:38:04.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:38:04.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:38:04.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:38:05.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:38:05.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:38:05.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:38:05.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:38:05.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:38:05.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:38:05.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:38:05.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:38:05.313 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:38:05.510 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:38:05.844 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:38:05.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:38:05.944 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:38:05.944 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:38:06.180 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:38:06.180 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:38:36.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:38:36.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:38:36.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:38:36.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:38:36.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:38:36.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:38:36.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:38:36.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:38:36.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:38:36.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:38:36.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:38:36.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:38:36.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:38:39.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:38:39.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:38:39.569 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:38:39.569 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:38:39.579 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:38:39.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:38:39.595 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:38:39.595 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:38:39.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:38:39.596 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:38:39.596 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:38:39.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:38:39.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:38:39.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:38:39.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:38:39.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:38:39.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:38:39.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:38:39.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:38:39.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:38:39.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:38:39.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:38:39.935 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:38:40.007 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:38:25
2026-06-03T22:38:40.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87233, datetime.datetime(2026, 6, 3, 22, 38, 25), datetime.datetime(2026, 6, 3, 22, 38, 25), 'salt', 2.16, 100.07, None, 43.15, 117.87, -0.01, 822.0, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T22:38:40.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:38:40.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:38:40.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:38:25, diff=15.015007s, valid=True
2026-06-03T22:38:40.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:38:40.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:38:40.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:38:12, diff=28.019381s, valid=True
2026-06-03T22:38:40.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:38:40.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:38:40.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:38:24, diff=16.027121s, valid=True
2026-06-03T22:38:40.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:38:40.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:38:40.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:38:40.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:38:40.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:38:40.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:38:40.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:38:12, diff=28.031082s, valid=True
2026-06-03T22:38:40.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:38:40.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:38:40.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:38:40.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93317.031845s, valid=True
2026-06-03T22:38:40.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:38:40.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:38:40.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:38:40.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:38:40.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:38:40.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:38:40.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:38:40.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:38:40.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:38:40.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:38:40.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:38:40.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:38:40.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:38:40.383 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:38:40.582 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:38:40.917 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:38:41.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:38:41.078 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:38:41.079 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:38:41.165 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:38:41.165 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:39:11.174 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:39:11.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:39:11.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:39:11.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:39:11.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:39:11.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:39:11.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:39:11.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:39:11.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:39:11.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:39:11.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:39:11.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:39:11.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:39:14.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:39:14.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:39:14.699 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:39:14.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:39:14.710 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:39:14.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:39:14.723 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:39:14.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:39:14.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:39:14.725 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:39:14.725 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:39:14.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:39:14.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:39:14.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:39:14.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:39:14.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:39:15.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:39:15.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:39:15.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:39:15.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:39:15.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:39:15.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:39:15.059 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:39:15.127 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:38:56
2026-06-03T22:39:15.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87234, datetime.datetime(2026, 6, 3, 22, 38, 56), datetime.datetime(2026, 6, 3, 22, 38, 55), 'salt', 2.33, 100.2, None, 41.25, 131.37, -0.03, 822.0, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T22:39:15.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:39:15.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:39:15.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:38:55, diff=20.133738s, valid=True
2026-06-03T22:39:15.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:39:15.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:39:15.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:39:12, diff=3.136562s, valid=True
2026-06-03T22:39:15.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:39:15.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:39:15.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:38:55, diff=20.14321s, valid=True
2026-06-03T22:39:15.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:39:15.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:39:15.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:39:15.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:39:15.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:39:15.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:39:15.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:39:12, diff=3.146246s, valid=True
2026-06-03T22:39:15.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:39:15.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:39:15.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:39:15.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93352.146918s, valid=True
2026-06-03T22:39:15.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:39:15.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:39:15.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:39:15.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:39:15.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:39:15.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:39:15.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:39:15.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:39:15.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:39:15.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:39:15.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:39:15.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:39:15.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:39:15.465 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:39:15.667 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:39:16.049 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:39:16.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:39:16.150 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:39:16.150 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:39:16.345 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:39:16.345 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:39:46.375 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:39:46.375 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:39:46.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:39:46.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:39:46.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:39:46.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:39:46.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:39:46.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:39:46.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:39:46.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:39:46.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:39:46.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:39:46.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:39:49.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:39:49.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:39:49.620 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:39:49.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:39:49.631 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:39:49.644 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:39:49.644 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:39:49.645 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:39:49.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:39:49.646 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:39:49.646 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:39:49.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:39:49.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:39:49.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:39:49.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:39:49.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:39:49.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:39:49.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:39:49.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:39:49.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:39:49.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:39:49.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:39:49.973 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:39:50.045 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:39:26
2026-06-03T22:39:50.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87235, datetime.datetime(2026, 6, 3, 22, 39, 26), datetime.datetime(2026, 6, 3, 22, 39, 25), 'salt', 2.33, 100.17, None, 58.36, 128.06, -0.02, 822.0, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:39:50.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:39:50.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:39:50.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:39:25, diff=25.051534s, valid=True
2026-06-03T22:39:50.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:39:50.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:39:50.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:39:12, diff=38.054773s, valid=True
2026-06-03T22:39:50.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:39:50.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:39:50.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:39:25, diff=25.062263s, valid=True
2026-06-03T22:39:50.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:39:50.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:39:50.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:39:50.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:39:50.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:39:50.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:39:50.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:39:12, diff=38.06575s, valid=True
2026-06-03T22:39:50.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:39:50.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:39:50.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:39:50.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93387.066473s, valid=True
2026-06-03T22:39:50.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:39:50.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:39:50.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:39:50.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:39:50.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:39:50.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:39:50.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:39:50.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:39:50.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:39:50.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:39:50.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:39:50.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:39:50.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:39:50.385 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:39:50.656 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:39:50.991 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:39:51.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:39:51.092 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:39:51.092 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:39:51.275 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:39:51.276 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:40:21.278 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:40:21.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:40:21.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:40:21.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:40:21.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:40:21.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:40:21.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:40:21.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:40:21.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:40:21.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:40:21.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:40:21.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:40:21.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:40:24.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:40:24.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:40:24.558 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:40:24.558 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:40:24.569 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:40:24.582 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:40:24.582 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:40:24.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:40:24.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:40:24.583 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:40:24.584 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:40:24.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:40:24.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:40:24.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:40:24.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:40:24.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:40:24.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:40:24.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:40:24.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:40:24.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:40:24.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:40:24.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:40:24.895 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:40:24.966 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:39:56
2026-06-03T22:40:24.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87236, datetime.datetime(2026, 6, 3, 22, 39, 56), datetime.datetime(2026, 6, 3, 22, 39, 55), 'salt', 2.29, 100.17, None, 50.17, 128.2, -0.03, 822.37, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:40:24.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:40:24.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:40:24.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:39:55, diff=29.973664s, valid=True
2026-06-03T22:40:24.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:40:24.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:40:24.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:40:12, diff=12.976984s, valid=True
2026-06-03T22:40:24.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:40:24.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:40:24.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:39:55, diff=29.9847s, valid=True
2026-06-03T22:40:24.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:40:24.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:40:24.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:40:24.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:40:24.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:40:24.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:40:24.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:40:12, diff=12.98821s, valid=True
2026-06-03T22:40:24.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:40:24.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:40:24.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:40:24.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93421.988987s, valid=True
2026-06-03T22:40:24.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:40:24.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:40:24.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:40:24.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:40:24.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:40:25.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:40:25.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:40:25.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:40:25.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:40:25.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:40:25.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:40:25.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:40:25.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:40:25.308 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:40:25.505 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:40:25.839 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:40:25.939 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:40:25.939 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:40:25.939 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:40:26.024 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:40:26.024 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:40:56.030 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:40:56.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:40:56.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:40:56.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:40:56.163 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:40:56.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:40:56.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:40:56.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:40:56.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:40:56.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:40:56.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:40:56.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:40:56.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:40:59.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:40:59.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:40:59.397 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:40:59.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:40:59.408 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:40:59.421 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:40:59.421 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:40:59.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:40:59.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:40:59.422 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:40:59.423 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:40:59.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:40:59.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-03T22:40:59.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:40:59.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-03T22:40:59.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:40:59.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T22:40:59.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:40:59.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T22:40:59.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:40:59.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:40:59.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:40:59.751 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:40:59.822 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:40:57
2026-06-03T22:40:59.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87238, datetime.datetime(2026, 6, 3, 22, 40, 57), datetime.datetime(2026, 6, 3, 22, 40, 56), 'salt', 2.23, 100.14, None, 50.91, 122.82, -0.02, 822.19, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:40:59.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:40:59.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-03T22:40:59.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:40:56, diff=3.830205s, valid=True
2026-06-03T22:40:59.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:40:59.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T22:40:59.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:41:12, diff=-12.165877s, valid=True
2026-06-03T22:40:59.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:40:59.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-03T22:40:59.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:40:56, diff=3.842426s, valid=True
2026-06-03T22:40:59.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:40:59.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:40:59.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:40:59.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:40:59.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:40:59.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T22:40:59.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:41:12, diff=-12.153727s, valid=True
2026-06-03T22:40:59.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:40:59.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:40:59.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:40:59.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93456.847008s, valid=True
2026-06-03T22:40:59.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:40:59.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:40:59.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:40:59.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:40:59.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:40:59.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:40:59.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:40:59.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:40:59.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:40:59.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:41:00.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:41:00.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:41:00.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:41:00.248 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:41:00.446 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:41:00.779 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:41:00.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:41:00.879 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:41:00.880 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:41:01.034 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:41:01.034 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:41:31.064 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:41:31.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:41:31.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:41:31.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:41:31.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:41:31.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:41:31.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:41:31.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:41:31.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:41:31.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:41:31.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:41:31.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:41:31.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:41:34.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:41:34.462 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:41:34.463 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:41:34.463 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:41:34.473 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:41:34.485 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:41:34.486 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:41:34.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:41:34.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:41:34.487 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:41:34.487 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:41:34.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:41:34.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:41:34.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:41:34.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:41:34.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:41:34.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:41:34.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:41:34.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:41:34.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:41:34.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:41:34.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:41:34.815 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:41:34.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:41:27
2026-06-03T22:41:34.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87239, datetime.datetime(2026, 6, 3, 22, 41, 27), datetime.datetime(2026, 6, 3, 22, 41, 26), 'salt', 2.33, 100.17, None, 46.08, 119.98, -0.02, 822.07, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:41:34.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:41:34.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:41:34.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:41:26, diff=8.892552s, valid=True
2026-06-03T22:41:34.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:41:34.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:41:34.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:41:12, diff=22.895978s, valid=True
2026-06-03T22:41:34.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:41:34.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:41:34.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:41:26, diff=8.903791s, valid=True
2026-06-03T22:41:34.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:41:34.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:41:34.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:41:34.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:41:34.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:41:34.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:41:34.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:41:12, diff=22.907398s, valid=True
2026-06-03T22:41:34.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:41:34.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:41:34.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:41:34.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93491.908182s, valid=True
2026-06-03T22:41:34.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:41:34.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:41:34.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:41:34.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:41:34.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:41:34.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:41:34.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:41:34.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:41:34.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:41:35.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:41:35.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:41:35.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:41:35.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:41:35.229 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:41:35.444 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:41:35.777 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:41:35.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:41:35.877 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:41:35.877 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:41:36.122 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:41:36.122 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:42:06.152 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:42:06.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:42:06.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:42:06.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:42:06.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:42:06.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:42:06.587 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:42:06.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:42:06.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:42:06.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:42:06.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:42:06.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:42:06.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:42:09.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:42:09.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:42:09.818 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:42:09.818 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:42:09.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:42:09.840 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:42:09.840 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:42:09.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:42:09.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:42:09.841 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:42:09.841 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:42:09.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:42:09.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:42:09.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:42:10.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:42:10.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:42:10.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:42:10.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:42:10.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:42:10.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:42:10.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:42:10.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:42:10.118 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:42:10.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:41:57
2026-06-03T22:42:10.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87240, datetime.datetime(2026, 6, 3, 22, 41, 57), datetime.datetime(2026, 6, 3, 22, 41, 56), 'salt', 2.23, 100.07, None, 44.32, 125.62, -0.01, 822.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T22:42:10.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:42:10.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:42:10.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:41:56, diff=14.193741s, valid=True
2026-06-03T22:42:10.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:42:10.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:42:10.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:42:12, diff=-1.803028s, valid=True
2026-06-03T22:42:10.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:42:10.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:42:10.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:41:57, diff=13.204509s, valid=True
2026-06-03T22:42:10.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:42:10.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:42:10.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:42:10.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:42:10.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:42:10.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:42:10.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:42:12, diff=-1.792069s, valid=True
2026-06-03T22:42:10.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:42:10.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:42:10.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:42:10.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93527.208666s, valid=True
2026-06-03T22:42:10.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:42:10.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:42:10.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:42:10.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:42:10.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:42:10.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:42:10.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:42:10.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:42:10.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:42:10.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:42:10.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:42:10.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:42:10.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:42:10.604 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:42:10.806 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:42:11.145 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:42:11.249 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:42:11.249 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:42:11.249 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:42:11.418 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:42:11.418 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:42:41.448 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:42:41.448 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:42:41.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:42:41.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:42:41.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:42:42.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:42:42.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:42:42.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:42:42.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:42:42.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:42:42.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:42:42.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:42:42.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:42:44.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:42:44.722 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:42:44.723 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:42:44.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:42:44.733 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:42:44.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:42:44.746 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:42:44.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:42:44.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:42:44.747 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:42:44.747 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:42:44.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:42:44.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:42:44.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:42:44.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:42:44.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:42:45.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:42:45.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:42:45.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:42:45.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:42:45.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:42:45.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:42:45.081 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:42:45.151 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:42:27
2026-06-03T22:42:45.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87241, datetime.datetime(2026, 6, 3, 22, 42, 27), datetime.datetime(2026, 6, 3, 22, 42, 27), 'salt', 2.29, 100.17, None, 47.98, 131.52, -0.03, 822.13, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:42:45.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:42:45.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:42:45.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:42:27, diff=18.158308s, valid=True
2026-06-03T22:42:45.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:42:45.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:42:45.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:42:12, diff=33.161769s, valid=True
2026-06-03T22:42:45.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:42:45.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:42:45.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:42:26, diff=19.169824s, valid=True
2026-06-03T22:42:45.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:42:45.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:42:45.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:42:45.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:42:45.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:42:45.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:42:45.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:42:12, diff=33.1735s, valid=True
2026-06-03T22:42:45.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:42:45.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:42:45.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:42:45.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93562.174315s, valid=True
2026-06-03T22:42:45.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:42:45.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:42:45.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:42:45.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:42:45.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:42:45.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:42:45.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:42:45.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:42:45.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:42:45.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:42:45.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:42:45.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:42:45.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:42:45.495 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:42:45.692 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:42:46.026 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:42:46.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:42:46.126 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:42:46.126 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:42:46.283 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:42:46.283 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:43:16.313 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:43:16.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:43:16.314 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:43:16.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:43:17.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:43:17.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:43:17.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:43:17.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:43:17.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:43:17.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:43:17.314 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:43:17.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:43:17.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:43:20.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:43:20.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:43:20.034 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:43:20.034 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:43:20.043 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:43:20.055 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:43:20.055 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:43:20.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:43:20.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:43:20.056 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:43:20.056 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:43:20.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:43:20.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:43:20.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:43:20.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:43:20.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:43:20.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:43:20.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:43:20.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:43:20.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:43:20.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:43:20.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:43:20.436 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:43:20.542 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:42:58
2026-06-03T22:43:20.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87242, datetime.datetime(2026, 6, 3, 22, 42, 58), datetime.datetime(2026, 6, 3, 22, 42, 57), 'salt', 2.29, 100.17, None, 39.38, 125.43, -0.03, 822.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T22:43:20.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:43:20.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:43:20.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:42:57, diff=23.548668s, valid=True
2026-06-03T22:43:20.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:43:20.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:43:20.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:43:12, diff=8.551535s, valid=True
2026-06-03T22:43:20.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:43:20.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:43:20.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:42:57, diff=23.558189s, valid=True
2026-06-03T22:43:20.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:43:20.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:43:20.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:43:20.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:43:20.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:43:20.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:43:20.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:43:12, diff=8.561309s, valid=True
2026-06-03T22:43:20.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:43:20.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:43:20.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:43:20.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93597.561968s, valid=True
2026-06-03T22:43:20.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:43:20.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:43:20.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:43:20.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:43:20.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:43:20.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:43:20.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:43:20.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:43:20.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:43:20.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:43:20.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:43:20.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:43:20.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:43:20.873 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:43:21.070 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:43:21.403 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:43:21.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:43:21.504 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:43:21.504 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:43:21.727 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:43:21.728 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:43:51.754 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:43:51.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:43:51.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:43:51.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:43:51.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:43:52.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:43:52.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:43:52.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:43:52.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:43:52.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:43:52.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:43:52.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:43:52.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:43:54.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:43:54.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:43:54.849 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:43:54.849 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:43:54.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:43:54.872 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:43:54.873 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:43:54.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:43:54.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:43:54.874 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:43:54.874 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:43:54.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:43:55.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:43:55.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:43:55.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:43:55.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:43:55.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:43:55.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:43:55.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:43:55.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:43:55.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:43:55.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:43:55.208 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:43:55.279 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:43:28
2026-06-03T22:43:55.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87243, datetime.datetime(2026, 6, 3, 22, 43, 28), datetime.datetime(2026, 6, 3, 22, 43, 28), 'salt', 2.23, 100.04, None, 49.29, 120.62, 0.0, 822.19, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:43:55.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:43:55.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:43:55.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:43:28, diff=27.287466s, valid=True
2026-06-03T22:43:55.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:43:55.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:43:55.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:43:12, diff=43.290946s, valid=True
2026-06-03T22:43:55.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:43:55.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:43:55.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:43:27, diff=28.299207s, valid=True
2026-06-03T22:43:55.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:43:55.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:43:55.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:43:55.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:43:55.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:43:55.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:43:55.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:43:12, diff=43.30293s, valid=True
2026-06-03T22:43:55.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:43:55.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:43:55.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:43:55.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93632.303748s, valid=True
2026-06-03T22:43:55.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:43:55.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:43:55.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:43:55.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:43:55.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:43:55.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:43:55.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:43:55.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:43:55.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:43:55.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:43:55.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:43:55.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:43:55.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:43:55.622 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:43:55.818 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:43:56.150 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:43:56.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:43:56.250 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:43:56.250 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:43:56.441 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:43:56.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:44:26.444 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:44:26.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:44:26.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:44:26.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:44:26.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:44:27.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:44:27.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:44:27.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:44:27.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:44:27.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:44:27.274 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:44:27.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:44:27.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:44:29.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:44:29.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:44:29.939 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:44:29.939 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:44:29.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:44:29.959 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:44:29.959 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:44:29.959 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:44:29.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:44:29.960 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:44:29.960 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:44:29.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:44:30.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-03T22:44:30.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:44:30.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-03T22:44:30.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:44:30.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:44:30.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:44:30.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:44:30.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:44:30.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:44:30.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:44:30.239 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:44:30.312 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:44:29
2026-06-03T22:44:30.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87245, datetime.datetime(2026, 6, 3, 22, 44, 29), datetime.datetime(2026, 6, 3, 22, 44, 28), 'salt', 2.19, 100.17, None, 55.43, 109.46, -0.03, 821.94, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:44:30.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:44:30.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-03T22:44:30.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:44:28, diff=2.318747s, valid=True
2026-06-03T22:44:30.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:44:30.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:44:30.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:44:12, diff=18.321889s, valid=True
2026-06-03T22:44:30.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:44:30.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-03T22:44:30.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:44:27, diff=3.329308s, valid=True
2026-06-03T22:44:30.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:44:30.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:44:30.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:44:30.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:44:30.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:44:30.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:44:30.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:44:12, diff=18.332649s, valid=True
2026-06-03T22:44:30.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:44:30.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:44:30.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:44:30.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93667.333371s, valid=True
2026-06-03T22:44:30.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:44:30.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:44:30.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:44:30.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:44:30.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:44:30.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:44:30.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:44:30.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:44:30.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:44:30.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:44:30.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:44:30.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:44:30.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:44:30.649 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:44:30.847 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:44:31.184 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:44:31.284 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:44:31.284 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:44:31.284 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:44:32.092 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:44:32.092 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:45:02.122 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:45:02.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:45:02.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:45:02.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:45:02.274 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:45:02.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:45:02.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:45:02.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:45:02.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:45:02.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:45:02.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:45:02.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:45:02.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:45:05.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:45:05.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:45:05.062 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:45:05.062 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:45:05.070 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:45:05.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:45:05.082 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:45:05.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:45:05.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:45:05.082 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:45:05.082 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:45:05.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:45:05.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:45:05.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:45:05.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:45:05.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:45:05.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:45:05.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:45:05.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:45:05.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:45:05.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:45:05.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:45:05.347 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:45:05.418 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:45:00
2026-06-03T22:45:05.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87246, datetime.datetime(2026, 6, 3, 22, 45), datetime.datetime(2026, 6, 3, 22, 44, 58), 'salt', 2.13, 100.1, None, 46.47, 119.82, -0.01, 821.94, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:45:05.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:45:05.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:45:05.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:44:58, diff=7.425239s, valid=True
2026-06-03T22:45:05.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:45:05.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:45:05.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:45:12, diff=-6.571532s, valid=True
2026-06-03T22:45:05.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:45:05.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:45:05.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:44:57, diff=8.436088s, valid=True
2026-06-03T22:45:05.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:45:05.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:45:05.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:45:05.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:45:05.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:45:05.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:45:05.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:45:12, diff=-6.560477s, valid=True
2026-06-03T22:45:05.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:45:05.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:45:05.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:45:05.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93702.440269s, valid=True
2026-06-03T22:45:05.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:45:05.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:45:05.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:45:05.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:45:05.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:45:05.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:45:05.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:45:05.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:45:05.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:45:05.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:45:05.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:45:05.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:45:05.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:45:05.758 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:45:05.954 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:45:06.285 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:45:06.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:45:06.441 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:45:06.441 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:45:06.693 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:45:06.693 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:45:36.723 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:45:36.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:45:36.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:45:37.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:45:37.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:45:37.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:45:37.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:45:37.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:45:37.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:45:37.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:45:37.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:45:37.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:45:37.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:45:40.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:45:40.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:45:40.073 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:45:40.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:45:40.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:45:40.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:45:40.094 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:45:40.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:45:40.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:45:40.094 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:45:40.095 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:45:40.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:45:40.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:45:40.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:45:40.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:45:40.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:45:40.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:45:40.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:45:40.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:45:40.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:45:40.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:45:40.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:45:40.389 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:45:40.458 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:45:30
2026-06-03T22:45:40.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87247, datetime.datetime(2026, 6, 3, 22, 45, 30), datetime.datetime(2026, 6, 3, 22, 45, 29), 'salt', 2.13, 100.1, None, 54.33, 112.33, -0.01, 822.07, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T22:45:40.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:45:40.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:45:40.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:45:29, diff=11.465687s, valid=True
2026-06-03T22:45:40.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:45:40.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:45:40.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:45:12, diff=28.46892s, valid=True
2026-06-03T22:45:40.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:45:40.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:45:40.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:45:28, diff=12.476529s, valid=True
2026-06-03T22:45:40.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:45:40.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:45:40.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:45:40.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:45:40.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:45:40.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:45:40.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:45:12, diff=28.480019s, valid=True
2026-06-03T22:45:40.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:45:40.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:45:40.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:45:40.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93737.480792s, valid=True
2026-06-03T22:45:40.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:45:40.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:45:40.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:45:40.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:45:40.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:45:40.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:45:40.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:45:40.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:45:40.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:45:40.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:45:40.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:45:40.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:45:40.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:45:40.801 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:45:41.001 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:45:41.336 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:45:41.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:45:41.437 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:45:41.437 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:45:41.630 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:45:41.630 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:46:11.660 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:46:11.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:46:11.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:46:11.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:46:11.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:46:12.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:46:12.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:46:12.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:46:12.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:46:12.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:46:12.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:46:12.117 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:46:12.117 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:46:14.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:46:14.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:46:14.790 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:46:14.790 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:46:14.799 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:46:14.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:46:14.813 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:46:14.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:46:14.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:46:14.814 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:46:14.814 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:46:14.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:46:14.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:46:14.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:46:15.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:46:15.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:46:15.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:46:15.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:46:15.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:46:15.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:46:15.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:46:15.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:46:15.152 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:46:15.230 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:46:00
2026-06-03T22:46:15.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87248, datetime.datetime(2026, 6, 3, 22, 46), datetime.datetime(2026, 6, 3, 22, 45, 59), 'salt', 2.06, 100.04, None, 47.14, 118.67, -0.01, 822.19, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T22:46:15.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:46:15.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:46:15.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:45:59, diff=16.238049s, valid=True
2026-06-03T22:46:15.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:46:15.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:46:15.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:46:12, diff=3.241492s, valid=True
2026-06-03T22:46:15.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:46:15.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:46:15.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:45:58, diff=17.249501s, valid=True
2026-06-03T22:46:15.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:46:15.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:46:15.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:46:15.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:46:15.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:46:15.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:46:15.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:46:12, diff=3.25319s, valid=True
2026-06-03T22:46:15.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:46:15.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:46:15.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:46:15.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93772.253997s, valid=True
2026-06-03T22:46:15.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:46:15.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:46:15.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:46:15.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:46:15.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:46:15.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:46:15.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:46:15.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:46:15.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:46:15.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:46:15.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:46:15.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:46:15.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:46:15.571 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:46:15.843 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:46:16.176 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:46:16.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:46:16.278 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:46:16.278 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:46:16.464 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:46:16.464 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:46:46.494 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:46:46.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:46:46.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:46:46.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:46:46.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:46:47.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:46:47.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:46:47.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:46:47.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:46:47.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:46:47.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:46:47.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:46:47.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:46:49.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:46:49.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:46:49.816 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:46:49.816 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:46:49.824 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:46:49.836 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:46:49.836 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:46:49.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:46:49.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:46:49.837 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:46:49.837 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:46:49.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:46:49.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:46:49.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:46:50.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:46:50.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:46:50.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:46:50.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:46:50.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:46:50.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:46:50.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:46:50.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:46:50.112 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:46:50.185 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:46:30
2026-06-03T22:46:50.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87249, datetime.datetime(2026, 6, 3, 22, 46, 30), datetime.datetime(2026, 6, 3, 22, 46, 30), 'salt', 2.09, 100.07, None, 46.64, 115.8, -0.01, 822.13, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T22:46:50.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:46:50.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:46:50.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:46:30, diff=20.191589s, valid=True
2026-06-03T22:46:50.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:46:50.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:46:50.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:46:12, diff=38.194773s, valid=True
2026-06-03T22:46:50.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:46:50.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:46:50.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:46:30, diff=20.202102s, valid=True
2026-06-03T22:46:50.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:46:50.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:46:50.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:46:50.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:46:50.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:46:50.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:46:50.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:46:12, diff=38.205428s, valid=True
2026-06-03T22:46:50.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:46:50.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:46:50.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:46:50.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93807.206159s, valid=True
2026-06-03T22:46:50.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:46:50.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:46:50.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:46:50.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:46:50.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:46:50.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:46:50.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:46:50.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:46:50.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:46:50.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:46:50.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:46:50.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:46:50.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:46:50.524 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:46:50.721 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:46:51.054 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:46:51.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:46:51.154 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:46:51.155 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:46:51.374 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:46:51.374 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:47:21.389 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:47:21.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:47:21.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:47:21.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:47:21.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:47:21.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:47:21.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:47:21.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:47:21.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:47:21.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:47:21.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:47:22.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:47:22.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:47:24.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:47:24.683 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:47:24.683 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:47:24.683 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:47:24.693 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:47:24.708 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:47:24.708 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:47:24.709 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:47:24.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:47:24.709 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:47:24.709 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:47:24.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:47:24.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:47:24.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:47:24.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:47:24.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:47:24.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:47:24.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:47:24.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:47:24.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:47:24.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:47:24.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:47:24.977 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:47:25.047 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:47:01
2026-06-03T22:47:25.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87250, datetime.datetime(2026, 6, 3, 22, 47, 1), datetime.datetime(2026, 6, 3, 22, 47), 'salt', 2.16, 100.14, None, 50.77, 116.53, -0.02, 822.0, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T22:47:25.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:47:25.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:47:25.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:47:00, diff=25.053764s, valid=True
2026-06-03T22:47:25.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:47:25.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:47:25.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:47:12, diff=13.056947s, valid=True
2026-06-03T22:47:25.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:47:25.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:47:25.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:46:58, diff=27.064494s, valid=True
2026-06-03T22:47:25.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:47:25.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:47:25.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:47:25.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:47:25.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:47:25.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:47:25.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:47:12, diff=13.067922s, valid=True
2026-06-03T22:47:25.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:47:25.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:47:25.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:47:25.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93842.068687s, valid=True
2026-06-03T22:47:25.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:47:25.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:47:25.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:47:25.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:47:25.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:47:25.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:47:25.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:47:25.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:47:25.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:47:25.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:47:25.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:47:25.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:47:25.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:47:25.462 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:47:25.675 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:47:26.007 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:47:26.107 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:47:26.107 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:47:26.107 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:47:26.293 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:47:26.294 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:47:56.310 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:47:56.310 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:47:56.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:47:56.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:47:56.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:47:56.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:47:56.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:47:56.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:47:56.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:47:56.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:47:56.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:47:56.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:47:56.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:47:59.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:47:59.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:47:59.417 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:47:59.417 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:47:59.428 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:47:59.441 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:47:59.442 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:47:59.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:47:59.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:47:59.443 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:47:59.443 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:47:59.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:47:59.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:47:59.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:47:59.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:47:59.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:47:59.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:47:59.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:47:59.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:47:59.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:47:59.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:47:59.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:47:59.771 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:47:59.841 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:47:31
2026-06-03T22:47:59.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87251, datetime.datetime(2026, 6, 3, 22, 47, 31), datetime.datetime(2026, 6, 3, 22, 47, 30), 'salt', 2.26, 100.14, None, 42.55, 120.5, -0.02, 822.19, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T22:47:59.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:47:59.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:47:59.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:47:30, diff=29.848203s, valid=True
2026-06-03T22:47:59.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:47:59.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:47:59.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:47:12, diff=47.851496s, valid=True
2026-06-03T22:47:59.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:47:59.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:47:59.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:47:28, diff=31.858333s, valid=True
2026-06-03T22:47:59.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:47:59.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:47:59.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:47:59.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:47:59.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:47:59.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:47:59.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:47:12, diff=47.861438s, valid=True
2026-06-03T22:47:59.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:47:59.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:47:59.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:47:59.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93876.862116s, valid=True
2026-06-03T22:47:59.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:47:59.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:47:59.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:47:59.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:47:59.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:47:59.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:47:59.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:47:59.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:47:59.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:48:00.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:48:00.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:48:00.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:48:00.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:48:00.192 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:48:00.391 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:48:00.723 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:48:00.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:48:00.824 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:48:00.824 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:48:01.112 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:48:01.112 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:48:31.142 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:48:31.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:48:31.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:48:31.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:48:31.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:48:31.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:48:31.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:48:31.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:48:31.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:48:31.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:48:31.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:48:31.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:48:31.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:48:34.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:48:34.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:48:34.165 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:48:34.165 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:48:34.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:48:34.187 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:48:34.187 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:48:34.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:48:34.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:48:34.188 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:48:34.188 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:48:34.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:48:34.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-03T22:48:34.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:48:34.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-03T22:48:34.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:48:34.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:48:34.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:48:34.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T22:48:34.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:48:34.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:48:34.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:48:34.544 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:48:34.614 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:48:31
2026-06-03T22:48:34.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87253, datetime.datetime(2026, 6, 3, 22, 48, 31), datetime.datetime(2026, 6, 3, 22, 48, 31), 'salt', 2.13, 100.14, None, 50.21, 124.4, -0.02, 822.07, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:48:34.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:48:34.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-03T22:48:34.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:48:31, diff=3.62173s, valid=True
2026-06-03T22:48:34.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:48:34.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:48:34.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:48:12, diff=22.625155s, valid=True
2026-06-03T22:48:34.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:48:34.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-03T22:48:34.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:48:29, diff=5.6332s, valid=True
2026-06-03T22:48:34.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:48:34.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:48:34.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:48:34.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:48:34.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:48:34.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T22:48:34.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:48:12, diff=22.636782s, valid=True
2026-06-03T22:48:34.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:48:34.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:48:34.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:48:34.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93911.637551s, valid=True
2026-06-03T22:48:34.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:48:34.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:48:34.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:48:34.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:48:34.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:48:34.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:48:34.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:48:34.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:48:34.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:48:34.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:48:34.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:48:34.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:48:34.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:48:35.026 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:48:35.224 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:48:35.560 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:48:35.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:48:35.663 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:48:35.663 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:48:35.839 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:48:35.840 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:49:05.840 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:49:05.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:49:05.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:49:06.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:49:06.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:49:06.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:49:06.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:49:06.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:49:06.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:49:06.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:49:06.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:49:06.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:49:06.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:49:08.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:49:08.969 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:49:08.970 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:49:08.970 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:49:08.981 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:49:08.993 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:49:08.994 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:49:08.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:49:08.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:49:08.995 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:49:08.995 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:49:09.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:49:09.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:49:09.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:49:09.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:49:09.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:49:09.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T22:49:09.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:49:09.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T22:49:09.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:49:09.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:49:09.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:49:09.356 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:49:09.429 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:49:02
2026-06-03T22:49:09.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87254, datetime.datetime(2026, 6, 3, 22, 49, 2), datetime.datetime(2026, 6, 3, 22, 49, 1), 'salt', 2.03, 100.1, None, 49.85, 117.82, -0.01, 822.07, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:49:09.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:49:09.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:49:09.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:49:01, diff=8.437528s, valid=True
2026-06-03T22:49:09.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:49:09.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T22:49:09.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:48:12, diff=57.441145s, valid=True
2026-06-03T22:49:09.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:49:09.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:49:09.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:48:59, diff=10.449797s, valid=True
2026-06-03T22:49:09.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:49:09.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:49:09.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:49:09.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:49:09.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:49:09.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T22:49:09.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:48:12, diff=57.453733s, valid=True
2026-06-03T22:49:09.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:49:09.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:49:09.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:49:09.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93946.454594s, valid=True
2026-06-03T22:49:09.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:49:09.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:49:09.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:49:09.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:49:09.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:49:09.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:49:09.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:49:09.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:49:09.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:49:09.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:49:09.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:49:09.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:49:09.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:49:09.774 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:49:09.990 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:49:10.337 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:49:10.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:49:10.437 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:49:10.437 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:49:10.644 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:49:10.644 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:49:40.675 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:49:40.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:49:40.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:49:40.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:49:41.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:49:41.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:49:41.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:49:41.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:49:41.268 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:49:41.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:49:41.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:49:41.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:49:41.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:49:44.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:49:44.036 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:49:44.036 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:49:44.037 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:49:44.047 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:49:44.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:49:44.060 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:49:44.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:49:44.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:49:44.061 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:49:44.062 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:49:44.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:49:44.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:49:44.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:49:44.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:49:44.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:49:44.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T22:49:44.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:49:44.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T22:49:44.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:49:44.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:49:44.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:49:44.412 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:49:44.488 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:49:32
2026-06-03T22:49:44.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87255, datetime.datetime(2026, 6, 3, 22, 49, 32), datetime.datetime(2026, 6, 3, 22, 49, 31), 'salt', 2.06, 100.1, None, 49.54, 124.49, -0.02, 822.19, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:49:44.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:49:44.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:49:44.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:49:31, diff=13.494358s, valid=True
2026-06-03T22:49:44.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:49:44.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T22:49:44.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:48:12, diff=92.497218s, valid=True
2026-06-03T22:49:44.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:49:44.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:49:44.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:49:29, diff=15.503895s, valid=True
2026-06-03T22:49:44.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:49:44.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:49:44.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:49:44.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:49:44.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:49:44.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T22:49:44.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:48:12, diff=92.506962s, valid=True
2026-06-03T22:49:44.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:49:44.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:49:44.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:49:44.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=93981.507635s, valid=True
2026-06-03T22:49:44.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:49:44.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:49:44.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:49:44.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:49:44.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:49:44.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:49:44.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:49:44.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:49:44.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:49:44.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:49:44.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:49:44.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:49:44.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:49:44.893 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:49:45.089 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:49:45.422 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:49:45.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:49:45.523 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:49:45.523 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:49:45.738 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:49:45.738 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:50:15.768 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:50:15.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:50:15.768 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:50:16.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:50:16.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:50:16.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:50:16.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:50:16.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:50:16.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:50:16.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:50:16.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:50:16.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:50:16.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:50:19.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:50:19.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:50:19.026 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:50:19.026 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:50:19.037 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:50:19.050 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:50:19.050 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:50:19.051 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:50:19.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:50:19.052 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:50:19.052 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:50:19.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:50:19.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:50:19.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:50:19.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:50:19.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:50:19.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T22:50:19.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:50:19.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T22:50:19.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:50:19.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:50:19.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:50:19.398 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:50:19.470 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:50:02
2026-06-03T22:50:19.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87256, datetime.datetime(2026, 6, 3, 22, 50, 2), datetime.datetime(2026, 6, 3, 22, 50, 1), 'salt', 2.03, 100.14, None, 47.0, 124.26, -0.02, 822.19, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:50:19.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:50:19.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:50:19.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:50:01, diff=18.477447s, valid=True
2026-06-03T22:50:19.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:50:19.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T22:50:19.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:48:12, diff=127.480989s, valid=True
2026-06-03T22:50:19.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:50:19.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:50:19.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:49:59, diff=20.489218s, valid=True
2026-06-03T22:50:19.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:50:19.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:50:19.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:50:19.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:50:19.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:50:19.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T22:50:19.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:48:12, diff=127.492996s, valid=True
2026-06-03T22:50:19.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:50:19.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:50:19.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:50:19.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94016.493827s, valid=True
2026-06-03T22:50:19.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:50:19.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:50:19.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:50:19.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:50:19.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:50:19.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:50:19.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:50:19.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:50:19.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:50:19.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:50:19.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:50:19.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:50:19.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:50:19.813 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:50:20.033 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:50:20.380 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:50:20.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:50:20.482 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:50:20.482 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:50:20.674 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:50:20.675 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:50:50.705 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:50:50.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:50:50.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:50:50.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:50:50.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:50:51.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:50:51.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:50:51.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:50:51.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:50:51.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:50:51.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:50:51.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:50:51.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:50:53.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:50:53.896 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:50:53.897 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:50:53.897 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:50:53.905 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:50:53.918 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:50:53.918 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:50:53.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:50:53.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:50:53.919 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:50:53.920 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:50:53.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:50:54.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:50:54.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:50:54.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:50:54.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:50:54.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T22:50:54.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:50:54.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T22:50:54.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:50:54.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:50:54.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:50:54.268 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:50:54.341 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:50:32
2026-06-03T22:50:54.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87257, datetime.datetime(2026, 6, 3, 22, 50, 32), datetime.datetime(2026, 6, 3, 22, 50, 32), 'salt', 2.13, 100.14, None, 40.86, 126.75, -0.02, 822.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T22:50:54.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:50:54.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:50:54.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:50:32, diff=22.348482s, valid=True
2026-06-03T22:50:54.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:50:54.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T22:50:54.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:48:12, diff=162.351948s, valid=True
2026-06-03T22:50:54.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:50:54.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:50:54.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:50:30, diff=24.360058s, valid=True
2026-06-03T22:50:54.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:50:54.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:50:54.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:50:54.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:50:54.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:50:54.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T22:50:54.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:48:12, diff=162.363799s, valid=True
2026-06-03T22:50:54.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:50:54.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:50:54.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:50:54.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94051.364588s, valid=True
2026-06-03T22:50:54.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:50:54.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:50:54.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:50:54.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:50:54.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:50:54.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:50:54.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:50:54.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:50:54.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:50:54.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:50:54.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:50:54.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:50:54.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:50:54.683 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:50:54.888 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:50:55.228 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:50:55.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:50:55.332 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:50:55.332 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:50:55.587 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:50:55.587 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:51:25.617 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:51:25.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:51:25.618 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:51:25.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:51:25.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:51:26.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:51:26.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:51:26.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:51:26.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:51:26.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:51:26.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:51:26.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:51:26.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:51:28.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:51:28.880 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:51:28.881 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:51:28.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:51:28.891 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:51:28.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:51:28.909 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:51:28.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:51:28.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:51:28.910 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:51:28.910 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:51:28.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:51:29.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:51:29.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:51:29.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:51:29.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:51:29.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:51:29.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:51:29.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:51:29.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:51:29.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:51:29.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:51:29.260 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:51:29.332 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:51:02
2026-06-03T22:51:29.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87258, datetime.datetime(2026, 6, 3, 22, 51, 2), datetime.datetime(2026, 6, 3, 22, 51, 2), 'salt', 2.19, 100.14, None, 48.58, 120.62, -0.02, 822.13, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:51:29.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:51:29.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:51:29.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:51:02, diff=27.340086s, valid=True
2026-06-03T22:51:29.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:51:29.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:51:29.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:48:12, diff=197.343526s, valid=True
2026-06-03T22:51:29.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:51:29.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:51:29.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:51:01, diff=28.351705s, valid=True
2026-06-03T22:51:29.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:51:29.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:51:29.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:51:29.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:51:29.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:51:29.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:51:29.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:48:12, diff=197.355363s, valid=True
2026-06-03T22:51:29.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:51:29.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:51:29.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:51:29.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94086.356171s, valid=True
2026-06-03T22:51:29.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:51:29.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:51:29.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:51:29.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:51:29.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:51:29.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:51:29.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:51:29.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:51:29.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:51:29.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:51:29.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:51:29.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:51:29.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:51:29.676 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:51:29.965 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:51:30.341 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:51:30.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:51:30.443 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:51:30.443 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:51:30.701 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:51:30.701 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:52:00.706 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:52:00.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:52:00.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:52:01.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:52:01.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:52:01.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:52:01.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:52:01.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:52:01.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:52:01.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:52:01.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:52:01.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:52:01.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:52:04.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:52:04.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:52:04.031 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:52:04.032 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:52:04.042 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:52:04.055 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:52:04.055 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:52:04.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:52:04.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:52:04.057 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:52:04.057 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:52:04.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:52:04.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-03T22:52:04.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:52:04.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-03T22:52:04.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:52:04.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:52:04.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:52:04.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:52:04.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:52:04.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:52:04.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:52:04.395 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:52:04.466 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:52:03
2026-06-03T22:52:04.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87260, datetime.datetime(2026, 6, 3, 22, 52, 3), datetime.datetime(2026, 6, 3, 22, 52, 2), 'salt', 2.06, 100.17, None, 41.92, 120.81, -0.03, 822.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T22:52:04.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:52:04.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-03T22:52:04.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:52:02, diff=2.473975s, valid=True
2026-06-03T22:52:04.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:52:04.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:52:04.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:48:12, diff=232.477489s, valid=True
2026-06-03T22:52:04.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:52:04.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-03T22:52:04.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:52:00, diff=4.485666s, valid=True
2026-06-03T22:52:04.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:52:04.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:52:04.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:52:04.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:52:04.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:52:04.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:52:04.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:48:12, diff=232.489387s, valid=True
2026-06-03T22:52:04.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:52:04.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:52:04.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:52:04.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94121.490205s, valid=True
2026-06-03T22:52:04.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:52:04.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:52:04.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:52:04.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:52:04.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:52:04.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:52:04.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:52:04.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:52:04.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:52:04.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:52:04.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:52:04.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:52:04.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:52:04.809 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:52:05.017 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:52:05.358 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:52:05.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:52:05.461 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:52:05.461 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:52:05.671 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:52:05.671 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:52:35.701 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:52:35.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:52:35.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:52:36.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:52:36.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:52:36.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:52:36.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:52:36.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:52:36.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:52:36.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:52:36.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:52:36.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:52:36.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:52:38.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:52:38.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:52:38.986 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:52:38.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:52:38.995 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:52:39.008 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:52:39.009 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:52:39.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:52:39.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:52:39.010 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:52:39.010 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:52:39.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:52:39.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:52:39.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:52:39.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:52:39.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:52:39.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:52:39.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:52:39.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:52:39.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:52:39.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:52:39.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:52:39.356 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:52:39.429 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:52:33
2026-06-03T22:52:39.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87261, datetime.datetime(2026, 6, 3, 22, 52, 33), datetime.datetime(2026, 6, 3, 22, 52, 32), 'salt', 2.09, 100.1, None, 38.53, 125.27, -0.02, 822.19, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T22:52:39.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:52:39.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:52:39.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:52:32, diff=7.436995s, valid=True
2026-06-03T22:52:39.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:52:39.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:52:39.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:53:12, diff=-32.559493s, valid=True
2026-06-03T22:52:39.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:52:39.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:52:39.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:52:31, diff=8.448609s, valid=True
2026-06-03T22:52:39.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:52:39.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:52:39.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:52:39.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:52:39.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:52:39.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:52:39.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:53:12, diff=-32.547684s, valid=True
2026-06-03T22:52:39.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:52:39.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:52:39.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:52:39.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94156.453122s, valid=True
2026-06-03T22:52:39.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:52:39.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:52:39.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:52:39.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:52:39.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:52:39.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:52:39.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:52:39.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:52:39.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:52:39.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:52:39.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:52:39.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:52:39.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:52:39.850 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:52:40.071 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:52:40.440 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:52:40.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:52:40.542 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:52:40.542 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:52:40.625 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:52:40.626 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:53:10.656 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:53:10.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:53:10.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:53:11.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:53:11.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:53:11.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:53:11.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:53:11.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:53:11.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:53:11.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:53:11.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:53:11.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:53:11.437 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:53:14.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:53:14.173 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:53:14.174 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:53:14.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:53:14.185 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:53:14.198 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:53:14.199 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:53:14.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:53:14.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:53:14.200 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:53:14.200 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:53:14.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:53:14.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:53:14.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:53:14.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:53:14.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:53:14.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:53:14.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:53:14.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:53:14.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:53:14.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:53:14.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:53:14.532 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:53:14.605 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:53:03
2026-06-03T22:53:14.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87262, datetime.datetime(2026, 6, 3, 22, 53, 3), datetime.datetime(2026, 6, 3, 22, 53, 3), 'salt', 2.16, 100.1, None, 41.28, 121.58, -0.02, 822.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T22:53:14.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:53:14.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:53:14.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:53:03, diff=11.612363s, valid=True
2026-06-03T22:53:14.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:53:14.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:53:14.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:53:12, diff=2.615811s, valid=True
2026-06-03T22:53:14.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:53:14.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:53:14.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:53:01, diff=13.623789s, valid=True
2026-06-03T22:53:14.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:53:14.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:53:14.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:53:14.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:53:14.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:53:14.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:53:14.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:53:12, diff=2.627367s, valid=True
2026-06-03T22:53:14.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:53:14.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:53:14.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:53:14.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94191.628152s, valid=True
2026-06-03T22:53:14.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:53:14.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:53:14.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:53:14.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:53:14.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:53:14.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:53:14.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:53:14.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:53:14.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:53:14.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:53:14.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:53:14.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:53:14.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:53:14.948 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:53:15.154 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:53:15.497 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:53:15.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:53:15.601 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:53:15.601 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:53:15.687 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:53:15.688 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:53:45.698 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:53:45.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:53:45.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:53:45.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:53:45.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:53:46.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:53:46.084 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:53:46.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:53:46.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:53:46.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:53:46.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:53:46.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:53:46.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:53:48.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:53:48.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:53:48.835 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:53:48.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:53:48.844 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:53:48.857 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:53:48.858 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:53:48.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:53:48.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:53:48.859 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:53:48.859 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:53:48.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:53:48.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:53:48.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:53:49.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:53:49.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:53:49.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:53:49.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:53:49.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:53:49.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:53:49.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:53:49.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:53:49.161 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:53:49.241 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:53:34
2026-06-03T22:53:49.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87263, datetime.datetime(2026, 6, 3, 22, 53, 34), datetime.datetime(2026, 6, 3, 22, 53, 33), 'salt', 2.09, 100.1, None, 46.33, 127.15, -0.02, 822.13, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:53:49.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:53:49.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:53:49.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:53:33, diff=16.247101s, valid=True
2026-06-03T22:53:49.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:53:49.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:53:49.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:54:12, diff=-22.750128s, valid=True
2026-06-03T22:53:49.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:53:49.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:53:49.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:53:31, diff=18.256421s, valid=True
2026-06-03T22:53:49.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:53:49.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:53:49.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:53:49.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:53:49.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:53:49.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:53:49.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:54:12, diff=-22.740617s, valid=True
2026-06-03T22:53:49.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:53:49.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:53:49.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:53:49.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94226.260037s, valid=True
2026-06-03T22:53:49.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:53:49.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:53:49.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:53:49.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:53:49.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:53:49.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:53:49.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:53:49.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:53:49.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:53:49.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:53:49.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:53:49.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:53:49.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:53:49.644 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:53:49.873 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:53:50.231 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:53:50.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:53:50.335 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:53:50.335 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:53:50.585 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:53:50.585 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:54:20.614 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:54:20.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:54:20.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:54:21.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:54:21.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:54:21.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:54:21.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:54:21.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:54:21.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:54:21.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:54:21.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:54:21.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:54:21.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:54:24.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:54:24.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:54:24.097 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:54:24.097 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:54:24.108 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:54:24.121 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:54:24.122 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:54:24.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:54:24.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:54:24.123 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:54:24.123 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:54:24.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:54:24.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:54:24.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:54:24.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:54:24.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:54:24.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:54:24.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:54:24.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:54:24.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:54:24.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:54:24.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:54:24.448 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:54:24.519 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:54:04
2026-06-03T22:54:24.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87264, datetime.datetime(2026, 6, 3, 22, 54, 4), datetime.datetime(2026, 6, 3, 22, 54, 3), 'salt', 2.06, 100.07, None, 51.51, 119.87, -0.01, 822.01, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:54:24.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:54:24.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:54:24.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:54:03, diff=21.52681s, valid=True
2026-06-03T22:54:24.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:54:24.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:54:24.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:54:12, diff=12.53031s, valid=True
2026-06-03T22:54:24.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:54:24.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:54:24.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:54:01, diff=23.538535s, valid=True
2026-06-03T22:54:24.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:54:24.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:54:24.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:54:24.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:54:24.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:54:24.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:54:24.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:54:12, diff=12.542272s, valid=True
2026-06-03T22:54:24.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:54:24.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:54:24.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:54:24.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94261.543097s, valid=True
2026-06-03T22:54:24.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:54:24.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:54:24.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:54:24.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:54:24.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:54:24.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:54:24.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:54:24.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:54:24.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:54:24.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:54:24.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:54:24.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:54:24.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:54:24.870 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:54:25.081 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:54:25.446 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:54:25.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:54:25.548 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:54:25.549 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:54:25.742 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:54:25.742 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:54:55.756 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:54:55.756 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:54:55.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:54:55.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:54:55.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:54:56.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:54:56.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:54:56.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:54:56.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:54:56.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:54:56.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:54:56.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:54:56.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:54:58.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:54:58.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:54:58.833 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:54:58.833 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:54:58.844 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:54:58.857 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:54:58.858 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:54:58.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:54:58.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:54:58.859 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:54:58.859 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:54:58.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:54:58.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:54:58.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:54:59.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:54:59.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:54:59.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:54:59.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:54:59.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:54:59.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:54:59.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:54:59.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:54:59.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:54:59.259 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:54:34
2026-06-03T22:54:59.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87265, datetime.datetime(2026, 6, 3, 22, 54, 34), datetime.datetime(2026, 6, 3, 22, 54, 34), 'salt', 1.96, 100.04, None, 50.42, 125.29, -0.01, 822.07, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:54:59.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:54:59.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:54:59.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:54:34, diff=25.266842s, valid=True
2026-06-03T22:54:59.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:54:59.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:54:59.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:55:12, diff=-12.729776s, valid=True
2026-06-03T22:54:59.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:54:59.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:54:59.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:54:32, diff=27.27821s, valid=True
2026-06-03T22:54:59.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:54:59.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:54:59.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:54:59.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:54:59.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:54:59.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:54:59.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:55:12, diff=-12.718098s, valid=True
2026-06-03T22:54:59.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:54:59.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:54:59.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:54:59.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94296.282721s, valid=True
2026-06-03T22:54:59.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:54:59.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:54:59.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:54:59.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:54:59.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:54:59.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:54:59.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:54:59.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:54:59.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:54:59.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:54:59.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:54:59.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:54:59.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:54:59.679 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:54:59.896 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:55:00.266 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:55:00.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:55:00.374 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:55:00.375 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:55:00.636 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:55:00.637 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:55:30.667 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:55:30.667 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:55:30.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:55:30.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:55:30.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:55:31.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:55:31.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:55:31.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:55:31.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:55:31.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:55:31.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:55:31.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:55:31.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:55:33.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:55:33.973 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:55:33.974 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:55:33.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:55:33.984 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:55:33.997 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:55:33.997 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:55:33.998 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:55:33.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:55:33.998 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:55:33.999 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:55:34.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:55:34.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:55:34.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:55:34.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:55:34.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:55:34.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:55:34.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:55:34.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:55:34.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:55:34.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:55:34.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:55:34.329 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:55:34.399 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:55:05
2026-06-03T22:55:34.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87266, datetime.datetime(2026, 6, 3, 22, 55, 5), datetime.datetime(2026, 6, 3, 22, 55, 4), 'salt', 1.96, 100.07, None, 50.42, 127.93, -0.01, 822.01, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:55:34.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:55:34.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:55:34.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:55:04, diff=30.406993s, valid=True
2026-06-03T22:55:34.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:55:34.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:55:34.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:55:12, diff=22.410458s, valid=True
2026-06-03T22:55:34.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:55:34.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:55:34.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:55:02, diff=32.418543s, valid=True
2026-06-03T22:55:34.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:55:34.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:55:34.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:55:34.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:55:34.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:55:34.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:55:34.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:55:12, diff=22.422243s, valid=True
2026-06-03T22:55:34.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:55:34.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:55:34.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:55:34.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94331.423059s, valid=True
2026-06-03T22:55:34.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:55:34.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:55:34.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:55:34.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:55:34.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:55:34.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:55:34.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:55:34.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:55:34.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:55:34.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:55:34.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:55:34.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:55:34.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:55:34.746 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:55:34.953 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:55:35.296 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:55:35.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:55:35.400 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:55:35.400 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:55:35.582 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:55:35.582 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:56:05.591 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:56:05.591 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:56:05.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:56:06.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:56:06.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:56:06.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:56:06.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:56:06.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:56:06.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:56:06.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:56:06.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:56:06.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:56:06.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:56:09.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:56:09.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:56:09.117 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:56:09.117 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:56:09.129 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:56:09.142 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:56:09.158 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:56:09.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:56:09.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:56:09.160 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:56:09.160 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:56:09.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:56:09.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-03T22:56:09.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:56:09.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-03T22:56:09.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:56:09.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:56:09.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:56:09.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:56:09.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:56:09.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:56:09.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:56:09.495 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:56:09.566 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:56:05
2026-06-03T22:56:09.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87268, datetime.datetime(2026, 6, 3, 22, 56, 5), datetime.datetime(2026, 6, 3, 22, 56, 4), 'salt', 1.99, 100.14, None, 43.12, 119.56, -0.02, 822.19, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T22:56:09.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:56:09.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-03T22:56:09.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:56:04, diff=5.574014s, valid=True
2026-06-03T22:56:09.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:56:09.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:56:09.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:56:12, diff=-2.422528s, valid=True
2026-06-03T22:56:09.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:56:09.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-03T22:56:09.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:56:04, diff=5.585553s, valid=True
2026-06-03T22:56:09.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:56:09.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:56:09.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:56:09.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:56:09.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:56:09.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:56:09.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:56:12, diff=-2.410728s, valid=True
2026-06-03T22:56:09.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:56:09.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:56:09.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:56:09.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94366.590065s, valid=True
2026-06-03T22:56:09.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:56:09.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:56:09.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:56:09.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:56:09.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:56:09.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:56:09.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:56:09.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:56:09.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:56:09.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:56:09.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:56:09.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:56:09.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:56:09.924 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:56:10.158 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:56:10.506 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:56:10.609 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:56:10.609 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:56:10.609 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:56:11.970 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:56:11.970 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:56:42.001 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:56:42.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:56:42.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:56:42.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:56:42.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:56:42.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:56:42.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:56:42.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:56:42.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:56:42.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:56:42.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:56:42.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:56:42.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:56:45.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:56:45.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:56:45.272 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:56:45.272 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:56:45.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:56:45.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:56:45.296 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:56:45.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:56:45.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:56:45.297 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:56:45.298 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:56:45.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:56:45.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:56:45.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:56:45.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:56:45.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:56:45.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:56:45.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:56:45.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:56:45.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:56:45.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:56:45.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:56:45.634 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:56:45.705 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:56:35
2026-06-03T22:56:45.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87269, datetime.datetime(2026, 6, 3, 22, 56, 35), datetime.datetime(2026, 6, 3, 22, 56, 35), 'salt', 1.89, 100.07, None, 48.94, 124.92, -0.02, 822.13, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:56:45.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:56:45.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:56:45.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:56:35, diff=10.712733s, valid=True
2026-06-03T22:56:45.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:56:45.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:56:45.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:57:12, diff=-26.283781s, valid=True
2026-06-03T22:56:45.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:56:45.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:56:45.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:56:35, diff=10.724355s, valid=True
2026-06-03T22:56:45.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:56:45.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:56:45.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:56:45.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:56:45.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:56:45.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:56:45.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:57:12, diff=-26.271936s, valid=True
2026-06-03T22:56:45.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:56:45.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:56:45.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:56:45.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94402.728896s, valid=True
2026-06-03T22:56:45.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:56:45.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:56:45.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:56:45.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:56:45.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:56:45.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:56:45.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:56:45.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:56:45.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:56:45.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:56:45.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:56:45.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:56:46.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:56:46.049 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:56:46.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:56:46.657 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:56:46.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:56:46.759 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:56:46.759 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:56:46.851 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:56:46.852 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:57:16.867 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:57:16.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:57:16.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:57:17.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:57:17.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:57:17.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:57:17.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:57:17.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:57:17.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:57:17.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:57:17.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:57:17.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:57:17.671 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:57:20.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:57:20.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:57:20.685 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:57:20.685 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:57:20.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:57:20.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:57:20.710 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:57:20.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:57:20.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:57:20.711 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:57:20.711 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:57:20.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:57:20.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:57:20.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:57:20.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:57:20.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:57:20.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:57:20.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:57:21.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:57:21.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:57:21.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:57:21.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:57:21.044 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:57:21.115 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:57:06
2026-06-03T22:57:21.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87270, datetime.datetime(2026, 6, 3, 22, 57, 6), datetime.datetime(2026, 6, 3, 22, 57, 5), 'salt', 2.06, 100.2, None, 43.12, 124.64, -0.03, 822.19, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T22:57:21.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:57:21.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:57:21.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:57:05, diff=16.123244s, valid=True
2026-06-03T22:57:21.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:57:21.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:57:21.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:57:12, diff=9.126694s, valid=True
2026-06-03T22:57:21.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:57:21.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:57:21.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:57:03, diff=18.134832s, valid=True
2026-06-03T22:57:21.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:57:21.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:57:21.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:57:21.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:57:21.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:57:21.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:57:21.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:57:12, diff=9.138521s, valid=True
2026-06-03T22:57:21.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:57:21.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:57:21.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:57:21.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94438.13933s, valid=True
2026-06-03T22:57:21.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:57:21.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:57:21.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:57:21.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:57:21.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:57:21.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:57:21.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:57:21.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:57:21.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:57:21.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:57:21.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:57:21.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:57:21.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:57:21.465 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:57:21.671 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:57:22.011 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:57:22.113 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:57:22.114 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:57:22.114 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:57:22.195 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:57:22.195 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:57:52.225 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:57:52.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:57:52.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:57:52.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:57:52.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:57:52.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:57:52.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:57:52.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:57:52.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:57:52.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:57:52.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:57:52.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:57:52.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:57:55.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:57:55.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:57:55.316 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:57:55.316 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:57:55.326 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:57:55.338 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:57:55.339 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:57:55.339 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:57:55.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:57:55.340 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:57:55.340 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:57:55.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:57:55.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:57:55.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:57:55.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:57:55.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:57:55.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:57:55.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:57:55.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:57:55.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:57:55.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:57:55.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:57:55.671 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:57:55.742 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:57:36
2026-06-03T22:57:55.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87271, datetime.datetime(2026, 6, 3, 22, 57, 36), datetime.datetime(2026, 6, 3, 22, 57, 35), 'salt', 2.06, 100.07, None, 45.69, 117.26, -0.01, 822.25, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:57:55.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:57:55.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:57:55.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:57:35, diff=20.749432s, valid=True
2026-06-03T22:57:55.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:57:55.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:57:55.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:58:12, diff=-16.247085s, valid=True
2026-06-03T22:57:55.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:57:55.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:57:55.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:57:33, diff=22.760973s, valid=True
2026-06-03T22:57:55.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:57:55.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:57:55.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:57:55.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:57:55.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:57:55.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:57:55.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:58:12, diff=-16.23537s, valid=True
2026-06-03T22:57:55.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:57:55.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:57:55.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:57:55.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94472.76542s, valid=True
2026-06-03T22:57:55.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:57:55.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:57:55.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:57:55.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:57:55.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:57:55.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:57:55.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:57:55.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:57:55.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:57:55.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:57:55.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:57:55.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:57:56.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:57:56.159 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:57:56.364 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:57:56.704 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:57:56.807 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:57:56.807 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:57:56.807 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:57:57.000 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:57:57.000 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:58:27.022 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:58:27.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:58:27.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:58:27.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:58:27.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:58:27.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:58:27.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:58:27.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:58:27.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:58:27.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:58:27.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:58:27.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:58:27.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:58:30.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:58:30.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:58:30.549 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:58:30.549 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:58:30.560 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:58:30.572 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:58:30.573 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:58:30.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:58:30.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:58:30.574 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:58:30.574 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:58:30.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:58:30.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:58:30.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:58:30.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:58:30.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:58:30.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:58:30.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:58:30.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-03T22:58:30.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:58:30.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:58:30.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:58:30.903 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:58:30.973 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:58:06
2026-06-03T22:58:30.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87272, datetime.datetime(2026, 6, 3, 22, 58, 6), datetime.datetime(2026, 6, 3, 22, 58, 5), 'salt', 2.03, 100.14, None, 47.98, 117.85, -0.02, 822.01, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:58:30.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:58:30.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:58:30.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:58:05, diff=25.980978s, valid=True
2026-06-03T22:58:30.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:58:30.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:58:30.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:58:12, diff=18.984456s, valid=True
2026-06-03T22:58:30.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:58:30.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:58:30.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:58:04, diff=26.992558s, valid=True
2026-06-03T22:58:30.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:58:30.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:58:30.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:58:30.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:58:30.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:58:30.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-03T22:58:30.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:58:12, diff=18.996029s, valid=True
2026-06-03T22:58:30.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:58:30.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:58:30.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:58:30.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94507.996782s, valid=True
2026-06-03T22:58:30.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:58:30.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:58:30.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:58:30.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:58:30.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:58:31.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:58:31.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:58:31.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:58:31.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:58:31.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:58:31.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:58:31.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:58:31.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:58:31.316 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:58:31.521 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:58:31.862 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:58:31.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:58:31.964 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:58:31.964 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:58:32.236 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:58:32.236 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:59:02.266 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:59:02.266 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:59:02.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:59:02.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:59:02.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:59:02.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:59:02.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:59:02.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:59:02.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:59:02.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:59:02.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:59:02.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:59:02.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:59:05.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:59:05.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:59:05.425 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:59:05.425 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:59:05.437 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:59:05.450 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:59:05.450 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:59:05.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:59:05.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:59:05.451 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:59:05.452 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:59:05.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:59:05.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T22:59:05.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:59:05.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T22:59:05.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:59:05.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:59:05.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:59:05.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:59:05.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:59:05.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:59:05.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:59:05.742 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:59:05.813 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:58:36
2026-06-03T22:59:05.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87273, datetime.datetime(2026, 6, 3, 22, 58, 36), datetime.datetime(2026, 6, 3, 22, 58, 36), 'salt', 1.96, 100.14, None, 45.09, 121.16, -0.02, 822.19, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:59:05.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:59:05.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T22:59:05.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:58:36, diff=29.820542s, valid=True
2026-06-03T22:59:05.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:59:05.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:59:05.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:59:12, diff=-6.176171s, valid=True
2026-06-03T22:59:05.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:59:05.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T22:59:05.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:58:34, diff=31.83157s, valid=True
2026-06-03T22:59:05.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:59:05.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:59:05.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:59:05.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:59:05.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:59:05.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:59:05.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:59:12, diff=-6.164873s, valid=True
2026-06-03T22:59:05.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:59:05.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:59:05.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:59:05.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94542.835898s, valid=True
2026-06-03T22:59:05.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:59:05.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:59:05.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:59:05.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:59:05.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:59:05.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:59:05.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:59:05.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:59:05.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:59:05.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:59:06.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:59:06.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:59:06.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:59:06.224 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:59:06.429 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:59:06.773 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:59:06.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:59:06.875 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:59:06.875 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:59:07.064 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:59:07.064 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T22:59:37.094 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T22:59:37.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T22:59:37.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T22:59:37.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T22:59:37.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T22:59:37.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T22:59:37.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T22:59:37.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T22:59:37.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T22:59:37.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T22:59:37.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T22:59:37.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T22:59:37.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T22:59:40.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T22:59:40.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T22:59:40.443 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T22:59:40.443 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T22:59:40.453 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T22:59:40.466 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T22:59:40.467 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T22:59:40.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T22:59:40.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T22:59:40.468 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T22:59:40.468 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T22:59:40.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T22:59:40.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-03T22:59:40.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T22:59:40.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-03T22:59:40.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:59:40.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:59:40.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T22:59:40.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T22:59:40.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T22:59:40.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T22:59:40.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T22:59:40.819 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T22:59:40.891 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 22:59:37
2026-06-03T22:59:40.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87275, datetime.datetime(2026, 6, 3, 22, 59, 37), datetime.datetime(2026, 6, 3, 22, 59, 36), 'salt', 1.89, 100.04, None, 48.05, 119.54, -0.01, 821.95, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T22:59:40.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T22:59:40.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-03T22:59:40.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:59:36, diff=4.898333s, valid=True
2026-06-03T22:59:40.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T22:59:40.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:59:40.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:00:12, diff=-31.09825s, valid=True
2026-06-03T22:59:40.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T22:59:40.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-03T22:59:40.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 22:59:35, diff=5.909711s, valid=True
2026-06-03T22:59:40.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T22:59:40.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:59:40.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T22:59:40.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T22:59:40.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T22:59:40.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T22:59:40.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:00:12, diff=-31.086697s, valid=True
2026-06-03T22:59:40.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T22:59:40.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T22:59:40.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T22:59:40.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94577.914099s, valid=True
2026-06-03T22:59:40.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T22:59:40.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T22:59:40.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T22:59:40.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T22:59:40.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T22:59:40.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T22:59:40.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T22:59:40.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T22:59:41.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T22:59:41.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T22:59:41.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T22:59:41.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T22:59:41.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T22:59:41.239 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T22:59:41.445 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:59:41.792 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T22:59:41.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T22:59:41.894 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T22:59:41.894 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T22:59:41.982 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T22:59:41.982 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:00:11.990 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:00:11.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:00:11.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:00:12.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:00:12.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:00:12.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:00:12.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:00:12.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:00:12.429 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:00:12.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:00:12.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:00:12.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:00:12.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:00:15.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:00:15.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:00:15.148 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:00:15.148 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:00:15.158 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:00:15.170 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:00:15.171 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:00:15.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:00:15.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:00:15.172 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:00:15.172 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:00:15.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:00:15.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:00:15.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:00:15.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:00:15.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:00:15.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T23:00:15.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:00:15.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-03T23:00:15.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:00:15.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:00:15.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:00:15.503 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:00:15.573 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:00:07
2026-06-03T23:00:15.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87276, datetime.datetime(2026, 6, 3, 23, 0, 7), datetime.datetime(2026, 6, 3, 23, 0, 6), 'salt', 1.86, 99.97, None, 47.14, 111.72, 0.0, 821.95, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:00:15.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:00:15.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:00:15.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:00:06, diff=9.581323s, valid=True
2026-06-03T23:00:15.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:00:15.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T23:00:15.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:00:12, diff=3.584813s, valid=True
2026-06-03T23:00:15.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:00:15.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:00:15.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:00:05, diff=10.593084s, valid=True
2026-06-03T23:00:15.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:00:15.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:00:15.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:00:15.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:00:15.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:00:15.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-03T23:00:15.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:00:12, diff=3.596785s, valid=True
2026-06-03T23:00:15.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:00:15.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:00:15.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:00:15.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94612.597604s, valid=True
2026-06-03T23:00:15.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:00:15.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:00:15.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:00:15.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:00:15.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:00:15.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:00:15.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:00:15.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:00:15.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:00:15.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:00:15.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:00:15.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:00:15.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:00:15.987 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:00:16.192 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:00:16.535 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:00:16.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:00:16.637 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:00:16.637 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:00:16.892 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:00:16.892 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:00:46.896 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:00:46.896 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:00:46.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:00:47.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:00:47.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:00:47.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:00:47.477 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:00:47.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:00:47.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:00:47.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:00:47.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:00:47.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:00:47.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:00:50.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:00:50.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:00:50.279 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:00:50.280 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:00:50.289 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:00:50.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:00:50.302 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:00:50.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:00:50.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:00:50.303 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:00:50.303 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:00:50.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:00:50.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:00:50.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:00:50.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:00:50.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:00:50.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:00:50.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:00:50.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:00:50.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:00:50.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:00:50.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:00:50.633 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:00:50.703 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:00:37
2026-06-03T23:00:50.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87277, datetime.datetime(2026, 6, 3, 23, 0, 37), datetime.datetime(2026, 6, 3, 23, 0, 37), 'salt', 1.99, 100.17, None, 46.08, 113.22, -0.03, 822.07, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:00:50.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:00:50.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:00:50.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:00:37, diff=13.710662s, valid=True
2026-06-03T23:00:50.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:00:50.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:00:50.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:01:12, diff=-21.285828s, valid=True
2026-06-03T23:00:50.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:00:50.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:00:50.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:00:35, diff=15.722209s, valid=True
2026-06-03T23:00:50.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:00:50.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:00:50.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:00:50.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:00:50.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:00:50.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:00:50.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:01:12, diff=-21.27422s, valid=True
2026-06-03T23:00:50.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:00:50.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:00:50.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:00:50.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94647.726546s, valid=True
2026-06-03T23:00:50.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:00:50.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:00:50.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:00:50.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:00:50.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:00:50.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:00:50.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:00:50.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:00:50.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:00:50.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:00:50.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:00:50.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:00:51.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:00:51.045 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:00:51.251 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:00:51.593 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:00:51.696 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:00:51.696 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:00:51.696 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:00:51.883 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:00:51.884 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:01:21.914 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:01:21.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:01:21.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:01:22.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:01:22.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:01:22.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:01:22.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:01:22.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:01:22.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:01:22.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:01:22.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:01:22.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:01:22.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:01:25.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:01:25.173 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:01:25.174 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:01:25.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:01:25.184 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:01:25.197 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:01:25.197 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:01:25.198 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:01:25.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:01:25.198 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:01:25.199 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:01:25.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:01:25.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:01:25.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:01:25.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:01:25.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:01:25.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:01:25.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:01:25.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:01:25.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:01:25.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:01:25.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:01:25.530 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:01:25.603 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:01:08
2026-06-03T23:01:25.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87278, datetime.datetime(2026, 6, 3, 23, 1, 8), datetime.datetime(2026, 6, 3, 23, 1, 7), 'salt', 1.96, 100.14, None, 52.15, 120.2, -0.02, 822.07, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:01:25.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:01:25.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:01:25.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:01:07, diff=18.611163s, valid=True
2026-06-03T23:01:25.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:01:25.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:01:25.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:01:12, diff=13.614749s, valid=True
2026-06-03T23:01:25.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:01:25.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:01:25.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:01:06, diff=19.622957s, valid=True
2026-06-03T23:01:25.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:01:25.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:01:25.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:01:25.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:01:25.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:01:25.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:01:25.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:01:12, diff=13.626673s, valid=True
2026-06-03T23:01:25.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:01:25.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:01:25.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:01:25.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94682.627469s, valid=True
2026-06-03T23:01:25.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:01:25.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:01:25.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:01:25.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:01:25.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:01:25.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:01:25.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:01:25.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:01:25.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:01:25.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:01:25.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:01:25.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:01:25.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:01:25.946 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:01:26.152 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:01:26.495 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:01:26.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:01:26.598 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:01:26.598 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:01:26.789 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:01:26.789 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:01:56.802 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:01:56.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:01:56.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:01:57.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:01:57.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:01:57.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:01:57.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:01:57.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:01:57.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:01:57.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:01:57.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:01:57.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:01:57.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:02:00.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:02:00.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:02:00.699 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:02:00.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:02:00.710 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:02:00.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:02:00.723 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:02:00.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:02:00.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:02:00.725 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:02:00.725 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:02:00.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:02:00.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:02:00.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:02:00.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:02:00.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:02:01.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:02:01.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:02:01.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:02:01.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:02:01.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:02:01.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:02:01.061 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:02:01.134 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:01:38
2026-06-03T23:02:01.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87279, datetime.datetime(2026, 6, 3, 23, 1, 38), datetime.datetime(2026, 6, 3, 23, 1, 37), 'salt', 1.96, 100.1, None, 46.5, 135.02, -0.02, 822.01, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:02:01.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:02:01.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:02:01.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:01:37, diff=24.140839s, valid=True
2026-06-03T23:02:01.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:02:01.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:02:01.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:02:12, diff=-10.856297s, valid=True
2026-06-03T23:02:01.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:02:01.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:02:01.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:01:36, diff=25.150503s, valid=True
2026-06-03T23:02:01.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:02:01.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:02:01.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:02:01.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:02:01.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:02:01.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:02:01.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:02:12, diff=-10.844758s, valid=True
2026-06-03T23:02:01.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:02:01.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:02:01.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:02:01.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94718.156692s, valid=True
2026-06-03T23:02:01.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:02:01.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:02:01.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:02:01.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:02:01.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:02:01.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:02:01.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:02:01.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:02:01.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:02:01.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:02:01.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:02:01.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:02:01.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:02:01.476 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:02:01.754 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:02:02.098 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:02:02.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:02:02.201 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:02:02.201 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:02:02.387 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:02:02.388 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:02:32.407 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:02:32.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:02:32.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:02:32.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:02:32.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:02:33.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:02:33.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:02:33.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:02:33.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:02:33.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:02:33.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:02:33.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:02:33.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:02:35.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:02:36.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:02:36.266 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:02:36.266 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:02:36.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:02:36.289 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:02:36.289 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:02:36.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:02:36.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:02:36.291 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:02:36.291 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:02:36.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:02:36.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:02:36.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:02:36.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:02:36.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:02:36.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:02:36.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:02:36.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:02:36.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:02:36.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:02:36.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:02:36.635 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:02:36.709 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:02:08
2026-06-03T23:02:36.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87280, datetime.datetime(2026, 6, 3, 23, 2, 8), datetime.datetime(2026, 6, 3, 23, 2, 7), 'salt', 1.93, 100.04, None, 38.92, 127.83, 0.0, 822.19, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:02:36.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:02:36.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:02:36.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:02:07, diff=29.716525s, valid=True
2026-06-03T23:02:36.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:02:36.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:02:36.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:02:12, diff=24.720008s, valid=True
2026-06-03T23:02:36.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:02:36.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:02:36.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:02:06, diff=30.728317s, valid=True
2026-06-03T23:02:36.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:02:36.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:02:36.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:02:36.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:02:36.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:02:36.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:02:36.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:02:12, diff=24.732074s, valid=True
2026-06-03T23:02:36.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:02:36.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:02:36.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:02:36.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94753.732892s, valid=True
2026-06-03T23:02:36.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:02:36.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:02:36.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:02:36.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:02:36.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:02:36.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:02:36.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:02:36.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:02:36.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:02:36.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:02:36.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:02:36.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:02:37.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:02:37.053 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:02:37.260 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:02:37.601 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:02:37.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:02:37.705 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:02:37.705 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:02:39.193 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:02:39.193 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:03:09.220 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:03:09.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:03:09.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:03:09.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:03:09.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:03:09.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:03:09.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:03:09.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:03:09.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:03:09.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:03:09.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:03:09.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:03:09.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:03:13.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:03:13.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:03:13.132 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:03:13.132 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:03:13.142 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:03:13.155 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:03:13.155 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:03:13.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:03:13.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:03:13.157 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:03:13.157 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:03:13.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:03:13.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-03T23:03:13.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:03:13.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-03T23:03:13.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:03:13.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:03:13.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:03:13.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:03:13.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:03:13.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:03:13.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:03:13.498 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:03:13.574 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:03:09
2026-06-03T23:03:13.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87282, datetime.datetime(2026, 6, 3, 23, 3, 9), datetime.datetime(2026, 6, 3, 23, 3, 8), 'salt', 1.99, 100.1, None, 47.24, 121.49, -0.02, 822.19, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:03:13.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:03:13.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-03T23:03:13.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:03:08, diff=5.581297s, valid=True
2026-06-03T23:03:13.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:03:13.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:03:13.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:03:12, diff=1.5848s, valid=True
2026-06-03T23:03:13.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:03:13.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-03T23:03:13.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:03:07, diff=6.592915s, valid=True
2026-06-03T23:03:13.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:03:13.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:03:13.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:03:13.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:03:13.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:03:13.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:03:13.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:03:12, diff=1.596672s, valid=True
2026-06-03T23:03:13.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:03:13.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:03:13.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:03:13.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94790.597467s, valid=True
2026-06-03T23:03:13.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:03:13.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:03:13.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:03:13.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:03:13.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:03:13.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:03:13.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:03:13.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:03:13.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:03:13.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:03:13.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:03:13.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:03:13.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:03:13.992 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:03:14.197 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:03:14.537 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:03:14.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:03:14.639 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:03:14.639 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:03:14.828 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:03:14.828 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:03:44.839 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:03:44.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:03:44.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:03:45.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:03:45.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:03:45.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:03:45.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:03:45.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:03:45.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:03:45.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:03:45.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:03:45.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:03:45.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:03:48.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:03:48.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:03:48.061 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:03:48.062 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:03:48.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:03:48.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:03:48.085 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:03:48.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:03:48.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:03:48.086 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:03:48.086 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:03:48.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:03:48.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:03:48.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:03:48.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:03:48.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:03:48.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:03:48.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:03:48.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:03:48.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:03:48.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:03:48.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:03:48.384 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:03:48.452 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:03:39
2026-06-03T23:03:48.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87283, datetime.datetime(2026, 6, 3, 23, 3, 39), datetime.datetime(2026, 6, 3, 23, 3, 38), 'salt', 1.96, 100.1, None, 40.4, 117.12, -0.02, 822.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:03:48.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:03:48.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:03:48.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:03:38, diff=10.45966s, valid=True
2026-06-03T23:03:48.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:03:48.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:03:48.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:04:12, diff=-23.537057s, valid=True
2026-06-03T23:03:48.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:03:48.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:03:48.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:03:37, diff=11.47051s, valid=True
2026-06-03T23:03:48.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:03:48.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:03:48.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:03:48.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:03:48.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:03:48.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:03:48.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:04:12, diff=-23.525987s, valid=True
2026-06-03T23:03:48.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:03:48.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:03:48.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:03:48.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94825.474795s, valid=True
2026-06-03T23:03:48.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:03:48.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:03:48.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:03:48.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:03:48.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:03:48.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:03:48.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:03:48.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:03:48.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:03:48.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:03:48.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:03:48.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:03:48.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:03:48.794 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:03:48.999 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:03:49.340 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:03:49.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:03:49.443 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:03:49.443 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:03:49.626 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:03:49.626 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:04:19.635 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:04:19.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:04:19.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:04:19.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:04:19.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:04:20.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:04:20.169 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:04:20.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:04:20.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:04:20.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:04:20.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:04:20.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:04:20.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:04:22.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:04:22.893 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:04:22.894 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:04:22.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:04:22.905 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:04:22.918 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:04:22.918 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:04:22.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:04:22.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:04:22.920 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:04:22.920 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:04:22.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:04:23.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:04:23.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:04:23.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:04:23.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:04:23.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:04:23.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:04:23.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:04:23.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:04:23.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:04:23.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:04:23.246 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:04:23.315 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:04:09
2026-06-03T23:04:23.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87284, datetime.datetime(2026, 6, 3, 23, 4, 9), datetime.datetime(2026, 6, 3, 23, 4, 8), 'salt', 1.99, 100.17, None, 36.55, 118.96, -0.03, 822.19, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:04:23.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:04:23.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:04:23.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:04:08, diff=15.322543s, valid=True
2026-06-03T23:04:23.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:04:23.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:04:23.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:04:12, diff=11.326013s, valid=True
2026-06-03T23:04:23.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:04:23.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:04:23.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:04:08, diff=15.334149s, valid=True
2026-06-03T23:04:23.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:04:23.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:04:23.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:04:23.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:04:23.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:04:23.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:04:23.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:04:12, diff=11.337861s, valid=True
2026-06-03T23:04:23.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:04:23.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:04:23.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:04:23.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94860.338676s, valid=True
2026-06-03T23:04:23.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:04:23.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:04:23.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:04:23.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:04:23.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:04:23.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:04:23.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:04:23.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:04:23.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:04:23.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:04:23.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:04:23.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:04:23.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:04:23.726 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:04:23.930 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:04:24.270 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:04:24.375 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:04:24.375 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:04:24.375 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:04:24.637 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:04:24.638 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:04:54.668 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:04:54.668 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:04:54.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:04:55.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:04:55.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:04:55.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:04:55.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:04:55.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:04:55.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:04:55.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:04:55.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:04:55.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:04:55.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:04:57.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:04:57.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:04:57.991 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:04:57.992 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:04:58.002 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:04:58.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:04:58.016 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:04:58.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:04:58.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:04:58.017 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:04:58.017 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:04:58.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:04:58.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:04:58.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:04:58.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:04:58.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:04:58.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:04:58.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:04:58.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:04:58.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:04:58.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:04:58.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:04:58.352 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:04:58.421 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:04:39
2026-06-03T23:04:58.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87285, datetime.datetime(2026, 6, 3, 23, 4, 39), datetime.datetime(2026, 6, 3, 23, 4, 39), 'salt', 1.99, 100.1, None, 38.56, 121.45, -0.02, 822.31, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:04:58.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:04:58.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:04:58.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:04:39, diff=19.428535s, valid=True
2026-06-03T23:04:58.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:04:58.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:04:58.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:05:12, diff=-13.567937s, valid=True
2026-06-03T23:04:58.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:04:58.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:04:58.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:04:39, diff=19.440166s, valid=True
2026-06-03T23:04:58.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:04:58.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:04:58.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:04:58.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:04:58.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:04:58.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:04:58.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:05:12, diff=-13.556056s, valid=True
2026-06-03T23:04:58.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:04:58.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:04:58.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:04:58.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94895.444774s, valid=True
2026-06-03T23:04:58.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:04:58.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:04:58.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:04:58.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:04:58.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:04:58.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:04:58.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:04:58.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:04:58.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:04:58.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:04:58.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:04:58.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:04:58.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:04:58.765 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:04:58.971 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:04:59.313 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:04:59.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:04:59.415 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:04:59.415 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:04:59.595 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:04:59.595 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:05:29.625 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:05:29.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:05:29.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:05:29.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:05:29.806 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:05:30.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:05:30.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:05:30.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:05:30.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:05:30.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:05:30.081 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:05:30.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:05:30.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:05:32.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:05:32.792 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:05:32.793 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:05:32.793 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:05:32.803 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:05:32.816 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:05:32.817 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:05:32.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:05:32.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:05:32.818 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:05:32.818 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:05:32.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:05:32.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:05:32.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:05:33.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:05:33.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:05:33.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:05:33.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:05:33.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:05:33.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:05:33.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:05:33.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:05:33.159 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:05:33.231 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:05:10
2026-06-03T23:05:33.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87286, datetime.datetime(2026, 6, 3, 23, 5, 10), datetime.datetime(2026, 6, 3, 23, 5, 9), 'salt', 2.03, 100.14, None, 34.97, 129.86, -0.02, 822.31, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:05:33.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:05:33.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:05:33.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:05:09, diff=24.238851s, valid=True
2026-06-03T23:05:33.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:05:33.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:05:33.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:05:12, diff=21.242318s, valid=True
2026-06-03T23:05:33.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:05:33.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:05:33.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:05:08, diff=25.250525s, valid=True
2026-06-03T23:05:33.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:05:33.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:05:33.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:05:33.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:05:33.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:05:33.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:05:33.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:05:12, diff=21.254273s, valid=True
2026-06-03T23:05:33.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:05:33.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:05:33.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:05:33.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94930.255081s, valid=True
2026-06-03T23:05:33.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:05:33.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:05:33.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:05:33.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:05:33.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:05:33.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:05:33.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:05:33.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:05:33.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:05:33.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:05:33.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:05:33.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:05:33.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:05:33.645 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:05:33.850 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:05:34.191 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:05:34.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:05:34.294 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:05:34.294 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:05:34.524 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:05:34.524 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:06:04.541 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:06:04.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:06:04.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:06:04.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:06:04.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:06:05.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:06:05.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:06:05.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:06:05.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:06:05.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:06:05.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:06:05.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:06:05.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:06:07.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:06:07.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:06:07.895 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:06:07.895 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:06:07.905 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:06:07.921 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:06:07.921 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:06:07.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:06:07.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:06:07.923 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:06:07.923 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:06:07.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:06:08.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:06:08.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:06:08.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:06:08.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:06:08.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:06:08.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:06:08.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:06:08.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:06:08.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:06:08.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:06:08.270 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:06:08.346 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:05:40
2026-06-03T23:06:08.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87287, datetime.datetime(2026, 6, 3, 23, 5, 40), datetime.datetime(2026, 6, 3, 23, 5, 39), 'salt', 1.96, 100.0, None, 51.76, 120.27, 0.0, 822.07, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:06:08.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:06:08.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:06:08.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:05:39, diff=29.35425s, valid=True
2026-06-03T23:06:08.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:06:08.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:06:08.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:06:12, diff=-3.642249s, valid=True
2026-06-03T23:06:08.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:06:08.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:06:08.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:05:38, diff=30.365896s, valid=True
2026-06-03T23:06:08.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:06:08.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:06:08.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:06:08.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:06:08.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:06:08.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:06:08.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:06:12, diff=-3.630372s, valid=True
2026-06-03T23:06:08.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:06:08.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:06:08.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:06:08.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=94965.370426s, valid=True
2026-06-03T23:06:08.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:06:08.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:06:08.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:06:08.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:06:08.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:06:08.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:06:08.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:06:08.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:06:08.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:06:08.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:06:08.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:06:08.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:06:08.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:06:08.691 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:06:08.896 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:06:09.236 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:06:09.340 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:06:09.340 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:06:09.340 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:06:09.516 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:06:09.516 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:06:39.546 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:06:39.546 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:06:39.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:06:39.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:06:39.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:06:40.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:06:40.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:06:40.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:06:40.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:06:40.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:06:40.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:06:40.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:06:40.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:06:42.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:06:42.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:06:42.907 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:06:42.907 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:06:42.917 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:06:42.930 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:06:42.931 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:06:42.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:06:42.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:06:42.932 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:06:42.932 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:06:42.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:06:43.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-03T23:06:43.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:06:43.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-03T23:06:43.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:06:43.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T23:06:43.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:06:43.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T23:06:43.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:06:43.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:06:43.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:06:43.282 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:06:43.355 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:06:40
2026-06-03T23:06:43.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87289, datetime.datetime(2026, 6, 3, 23, 6, 40), datetime.datetime(2026, 6, 3, 23, 6, 39), 'salt', 1.99, 100.17, None, 53.38, 121.8, -0.03, 822.07, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:06:43.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:06:43.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-03T23:06:43.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:06:39, diff=4.362363s, valid=True
2026-06-03T23:06:43.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:06:43.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T23:06:43.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:07:12, diff=-28.634104s, valid=True
2026-06-03T23:06:43.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:06:43.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-03T23:06:43.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:06:39, diff=4.373994s, valid=True
2026-06-03T23:06:43.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:06:43.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:06:43.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:06:43.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:06:43.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:06:43.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T23:06:43.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:07:12, diff=-28.622309s, valid=True
2026-06-03T23:06:43.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:06:43.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:06:43.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:06:43.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95000.378486s, valid=True
2026-06-03T23:06:43.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:06:43.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:06:43.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:06:43.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:06:43.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:06:43.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:06:43.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:06:43.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:06:43.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:06:43.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:06:43.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:06:43.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:06:43.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:06:43.698 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:06:43.903 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:06:44.245 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:06:44.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:06:44.347 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:06:44.347 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:06:44.525 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:06:44.525 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:07:14.526 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:07:14.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:07:14.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:07:14.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:07:14.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:07:15.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:07:15.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:07:15.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:07:15.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:07:15.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:07:15.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:07:15.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:07:15.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:07:17.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:07:17.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:07:17.795 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:07:17.796 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:07:17.806 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:07:17.819 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:07:17.820 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:07:17.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:07:17.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:07:17.821 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:07:17.821 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:07:17.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:07:17.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:07:17.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:07:18.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:07:18.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:07:18.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:07:18.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:07:18.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:07:18.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:07:18.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:07:18.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:07:18.164 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:07:18.239 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:07:11
2026-06-03T23:07:18.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87290, datetime.datetime(2026, 6, 3, 23, 7, 11), datetime.datetime(2026, 6, 3, 23, 7, 10), 'salt', 1.93, 100.17, None, 45.06, 117.24, -0.02, 822.13, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:07:18.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:07:18.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:07:18.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:07:10, diff=8.247344s, valid=True
2026-06-03T23:07:18.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:07:18.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:07:18.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:07:12, diff=6.250878s, valid=True
2026-06-03T23:07:18.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:07:18.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:07:18.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:07:09, diff=9.259088s, valid=True
2026-06-03T23:07:18.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:07:18.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:07:18.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:07:18.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:07:18.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:07:18.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:07:18.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:07:12, diff=6.262897s, valid=True
2026-06-03T23:07:18.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:07:18.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:07:18.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:07:18.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95035.263726s, valid=True
2026-06-03T23:07:18.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:07:18.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:07:18.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:07:18.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:07:18.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:07:18.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:07:18.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:07:18.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:07:18.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:07:18.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:07:18.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:07:18.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:07:18.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:07:18.584 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:07:18.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:07:19.192 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:07:19.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:07:19.294 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:07:19.294 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:07:19.977 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:07:19.978 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:07:50.007 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:07:50.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:07:50.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:07:50.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:07:50.310 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:07:50.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:07:50.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:07:50.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:07:50.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:07:50.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:07:50.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:07:50.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:07:50.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:07:53.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:07:53.251 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:07:53.252 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:07:53.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:07:53.262 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:07:53.275 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:07:53.276 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:07:53.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:07:53.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:07:53.277 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:07:53.277 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:07:53.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:07:53.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:07:53.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:07:53.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:07:53.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:07:53.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:07:53.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:07:53.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:07:53.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:07:53.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:07:53.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:07:53.609 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:07:53.679 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:07:41
2026-06-03T23:07:53.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87291, datetime.datetime(2026, 6, 3, 23, 7, 41), datetime.datetime(2026, 6, 3, 23, 7, 40), 'salt', 1.96, 100.2, None, 39.98, 129.6, -0.03, 821.95, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:07:53.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:07:53.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:07:53.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:07:40, diff=13.686467s, valid=True
2026-06-03T23:07:53.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:07:53.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:07:53.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:08:12, diff=-18.310031s, valid=True
2026-06-03T23:07:53.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:07:53.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:07:53.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:07:39, diff=14.698114s, valid=True
2026-06-03T23:07:53.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:07:53.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:07:53.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:07:53.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:07:53.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:07:53.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:07:53.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:08:12, diff=-18.298186s, valid=True
2026-06-03T23:07:53.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:07:53.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:07:53.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:07:53.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95070.702594s, valid=True
2026-06-03T23:07:53.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:07:53.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:07:53.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:07:53.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:07:53.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:07:53.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:07:53.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:07:53.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:07:53.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:07:53.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:07:53.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:07:53.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:07:53.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:07:54.027 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:07:54.238 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:07:54.584 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:07:54.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:07:54.689 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:07:54.689 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:07:54.843 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:07:54.843 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:08:24.844 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:08:24.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:08:24.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:08:24.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:08:25.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:08:25.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:08:25.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:08:25.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:08:25.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:08:25.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:08:25.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:08:25.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:08:25.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:08:27.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:08:27.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:08:27.944 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:08:27.944 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:08:27.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:08:27.969 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:08:27.969 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:08:27.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:08:27.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:08:27.971 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:08:27.971 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:08:27.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:08:28.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:08:28.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:08:28.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:08:28.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:08:28.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:08:28.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:08:28.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:08:28.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:08:28.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:08:28.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:08:28.322 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:08:28.396 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:08:11
2026-06-03T23:08:28.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87292, datetime.datetime(2026, 6, 3, 23, 8, 11), datetime.datetime(2026, 6, 3, 23, 8, 10), 'salt', 1.96, 100.1, None, 42.9, 124.81, -0.02, 822.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:08:28.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:08:28.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:08:28.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:08:10, diff=18.404262s, valid=True
2026-06-03T23:08:28.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:08:28.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:08:28.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:08:12, diff=16.40775s, valid=True
2026-06-03T23:08:28.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:08:28.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:08:28.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:08:10, diff=18.415945s, valid=True
2026-06-03T23:08:28.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:08:28.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:08:28.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:08:28.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:08:28.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:08:28.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:08:28.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:08:12, diff=16.419679s, valid=True
2026-06-03T23:08:28.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:08:28.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:08:28.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:08:28.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95105.420472s, valid=True
2026-06-03T23:08:28.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:08:28.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:08:28.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:08:28.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:08:28.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:08:28.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:08:28.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:08:28.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:08:28.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:08:28.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:08:28.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:08:28.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:08:28.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:08:28.817 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:08:29.022 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:08:29.363 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:08:29.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:08:29.466 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:08:29.466 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:08:29.654 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:08:29.654 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:08:59.685 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:08:59.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:08:59.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:08:59.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:08:59.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:09:00.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:09:00.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:09:00.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:09:00.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:09:00.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:09:00.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:09:00.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:09:00.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:09:02.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:09:02.778 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:09:02.779 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:09:02.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:09:02.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:09:02.803 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:09:02.804 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:09:02.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:09:02.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:09:02.805 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:09:02.805 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:09:02.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:09:02.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:09:02.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:09:03.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:09:03.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:09:03.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:09:03.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:09:03.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:09:03.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:09:03.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:09:03.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:09:03.148 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:09:03.223 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:08:41
2026-06-03T23:09:03.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87293, datetime.datetime(2026, 6, 3, 23, 8, 41), datetime.datetime(2026, 6, 3, 23, 8, 41), 'salt', 1.86, 100.04, None, 50.31, 115.15, -0.01, 821.95, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:09:03.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:09:03.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:09:03.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:08:41, diff=22.231054s, valid=True
2026-06-03T23:09:03.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:09:03.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:09:03.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:09:12, diff=-8.765454s, valid=True
2026-06-03T23:09:03.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:09:03.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:09:03.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:08:40, diff=23.242752s, valid=True
2026-06-03T23:09:03.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:09:03.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:09:03.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:09:03.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:09:03.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:09:03.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:09:03.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:09:12, diff=-8.753468s, valid=True
2026-06-03T23:09:03.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:09:03.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:09:03.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:09:03.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95140.24735s, valid=True
2026-06-03T23:09:03.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:09:03.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:09:03.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:09:03.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:09:03.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:09:03.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:09:03.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:09:03.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:09:03.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:09:03.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:09:03.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:09:03.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:09:03.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:09:03.572 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:09:03.777 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:09:04.120 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:09:04.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:09:04.223 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:09:04.223 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:09:04.408 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:09:04.408 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:09:34.438 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:09:34.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:09:34.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:09:34.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:09:34.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:09:34.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:09:34.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:09:34.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:09:34.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:09:34.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:09:34.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:09:34.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:09:34.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:09:37.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:09:37.579 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:09:37.580 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:09:37.580 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:09:37.591 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:09:37.603 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:09:37.603 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:09:37.604 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:09:37.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:09:37.604 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:09:37.604 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:09:37.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:09:37.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:09:37.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:09:37.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:09:37.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:09:37.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:09:37.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:09:37.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:09:37.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:09:37.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:09:37.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:09:37.890 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:09:37.963 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:09:12
2026-06-03T23:09:37.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87294, datetime.datetime(2026, 6, 3, 23, 9, 12), datetime.datetime(2026, 6, 3, 23, 9, 11), 'salt', 1.93, 100.07, None, 50.42, 119.94, -0.01, 822.19, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:09:37.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:09:37.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:09:37.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:09:11, diff=26.969841s, valid=True
2026-06-03T23:09:37.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:09:37.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:09:37.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:09:12, diff=25.972685s, valid=True
2026-06-03T23:09:37.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:09:37.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:09:37.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:09:10, diff=27.979298s, valid=True
2026-06-03T23:09:37.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:09:37.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:09:37.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:09:37.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:09:37.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:09:37.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:09:37.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:09:12, diff=25.982338s, valid=True
2026-06-03T23:09:37.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:09:37.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:09:37.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:09:37.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95174.983023s, valid=True
2026-06-03T23:09:37.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:09:37.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:09:37.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:09:37.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:09:37.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:09:38.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:09:38.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:09:38.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:09:38.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:09:38.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:09:38.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:09:38.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:09:38.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:09:38.397 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:09:38.605 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:09:38.951 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:09:39.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:09:39.056 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:09:39.056 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:09:39.323 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:09:39.323 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:10:09.353 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:10:09.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:10:09.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:10:09.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:10:09.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:10:10.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:10:10.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:10:10.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:10:10.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:10:10.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:10:10.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:10:10.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:10:10.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:10:12.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:10:12.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:10:12.817 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:10:12.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:10:12.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:10:12.842 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:10:12.843 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:10:12.843 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:10:12.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:10:12.844 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:10:12.844 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:10:12.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:10:12.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-03T23:10:12.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:10:13.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-03T23:10:13.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:10:13.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:10:13.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:10:13.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:10:13.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:10:13.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:10:13.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:10:13.195 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:10:13.266 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:10:12
2026-06-03T23:10:13.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87296, datetime.datetime(2026, 6, 3, 23, 10, 12), datetime.datetime(2026, 6, 3, 23, 10, 11), 'salt', 1.96, 100.17, None, 41.99, 124.52, -0.03, 822.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:10:13.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:10:13.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-03T23:10:13.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:10:11, diff=2.273762s, valid=True
2026-06-03T23:10:13.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:10:13.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:10:13.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:10:12, diff=1.277279s, valid=True
2026-06-03T23:10:13.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:10:13.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-03T23:10:13.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:10:11, diff=2.285537s, valid=True
2026-06-03T23:10:13.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:10:13.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:10:13.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:10:13.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:10:13.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:10:13.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:10:13.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:10:12, diff=1.28928s, valid=True
2026-06-03T23:10:13.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:10:13.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:10:13.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:10:13.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95210.29009s, valid=True
2026-06-03T23:10:13.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:10:13.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:10:13.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:10:13.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:10:13.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:10:13.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:10:13.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:10:13.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:10:13.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:10:13.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:10:13.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:10:13.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:10:13.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:10:13.629 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:10:13.840 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:10:14.189 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:10:14.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:10:14.294 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:10:14.294 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:10:14.643 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:10:14.643 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:10:44.655 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:10:44.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:10:44.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:10:44.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:10:45.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:10:45.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:10:45.230 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:10:45.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:10:45.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:10:45.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:10:45.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:10:45.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:10:45.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:10:47.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:10:47.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:10:47.924 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:10:47.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:10:47.934 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:10:47.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:10:47.947 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:10:47.948 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:10:47.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:10:47.948 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:10:47.949 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:10:47.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:10:48.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-03T23:10:48.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:10:48.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-03T23:10:48.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:10:48.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T23:10:48.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:10:48.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T23:10:48.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:10:48.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:10:48.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:10:48.289 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:10:48.360 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:10:42
2026-06-03T23:10:48.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87297, datetime.datetime(2026, 6, 3, 23, 10, 42), datetime.datetime(2026, 6, 3, 23, 10, 42), 'salt', 1.93, 100.1, None, 55.29, 129.62, -0.01, 821.7, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:10:48.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:10:48.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-03T23:10:48.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:10:42, diff=6.367978s, valid=True
2026-06-03T23:10:48.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:10:48.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T23:10:48.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:11:12, diff=-23.628625s, valid=True
2026-06-03T23:10:48.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:10:48.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-03T23:10:48.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:10:41, diff=7.379456s, valid=True
2026-06-03T23:10:48.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:10:48.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:10:48.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:10:48.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:10:48.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:10:48.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T23:10:48.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:11:12, diff=-23.616935s, valid=True
2026-06-03T23:10:48.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:10:48.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:10:48.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:10:48.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95245.383854s, valid=True
2026-06-03T23:10:48.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:10:48.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:10:48.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:10:48.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:10:48.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:10:48.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:10:48.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:10:48.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:10:48.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:10:48.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:10:48.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:10:48.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:10:48.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:10:48.776 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:10:48.982 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:10:49.325 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:10:49.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:10:49.428 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:10:49.428 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:10:49.630 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:10:49.630 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:11:19.632 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:11:19.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:11:19.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:11:19.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:11:19.939 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:11:20.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:11:20.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:11:20.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:11:20.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:11:20.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:11:20.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:11:20.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:11:20.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:11:23.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:11:23.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:11:23.361 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:11:23.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:11:23.371 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:11:23.384 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:11:23.384 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:11:23.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:11:23.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:11:23.386 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:11:23.386 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:11:23.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:11:23.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:11:23.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:11:23.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:11:23.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:11:23.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:11:23.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:11:23.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:11:23.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:11:23.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:11:23.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:11:23.755 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:11:23.853 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:11:13
2026-06-03T23:11:23.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87298, datetime.datetime(2026, 6, 3, 23, 11, 13), datetime.datetime(2026, 6, 3, 23, 11, 12), 'salt', 1.89, 100.2, None, 48.05, 122.46, -0.03, 822.01, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:11:23.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:11:23.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:11:23.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:11:12, diff=11.861118s, valid=True
2026-06-03T23:11:23.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:11:23.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:11:23.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:11:12, diff=11.864806s, valid=True
2026-06-03T23:11:23.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:11:23.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:11:23.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:11:11, diff=12.87328s, valid=True
2026-06-03T23:11:23.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:11:23.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:11:23.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:11:23.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:11:23.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:11:23.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:11:23.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:11:12, diff=11.877259s, valid=True
2026-06-03T23:11:23.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:11:23.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:11:23.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:11:23.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95280.878136s, valid=True
2026-06-03T23:11:23.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:11:23.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:11:23.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:11:23.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:11:23.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:11:23.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:11:23.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:11:23.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:11:23.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:11:24.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:11:24.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:11:24.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:11:24.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:11:24.201 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:11:24.409 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:11:24.756 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:11:24.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:11:24.858 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:11:24.858 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:11:25.109 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:11:25.110 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:11:55.125 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:11:55.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:11:55.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:11:55.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:11:55.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:11:55.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:11:55.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:11:55.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:11:55.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:11:55.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:11:55.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:11:55.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:11:55.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:11:58.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:11:58.703 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:11:58.704 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:11:58.704 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:11:58.716 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:11:58.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:11:58.729 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:11:58.729 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:11:58.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:11:58.730 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:11:58.730 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:11:58.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:11:58.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:11:58.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:11:58.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:11:58.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:11:59.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:11:59.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:11:59.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:11:59.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:11:59.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:11:59.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:11:59.079 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:11:59.150 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:11:43
2026-06-03T23:11:59.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87299, datetime.datetime(2026, 6, 3, 23, 11, 43), datetime.datetime(2026, 6, 3, 23, 11, 42), 'salt', 1.86, 100.0, None, 51.72, 125.93, 0.0, 821.82, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:11:59.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:11:59.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:11:59.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:11:42, diff=17.157529s, valid=True
2026-06-03T23:11:59.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:11:59.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:11:59.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:12:12, diff=-12.838972s, valid=True
2026-06-03T23:11:59.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:11:59.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:11:59.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:11:42, diff=17.169225s, valid=True
2026-06-03T23:11:59.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:11:59.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:11:59.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:11:59.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:11:59.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:11:59.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:11:59.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:12:12, diff=-12.827076s, valid=True
2026-06-03T23:11:59.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:11:59.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:11:59.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:11:59.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95316.173724s, valid=True
2026-06-03T23:11:59.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:11:59.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:11:59.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:11:59.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:11:59.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:11:59.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:11:59.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:11:59.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:11:59.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:11:59.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:11:59.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:11:59.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:11:59.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:11:59.492 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:11:59.697 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:12:00.050 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:12:00.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:12:00.156 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:12:00.156 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:12:01.600 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:12:01.600 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:12:31.629 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:12:31.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:12:31.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:12:31.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:12:32.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:12:32.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:12:32.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:12:32.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:12:32.268 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:12:32.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:12:32.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:12:32.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:12:32.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:12:34.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:12:34.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:12:34.943 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:12:34.943 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:12:34.953 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:12:34.967 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:12:34.967 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:12:34.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:12:34.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:12:34.969 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:12:34.969 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:12:34.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:12:35.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:12:35.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:12:35.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:12:35.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:12:35.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:12:35.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:12:35.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:12:35.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:12:35.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:12:35.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:12:35.330 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:12:35.405 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:12:13
2026-06-03T23:12:35.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87300, datetime.datetime(2026, 6, 3, 23, 12, 13), datetime.datetime(2026, 6, 3, 23, 12, 12), 'salt', 1.89, 100.1, None, 44.21, 123.14, -0.02, 822.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:12:35.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:12:35.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:12:35.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:12:12, diff=23.413214s, valid=True
2026-06-03T23:12:35.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:12:35.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:12:35.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:12:12, diff=23.416726s, valid=True
2026-06-03T23:12:35.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:12:35.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:12:35.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:12:12, diff=23.424903s, valid=True
2026-06-03T23:12:35.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:12:35.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:12:35.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:12:35.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:12:35.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:12:35.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:12:35.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:12:12, diff=23.428655s, valid=True
2026-06-03T23:12:35.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:12:35.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:12:35.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:12:35.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95352.42946s, valid=True
2026-06-03T23:12:35.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:12:35.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:12:35.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:12:35.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:12:35.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:12:35.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:12:35.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:12:35.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:12:35.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:12:35.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:12:35.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:12:35.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:12:35.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:12:35.751 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:12:36.019 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:12:36.363 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:12:36.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:12:36.467 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:12:36.467 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:12:36.619 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:12:36.619 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:13:06.630 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:13:06.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:13:06.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:13:06.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:13:06.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:13:07.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:13:07.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:13:07.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:13:07.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:13:07.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:13:07.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:13:07.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:13:07.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:13:09.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:13:09.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:13:09.837 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:13:09.837 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:13:09.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:13:09.858 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:13:09.858 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:13:09.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:13:09.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:13:09.859 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:13:09.859 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:13:09.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:13:09.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:13:09.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:13:10.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:13:10.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:13:10.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:13:10.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:13:10.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:13:10.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:13:10.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:13:10.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:13:10.178 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:13:10.253 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:12:44
2026-06-03T23:13:10.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87301, datetime.datetime(2026, 6, 3, 23, 12, 44), datetime.datetime(2026, 6, 3, 23, 12, 43), 'salt', 1.89, 100.17, None, 45.23, 126.26, -0.03, 822.01, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:13:10.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:13:10.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:13:10.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:12:43, diff=27.26019s, valid=True
2026-06-03T23:13:10.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:13:10.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:13:10.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:13:12, diff=-1.736622s, valid=True
2026-06-03T23:13:10.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:13:10.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:13:10.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:12:42, diff=28.270895s, valid=True
2026-06-03T23:13:10.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:13:10.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:13:10.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:13:10.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:13:10.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:13:10.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:13:10.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:13:12, diff=-1.725727s, valid=True
2026-06-03T23:13:10.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:13:10.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:13:10.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:13:10.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95387.275029s, valid=True
2026-06-03T23:13:10.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:13:10.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:13:10.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:13:10.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:13:10.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:13:10.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:13:10.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:13:10.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:13:10.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:13:10.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:13:10.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:13:10.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:13:10.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:13:10.593 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:13:10.800 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:13:11.140 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:13:11.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:13:11.244 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:13:11.244 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:13:11.394 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:13:11.395 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:13:41.413 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:13:41.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:13:41.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:13:41.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:13:41.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:13:41.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:13:41.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:13:42.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:13:42.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:13:42.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:13:42.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:13:42.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:13:42.034 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:13:44.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:13:44.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:13:44.805 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:13:44.805 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:13:44.814 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:13:44.827 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:13:44.827 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:13:44.828 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:13:44.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:13:44.829 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:13:44.829 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:13:44.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:13:44.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-03T23:13:44.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:13:45.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-03T23:13:45.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:13:45.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T23:13:45.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:13:45.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T23:13:45.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:13:45.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:13:45.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:13:45.203 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:13:45.279 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:13:44
2026-06-03T23:13:45.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87303, datetime.datetime(2026, 6, 3, 23, 13, 44), datetime.datetime(2026, 6, 3, 23, 13, 43), 'salt', 1.99, 100.2, None, 38.56, 109.07, -0.03, 822.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:13:45.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:13:45.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-03T23:13:45.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:13:43, diff=2.287579s, valid=True
2026-06-03T23:13:45.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:13:45.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T23:13:45.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:14:12, diff=-26.708205s, valid=True
2026-06-03T23:13:45.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:13:45.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-03T23:13:45.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:13:43, diff=2.300958s, valid=True
2026-06-03T23:13:45.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:13:45.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:13:45.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:13:45.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:13:45.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:13:45.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T23:13:45.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:14:12, diff=-26.694542s, valid=True
2026-06-03T23:13:45.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:13:45.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:13:45.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:13:45.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95422.30637s, valid=True
2026-06-03T23:13:45.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:13:45.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:13:45.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:13:45.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:13:45.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:13:45.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:13:45.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:13:45.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:13:45.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:13:45.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:13:45.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:13:45.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:13:45.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:13:45.702 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:13:45.925 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:13:46.269 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:13:46.372 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:13:46.373 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:13:46.373 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:13:46.531 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:13:46.532 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:14:16.550 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:14:16.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:14:16.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:14:16.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:14:16.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:14:17.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:14:17.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:14:17.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:14:17.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:14:17.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:14:17.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:14:17.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:14:17.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:14:19.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:14:19.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:14:19.937 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:14:19.937 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:14:19.946 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:14:19.958 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:14:19.958 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:14:19.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:14:19.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:14:19.959 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:14:19.959 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:14:19.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:14:20.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-03T23:14:20.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:14:20.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-03T23:14:20.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:14:20.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:14:20.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:14:20.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:14:20.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:14:20.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:14:20.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:14:20.285 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:14:20.360 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:14:14
2026-06-03T23:14:20.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87304, datetime.datetime(2026, 6, 3, 23, 14, 14), datetime.datetime(2026, 6, 3, 23, 14, 14), 'salt', 1.96, 100.1, None, 48.34, 127.01, -0.02, 822.01, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:14:20.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:14:20.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-03T23:14:20.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:14:14, diff=6.367758s, valid=True
2026-06-03T23:14:20.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:14:20.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:14:20.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:14:12, diff=8.371089s, valid=True
2026-06-03T23:14:20.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:14:20.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-03T23:14:20.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:14:13, diff=7.378883s, valid=True
2026-06-03T23:14:20.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:14:20.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:14:20.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:14:20.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:14:20.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:14:20.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:14:20.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:14:12, diff=8.382408s, valid=True
2026-06-03T23:14:20.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:14:20.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:14:20.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:14:20.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95457.383203s, valid=True
2026-06-03T23:14:20.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:14:20.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:14:20.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:14:20.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:14:20.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:14:20.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:14:20.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:14:20.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:14:20.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:14:20.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:14:20.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:14:20.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:14:20.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:14:20.705 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:14:20.914 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:14:21.260 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:14:21.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:14:21.365 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:14:21.365 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:14:21.443 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:14:21.443 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:14:51.473 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:14:51.473 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:14:51.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:14:51.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:14:51.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:14:51.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:14:51.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:14:51.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:14:51.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:14:51.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:14:51.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:14:51.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:14:51.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:14:54.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:14:54.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:14:54.617 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:14:54.618 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:14:54.627 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:14:54.640 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:14:54.640 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:14:54.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:14:54.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:14:54.641 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:14:54.642 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:14:54.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:14:54.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:14:54.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:14:54.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:14:54.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:14:54.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:14:54.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:14:54.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:14:54.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:14:54.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:14:54.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:14:54.991 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:14:55.062 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:14:45
2026-06-03T23:14:55.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87305, datetime.datetime(2026, 6, 3, 23, 14, 45), datetime.datetime(2026, 6, 3, 23, 14, 44), 'salt', 1.89, 100.07, None, 48.27, 123.65, -0.02, 822.07, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:14:55.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:14:55.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:14:55.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:14:44, diff=11.070048s, valid=True
2026-06-03T23:14:55.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:14:55.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:14:55.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:15:12, diff=-16.926457s, valid=True
2026-06-03T23:14:55.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:14:55.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:14:55.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:14:43, diff=12.081603s, valid=True
2026-06-03T23:14:55.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:14:55.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:14:55.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:14:55.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:14:55.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:14:55.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:14:55.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:15:12, diff=-16.914569s, valid=True
2026-06-03T23:14:55.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:14:55.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:14:55.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:14:55.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95492.086262s, valid=True
2026-06-03T23:14:55.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:14:55.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:14:55.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:14:55.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:14:55.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:14:55.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:14:55.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:14:55.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:14:55.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:14:55.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:14:55.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:14:55.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:14:55.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:14:55.476 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:14:55.681 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:14:56.025 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:14:56.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:14:56.127 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:14:56.127 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:14:56.380 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:14:56.380 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:15:26.396 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:15:26.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:15:26.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:15:26.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:15:26.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:15:26.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:15:26.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:15:26.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:15:26.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:15:26.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:15:26.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:15:26.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:15:26.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:15:29.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:15:29.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:15:29.573 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:15:29.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:15:29.583 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:15:29.596 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:15:29.596 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:15:29.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:15:29.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:15:29.598 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:15:29.598 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:15:29.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:15:29.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:15:29.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:15:29.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:15:29.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:15:29.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:15:29.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:15:29.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:15:29.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:15:29.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:15:29.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:15:29.941 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:15:30.011 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:15:15
2026-06-03T23:15:30.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87306, datetime.datetime(2026, 6, 3, 23, 15, 15), datetime.datetime(2026, 6, 3, 23, 15, 14), 'salt', 1.93, 100.14, None, 49.43, 125.42, -0.02, 821.88, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:15:30.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:15:30.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:15:30.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:15:14, diff=16.022073s, valid=True
2026-06-03T23:15:30.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:15:30.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:15:30.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:15:12, diff=18.025556s, valid=True
2026-06-03T23:15:30.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:15:30.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:15:30.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:15:13, diff=17.032809s, valid=True
2026-06-03T23:15:30.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:15:30.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:15:30.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:15:30.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:15:30.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:15:30.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:15:30.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:15:12, diff=18.036024s, valid=True
2026-06-03T23:15:30.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:15:30.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:15:30.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:15:30.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95527.03671s, valid=True
2026-06-03T23:15:30.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:15:30.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:15:30.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:15:30.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:15:30.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:15:30.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:15:30.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:15:30.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:15:30.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:15:30.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:15:30.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:15:30.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:15:30.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:15:30.399 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:15:30.604 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:15:30.945 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:15:31.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:15:31.047 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:15:31.047 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:15:31.234 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:15:31.234 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:16:01.264 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:16:01.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:16:01.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:16:01.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:16:01.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:16:01.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:16:01.674 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:16:01.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:16:01.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:16:01.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:16:01.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:16:01.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:16:01.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:16:04.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:16:04.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:16:04.271 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:16:04.271 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:16:04.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:16:04.295 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:16:04.296 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:16:04.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:16:04.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:16:04.297 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:16:04.297 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:16:04.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:16:04.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:16:04.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:16:04.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:16:04.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:16:04.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:16:04.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:16:04.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:16:04.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:16:04.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:16:04.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:16:04.627 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:16:04.698 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:15:45
2026-06-03T23:16:04.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87307, datetime.datetime(2026, 6, 3, 23, 15, 45), datetime.datetime(2026, 6, 3, 23, 15, 44), 'salt', 1.93, 100.14, None, 48.97, 133.97, -0.02, 822.01, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:16:04.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:16:04.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:16:04.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:15:44, diff=20.70558s, valid=True
2026-06-03T23:16:04.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:16:04.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:16:04.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:16:12, diff=-7.290901s, valid=True
2026-06-03T23:16:04.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:16:04.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:16:04.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:15:44, diff=20.717357s, valid=True
2026-06-03T23:16:04.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:16:04.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:16:04.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:16:04.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:16:04.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:16:04.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:16:04.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:16:12, diff=-7.278884s, valid=True
2026-06-03T23:16:04.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:16:04.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:16:04.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:16:04.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95561.721942s, valid=True
2026-06-03T23:16:04.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:16:04.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:16:04.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:16:04.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:16:04.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:16:04.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:16:04.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:16:04.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:16:04.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:16:04.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:16:04.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:16:05.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:16:05.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:16:05.112 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:16:05.321 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:16:05.665 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:16:05.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:16:05.769 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:16:05.769 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:16:05.958 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:16:05.958 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:16:35.987 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:16:35.987 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:16:35.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:16:36.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:16:36.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:16:36.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:16:36.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:16:36.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:16:36.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:16:36.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:16:36.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:16:36.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:16:36.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:16:39.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:16:39.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:16:39.017 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:16:39.017 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:16:39.028 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:16:39.040 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:16:39.041 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:16:39.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:16:39.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:16:39.042 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:16:39.042 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:16:39.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:16:39.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:16:39.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:16:39.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:16:39.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:16:39.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:16:39.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:16:39.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:16:39.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:16:39.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:16:39.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:16:39.389 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:16:39.465 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:16:15
2026-06-03T23:16:39.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87308, datetime.datetime(2026, 6, 3, 23, 16, 15), datetime.datetime(2026, 6, 3, 23, 16, 15), 'salt', 1.93, 100.14, None, 51.76, 116.19, -0.02, 822.07, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:16:39.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:16:39.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:16:39.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:16:15, diff=24.473074s, valid=True
2026-06-03T23:16:39.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:16:39.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:16:39.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:16:12, diff=27.476498s, valid=True
2026-06-03T23:16:39.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:16:39.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:16:39.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:16:14, diff=25.484574s, valid=True
2026-06-03T23:16:39.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:16:39.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:16:39.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:16:39.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:16:39.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:16:39.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:16:39.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:16:12, diff=27.48817s, valid=True
2026-06-03T23:16:39.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:16:39.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:16:39.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:16:39.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95596.488963s, valid=True
2026-06-03T23:16:39.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:16:39.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:16:39.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:16:39.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:16:39.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:16:39.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:16:39.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:16:39.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:16:39.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:16:39.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:16:39.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:16:39.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:16:39.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:16:39.808 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:16:40.046 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:16:40.393 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:16:40.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:16:40.495 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:16:40.495 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:16:40.678 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:16:40.678 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:17:10.707 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:17:10.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:17:10.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:17:10.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:17:11.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:17:11.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:17:11.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:17:11.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:17:11.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:17:11.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:17:11.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:17:11.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:17:11.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:17:13.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:17:13.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:17:13.824 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:17:13.824 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:17:13.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:17:13.852 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:17:13.852 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:17:13.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:17:13.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:17:13.853 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:17:13.854 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:17:13.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:17:13.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:17:13.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:17:14.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:17:14.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:17:14.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:17:14.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:17:14.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:17:14.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:17:14.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:17:14.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:17:14.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:17:14.259 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:16:46
2026-06-03T23:17:14.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87309, datetime.datetime(2026, 6, 3, 23, 16, 46), datetime.datetime(2026, 6, 3, 23, 16, 46), 'salt', 1.86, 100.1, None, 46.11, 125.06, -0.02, 822.01, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:17:14.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:17:14.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:17:14.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:16:46, diff=28.266899s, valid=True
2026-06-03T23:17:14.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:17:14.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:17:14.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:17:12, diff=2.27039s, valid=True
2026-06-03T23:17:14.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:17:14.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:17:14.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:16:44, diff=30.278595s, valid=True
2026-06-03T23:17:14.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:17:14.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:17:14.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:17:14.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:17:14.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:17:14.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:17:14.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:17:12, diff=2.282361s, valid=True
2026-06-03T23:17:14.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:17:14.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:17:14.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:17:14.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95631.283178s, valid=True
2026-06-03T23:17:14.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:17:14.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:17:14.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:17:14.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:17:14.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:17:14.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:17:14.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:17:14.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:17:14.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:17:14.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:17:14.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:17:14.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:17:14.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:17:14.610 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:17:14.818 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:17:15.162 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:17:15.266 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:17:15.266 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:17:15.266 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:17:15.452 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:17:15.453 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:17:45.483 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:17:45.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:17:45.483 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:17:45.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:17:45.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:17:46.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:17:46.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:17:46.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:17:46.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:17:46.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:17:46.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:17:46.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:17:46.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:17:48.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:17:48.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:17:48.965 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:17:48.965 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:17:48.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:17:48.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:17:48.986 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:17:48.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:17:48.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:17:48.986 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:17:48.986 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:17:48.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:17:49.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-03T23:17:49.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:17:49.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-03T23:17:49.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:17:49.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T23:17:49.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:17:49.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T23:17:49.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:17:49.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:17:49.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:17:49.276 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:17:49.352 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:17:47
2026-06-03T23:17:49.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87311, datetime.datetime(2026, 6, 3, 23, 17, 47), datetime.datetime(2026, 6, 3, 23, 17, 46), 'salt', 1.89, 100.14, None, 46.22, 126.17, -0.03, 821.95, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:17:49.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:17:49.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-03T23:17:49.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:17:46, diff=3.359349s, valid=True
2026-06-03T23:17:49.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:17:49.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T23:17:49.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:18:12, diff=-22.637356s, valid=True
2026-06-03T23:17:49.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:17:49.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-03T23:17:49.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:17:45, diff=4.370226s, valid=True
2026-06-03T23:17:49.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:17:49.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:17:49.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:17:49.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:17:49.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:17:49.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T23:17:49.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:18:12, diff=-22.626272s, valid=True
2026-06-03T23:17:49.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:17:49.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:17:49.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:17:49.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95666.374477s, valid=True
2026-06-03T23:17:49.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:17:49.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:17:49.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:17:49.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:17:49.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:17:49.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:17:49.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:17:49.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:17:49.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:17:49.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:17:49.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:17:49.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:17:49.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:17:49.695 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:17:49.908 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:17:50.326 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:17:50.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:17:50.429 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:17:50.429 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:17:50.516 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:17:50.516 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:18:20.546 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:18:20.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:18:20.547 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:18:21.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:18:21.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:18:21.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:18:21.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:18:21.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:18:21.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:18:21.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:18:21.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:18:21.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:18:21.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:18:23.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:18:23.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:18:23.815 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:18:23.815 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:18:23.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:18:23.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:18:23.840 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:18:23.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:18:23.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:18:23.841 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:18:23.841 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:18:23.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:18:23.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:18:23.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:18:24.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:18:24.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:18:24.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:18:24.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:18:24.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:18:24.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:18:24.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:18:24.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:18:24.182 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:18:24.263 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:18:17
2026-06-03T23:18:24.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87312, datetime.datetime(2026, 6, 3, 23, 18, 17), datetime.datetime(2026, 6, 3, 23, 18, 16), 'salt', 1.86, 100.0, None, 47.24, 126.8, 0.0, 822.07, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:18:24.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:18:24.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:18:24.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:18:16, diff=8.271073s, valid=True
2026-06-03T23:18:24.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:18:24.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:18:24.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:18:12, diff=12.274538s, valid=True
2026-06-03T23:18:24.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:18:24.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:18:24.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:18:15, diff=9.282576s, valid=True
2026-06-03T23:18:24.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:18:24.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:18:24.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:18:24.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:18:24.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:18:24.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:18:24.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:18:12, diff=12.286322s, valid=True
2026-06-03T23:18:24.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:18:24.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:18:24.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:18:24.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95701.28716s, valid=True
2026-06-03T23:18:24.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:18:24.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:18:24.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:18:24.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:18:24.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:18:24.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:18:24.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:18:24.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:18:24.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:18:24.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:18:24.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:18:24.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:18:24.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:18:24.609 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:18:24.832 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:18:25.172 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:18:25.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:18:25.274 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:18:25.274 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:18:25.362 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:18:25.362 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:18:55.392 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:18:55.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:18:55.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:18:55.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:18:55.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:18:55.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:18:55.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:18:55.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:18:55.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:18:55.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:18:55.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:18:55.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:18:55.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:18:59.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:18:59.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:18:59.478 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:18:59.478 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:18:59.489 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:18:59.509 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:18:59.510 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:18:59.510 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:18:59.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:18:59.511 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:18:59.511 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:18:59.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:18:59.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:18:59.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:18:59.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:18:59.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:18:59.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:18:59.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:18:59.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:18:59.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:18:59.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:18:59.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:18:59.861 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:18:59.940 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:18:47
2026-06-03T23:18:59.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87313, datetime.datetime(2026, 6, 3, 23, 18, 47), datetime.datetime(2026, 6, 3, 23, 18, 47), 'salt', 1.86, 100.07, None, 48.34, 127.91, -0.01, 821.95, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:18:59.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:18:59.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:18:59.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:18:47, diff=12.947632s, valid=True
2026-06-03T23:18:59.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:18:59.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:18:59.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:19:12, diff=-12.049461s, valid=True
2026-06-03T23:18:59.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:18:59.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:18:59.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:18:46, diff=13.957191s, valid=True
2026-06-03T23:18:59.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:18:59.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:18:59.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:18:59.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:18:59.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:18:59.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:18:59.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:19:12, diff=-12.039511s, valid=True
2026-06-03T23:18:59.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:18:59.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:18:59.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:18:59.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95736.961166s, valid=True
2026-06-03T23:18:59.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:18:59.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:18:59.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:18:59.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:18:59.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:19:00.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:19:00.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:19:00.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:19:00.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:19:00.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:19:00.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:19:00.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:19:00.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:19:00.294 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:19:00.576 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:19:00.917 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:19:01.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:19:01.019 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:19:01.019 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:19:01.202 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:19:01.202 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:19:31.232 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:19:31.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:19:31.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:19:31.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:19:31.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:19:31.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:19:31.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:19:31.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:19:31.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:19:31.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:19:31.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:19:31.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:19:31.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:19:34.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:19:34.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:19:34.398 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:19:34.398 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:19:34.408 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:19:34.421 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:19:34.422 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:19:34.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:19:34.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:19:34.423 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:19:34.423 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:19:34.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:19:34.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:19:34.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:19:34.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:19:34.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:19:34.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:19:34.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:19:34.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:19:34.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:19:34.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:19:34.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:19:34.764 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:19:34.838 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:19:18
2026-06-03T23:19:34.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87314, datetime.datetime(2026, 6, 3, 23, 19, 18), datetime.datetime(2026, 6, 3, 23, 19, 17), 'salt', 1.86, 100.17, None, 44.7, 125.93, -0.03, 822.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:19:34.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:19:34.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:19:34.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:19:17, diff=17.845074s, valid=True
2026-06-03T23:19:34.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:19:34.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:19:34.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:19:12, diff=22.847942s, valid=True
2026-06-03T23:19:34.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:19:34.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:19:34.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:19:16, diff=18.854632s, valid=True
2026-06-03T23:19:34.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:19:34.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:19:34.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:19:34.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:19:34.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:19:34.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:19:34.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:19:12, diff=22.857678s, valid=True
2026-06-03T23:19:34.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:19:34.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:19:34.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:19:34.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95771.858331s, valid=True
2026-06-03T23:19:34.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:19:34.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:19:34.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:19:34.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:19:34.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:19:34.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:19:34.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:19:34.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:19:34.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:19:34.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:19:35.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:19:35.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:19:35.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:19:35.172 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:19:35.376 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:19:35.717 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:19:35.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:19:35.819 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:19:35.819 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:19:36.257 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:19:36.304 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:20:06.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:20:06.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:20:06.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:20:06.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:20:06.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:20:06.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:20:06.926 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:20:06.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:20:06.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:20:06.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:20:06.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:20:06.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:20:06.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:20:09.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:20:09.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:20:09.555 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:20:09.555 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:20:09.565 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:20:09.576 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:20:09.577 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:20:09.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:20:09.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:20:09.577 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:20:09.577 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:20:09.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:20:09.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:20:09.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:20:09.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:20:09.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:20:09.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:20:09.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:20:09.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:20:09.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:20:09.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:20:09.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:20:09.853 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:20:09.924 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:19:48
2026-06-03T23:20:09.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87315, datetime.datetime(2026, 6, 3, 23, 19, 48), datetime.datetime(2026, 6, 3, 23, 19, 47), 'salt', 1.93, 100.14, None, 34.58, 119.59, -0.02, 822.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:20:09.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:20:09.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:20:09.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:19:47, diff=22.936821s, valid=True
2026-06-03T23:20:09.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:20:09.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:20:09.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:20:12, diff=-2.057413s, valid=True
2026-06-03T23:20:09.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:20:09.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:20:09.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:19:48, diff=21.953905s, valid=True
2026-06-03T23:20:09.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:20:09.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:20:09.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:20:09.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:20:09.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:20:09.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:20:09.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:20:12, diff=-2.042753s, valid=True
2026-06-03T23:20:09.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:20:09.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:20:09.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:20:09.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95806.957979s, valid=True
2026-06-03T23:20:09.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:20:09.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:20:09.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:20:09.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:20:09.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:20:10.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:20:10.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:20:10.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:20:10.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:20:10.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:20:10.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:20:10.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:20:10.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:20:10.363 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:20:10.589 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:20:10.936 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:20:11.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:20:11.039 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:20:11.039 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:20:11.226 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:20:11.226 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:20:41.246 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:20:41.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:20:41.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:20:41.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:20:41.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:20:41.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:20:41.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:20:42.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:20:42.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:20:42.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:20:42.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:20:42.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:20:42.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:20:45.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:20:45.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:20:45.010 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:20:45.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:20:45.020 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:20:45.032 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:20:45.033 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:20:45.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:20:45.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:20:45.034 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:20:45.035 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:20:45.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:20:45.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:20:45.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:20:45.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:20:45.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:20:45.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:20:45.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:20:45.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:20:45.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:20:45.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:20:45.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:20:45.366 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:20:45.437 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:20:19
2026-06-03T23:20:45.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87316, datetime.datetime(2026, 6, 3, 23, 20, 19), datetime.datetime(2026, 6, 3, 23, 20, 17), 'salt', 1.89, 100.14, None, 41.49, 127.53, -0.03, 822.25, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:20:45.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:20:45.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:20:45.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:20:17, diff=28.444695s, valid=True
2026-06-03T23:20:45.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:20:45.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:20:45.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:20:12, diff=33.448174s, valid=True
2026-06-03T23:20:45.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:20:45.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:20:45.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:20:16, diff=29.456389s, valid=True
2026-06-03T23:20:45.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:20:45.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:20:45.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:20:45.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:20:45.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:20:45.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:20:45.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:20:12, diff=33.460093s, valid=True
2026-06-03T23:20:45.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:20:45.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:20:45.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:20:45.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95842.460895s, valid=True
2026-06-03T23:20:45.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:20:45.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:20:45.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:20:45.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:20:45.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:20:45.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:20:45.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:20:45.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:20:45.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:20:45.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:20:45.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:20:45.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:20:45.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:20:45.785 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:20:45.994 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:20:46.340 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:20:46.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:20:46.444 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:20:46.444 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:20:46.697 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:20:46.697 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:21:16.707 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:21:16.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:21:16.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:21:16.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:21:16.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:21:17.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:21:17.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:21:17.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:21:17.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:21:17.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:21:17.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:21:17.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:21:17.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:21:19.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:21:19.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:21:19.871 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:21:19.871 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:21:19.879 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:21:19.891 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:21:19.892 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:21:19.892 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:21:19.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:21:19.892 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:21:19.892 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:21:19.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:21:19.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-03T23:21:19.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:21:20.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-03T23:21:20.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:21:20.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:21:20.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:21:20.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:21:20.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:21:20.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:21:20.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:21:20.172 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:21:20.243 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:21:20
2026-06-03T23:21:20.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87318, datetime.datetime(2026, 6, 3, 23, 21, 20), datetime.datetime(2026, 6, 3, 23, 21, 19), 'salt', 1.93, 100.14, None, 44.95, 117.57, -0.02, 821.95, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:21:20.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:21:20.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-03T23:21:20.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:21:19, diff=1.249982s, valid=True
2026-06-03T23:21:20.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:21:20.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:21:20.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:21:12, diff=8.252974s, valid=True
2026-06-03T23:21:20.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:21:20.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-03T23:21:20.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:21:17, diff=3.260176s, valid=True
2026-06-03T23:21:20.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:21:20.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:21:20.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:21:20.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:21:20.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:21:20.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:21:20.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:21:12, diff=8.263343s, valid=True
2026-06-03T23:21:20.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:21:20.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:21:20.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:21:20.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95877.264034s, valid=True
2026-06-03T23:21:20.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:21:20.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:21:20.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:21:20.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:21:20.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:21:20.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:21:20.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:21:20.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:21:20.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:21:20.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:21:20.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:21:20.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:21:20.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:21:20.649 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:21:20.854 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:21:21.197 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:21:21.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:21:21.300 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:21:21.300 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:21:21.483 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:21:21.484 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:21:51.495 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:21:51.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:21:51.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:21:51.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:21:51.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:21:51.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:21:51.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:21:52.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:21:52.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:21:52.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:21:52.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:21:52.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:21:52.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:21:55.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:21:55.169 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:21:55.170 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:21:55.170 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:21:55.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:21:55.192 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:21:55.192 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:21:55.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:21:55.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:21:55.193 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:21:55.194 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:21:55.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:21:55.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:21:55.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:21:55.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:21:55.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:21:55.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:21:55.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:21:55.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:21:55.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:21:55.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:21:55.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:21:55.527 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:21:55.596 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:21:50
2026-06-03T23:21:55.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87319, datetime.datetime(2026, 6, 3, 23, 21, 50), datetime.datetime(2026, 6, 3, 23, 21, 49), 'salt', 1.83, 100.17, None, 38.28, 119.59, -0.02, 821.95, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:21:55.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:21:55.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:21:55.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:21:49, diff=6.603626s, valid=True
2026-06-03T23:21:55.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:21:55.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:21:55.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:22:12, diff=-16.393013s, valid=True
2026-06-03T23:21:55.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:21:55.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:21:55.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:21:47, diff=8.614758s, valid=True
2026-06-03T23:21:55.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:21:55.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:21:55.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:21:55.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:21:55.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:21:55.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:21:55.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:22:12, diff=-16.381652s, valid=True
2026-06-03T23:21:55.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:21:55.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:21:55.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:21:55.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95912.619139s, valid=True
2026-06-03T23:21:55.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:21:55.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:21:55.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:21:55.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:21:55.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:21:55.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:21:55.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:21:55.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:21:55.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:21:55.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:21:55.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:21:55.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:21:55.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:21:55.940 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:21:56.148 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:21:56.491 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:21:56.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:21:56.594 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:21:56.594 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:21:56.824 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:21:56.825 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:22:26.845 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:22:26.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:22:26.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:22:27.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:22:27.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:22:27.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:22:27.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:22:27.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:22:27.437 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:22:27.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:22:27.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:22:27.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:22:27.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:22:30.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:22:30.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:22:30.114 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:22:30.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:22:30.124 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:22:30.136 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:22:30.136 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:22:30.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:22:30.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:22:30.137 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:22:30.137 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:22:30.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:22:30.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:22:30.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:22:30.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:22:30.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:22:30.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:22:30.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:22:30.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:22:30.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:22:30.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:22:30.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:22:30.466 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:22:30.537 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:22:20
2026-06-03T23:22:30.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87320, datetime.datetime(2026, 6, 3, 23, 22, 20), datetime.datetime(2026, 6, 3, 23, 22, 20), 'salt', 1.89, 100.17, None, 30.94, 118.23, -0.03, 822.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:22:30.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:22:30.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:22:30.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:22:20, diff=10.544854s, valid=True
2026-06-03T23:22:30.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:22:30.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:22:30.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:22:12, diff=18.548398s, valid=True
2026-06-03T23:22:30.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:22:30.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:22:30.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:22:17, diff=13.55676s, valid=True
2026-06-03T23:22:30.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:22:30.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:22:30.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:22:30.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:22:30.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:22:30.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:22:30.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:22:12, diff=18.560482s, valid=True
2026-06-03T23:22:30.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:22:30.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:22:30.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:22:30.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95947.561317s, valid=True
2026-06-03T23:22:30.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:22:30.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:22:30.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:22:30.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:22:30.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:22:30.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:22:30.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:22:30.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:22:30.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:22:30.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:22:30.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:22:30.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:22:30.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:22:30.948 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:22:31.178 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:22:31.522 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:22:31.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:22:31.626 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:22:31.626 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:22:31.813 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:22:31.813 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:23:01.843 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:23:01.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:23:01.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:23:02.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:23:02.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:23:02.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:23:02.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:23:02.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:23:02.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:23:02.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:23:02.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:23:02.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:23:02.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:23:05.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:23:05.203 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:23:05.204 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:23:05.204 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:23:05.215 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:23:05.228 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:23:05.228 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:23:05.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:23:05.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:23:05.230 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:23:05.230 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:23:05.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:23:05.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:23:05.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:23:05.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:23:05.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:23:05.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:23:05.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:23:05.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:23:05.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:23:05.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:23:05.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:23:05.562 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:23:05.633 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:22:51
2026-06-03T23:23:05.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87321, datetime.datetime(2026, 6, 3, 23, 22, 51), datetime.datetime(2026, 6, 3, 23, 22, 50), 'salt', 1.96, 100.17, None, 38.92, 118.09, -0.03, 822.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:23:05.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:23:05.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:23:05.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:22:50, diff=15.641403s, valid=True
2026-06-03T23:23:05.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:23:05.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:23:05.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:23:12, diff=-6.355064s, valid=True
2026-06-03T23:23:05.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:23:05.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:23:05.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:22:48, diff=17.653171s, valid=True
2026-06-03T23:23:05.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:23:05.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:23:05.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:23:05.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:23:05.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:23:05.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:23:05.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:23:12, diff=-6.343092s, valid=True
2026-06-03T23:23:05.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:23:05.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:23:05.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:23:05.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=95982.657721s, valid=True
2026-06-03T23:23:05.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:23:05.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:23:05.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:23:05.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:23:05.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:23:05.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:23:05.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:23:05.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:23:05.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:23:05.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:23:05.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:23:05.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:23:05.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:23:05.977 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:23:06.182 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:23:06.525 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:23:06.628 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:23:06.628 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:23:06.628 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:23:06.898 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:23:06.898 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:23:36.918 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:23:36.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:23:36.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:23:37.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:23:37.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:23:37.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:23:37.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:23:37.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:23:37.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:23:37.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:23:37.606 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:23:37.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:23:37.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:23:40.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:23:40.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:23:40.270 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:23:40.270 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:23:40.281 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:23:40.293 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:23:40.294 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:23:40.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:23:40.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:23:40.295 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:23:40.295 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:23:40.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:23:40.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:23:40.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:23:40.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:23:40.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:23:40.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:23:40.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:23:40.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:23:40.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:23:40.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:23:40.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:23:40.634 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:23:40.704 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:23:21
2026-06-03T23:23:40.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87322, datetime.datetime(2026, 6, 3, 23, 23, 21), datetime.datetime(2026, 6, 3, 23, 23, 20), 'salt', 1.93, 100.17, None, 40.61, 128.59, -0.02, 822.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:23:40.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:23:40.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:23:40.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:23:20, diff=20.711386s, valid=True
2026-06-03T23:23:40.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:23:40.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:23:40.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:23:12, diff=28.714823s, valid=True
2026-06-03T23:23:40.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:23:40.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:23:40.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:23:18, diff=22.722867s, valid=True
2026-06-03T23:23:40.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:23:40.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:23:40.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:23:40.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:23:40.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:23:40.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:23:40.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:23:12, diff=28.726479s, valid=True
2026-06-03T23:23:40.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:23:40.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:23:40.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:23:40.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96017.72733s, valid=True
2026-06-03T23:23:40.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:23:40.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:23:40.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:23:40.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:23:40.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:23:40.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:23:40.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:23:40.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:23:40.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:23:40.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:23:40.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:23:40.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:23:41.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:23:41.054 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:23:41.262 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:23:41.607 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:23:41.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:23:41.710 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:23:41.710 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:23:41.962 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:23:41.962 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:24:11.993 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:24:11.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:24:11.993 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:24:12.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:24:12.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:24:12.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:24:12.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:24:12.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:24:12.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:24:12.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:24:12.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:24:12.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:24:12.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:24:15.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:24:15.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:24:15.484 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:24:15.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:24:15.495 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:24:15.507 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:24:15.508 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:24:15.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:24:15.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:24:15.509 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:24:15.509 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:24:15.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:24:15.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:24:15.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:24:15.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:24:15.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:24:15.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:24:15.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:24:15.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:24:15.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:24:15.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:24:15.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:24:15.841 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:24:15.914 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:23:51
2026-06-03T23:24:15.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87323, datetime.datetime(2026, 6, 3, 23, 23, 51), datetime.datetime(2026, 6, 3, 23, 23, 50), 'salt', 1.86, 100.07, None, 35.99, 109.42, -0.01, 822.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:24:15.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:24:15.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:24:15.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:23:50, diff=25.92232s, valid=True
2026-06-03T23:24:15.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:24:15.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:24:15.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:24:12, diff=3.925826s, valid=True
2026-06-03T23:24:15.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:24:15.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:24:15.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:23:48, diff=27.933955s, valid=True
2026-06-03T23:24:15.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:24:15.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:24:15.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:24:15.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:24:15.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:24:15.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:24:15.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:24:12, diff=3.937697s, valid=True
2026-06-03T23:24:15.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:24:15.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:24:15.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:24:15.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96052.938525s, valid=True
2026-06-03T23:24:15.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:24:15.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:24:15.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:24:15.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:24:15.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:24:16.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:24:16.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:24:16.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:24:16.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:24:16.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:24:16.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:24:16.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:24:16.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:24:16.259 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:24:16.528 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:24:16.870 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:24:16.973 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:24:16.973 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:24:16.973 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:24:17.154 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:24:17.154 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:24:47.158 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:24:47.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:24:47.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:24:47.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:24:47.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:24:47.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:24:47.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:24:47.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:24:47.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:24:47.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:24:47.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:24:47.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:24:47.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:24:50.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:24:50.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:24:50.460 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:24:50.460 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:24:50.471 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:24:50.483 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:24:50.484 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:24:50.484 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:24:50.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:24:50.485 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:24:50.485 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:24:50.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:24:50.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:24:50.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:24:50.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:24:50.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:24:50.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:24:50.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:24:50.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:24:50.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:24:50.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:24:50.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:24:50.814 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:24:50.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:24:21
2026-06-03T23:24:50.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87324, datetime.datetime(2026, 6, 3, 23, 24, 21), datetime.datetime(2026, 6, 3, 23, 24, 21), 'salt', 1.83, 100.07, None, 44.39, 119.43, -0.01, 822.19, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:24:50.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:24:50.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:24:50.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:24:21, diff=29.892548s, valid=True
2026-06-03T23:24:50.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:24:50.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:24:50.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:24:12, diff=38.896046s, valid=True
2026-06-03T23:24:50.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:24:50.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:24:50.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:24:18, diff=32.904153s, valid=True
2026-06-03T23:24:50.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:24:50.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:24:50.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:24:50.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:24:50.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:24:50.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:24:50.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:24:12, diff=38.907876s, valid=True
2026-06-03T23:24:50.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:24:50.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:24:50.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:24:50.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96087.908696s, valid=True
2026-06-03T23:24:50.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:24:50.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:24:50.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:24:50.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:24:50.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:24:50.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:24:50.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:24:50.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:24:50.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:24:51.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:24:51.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:24:51.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:24:51.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:24:51.228 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:24:51.436 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:24:51.782 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:24:51.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:24:51.884 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:24:51.884 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:24:52.110 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:24:52.110 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:25:22.140 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:25:22.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:25:22.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:25:22.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:25:22.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:25:22.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:25:22.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:25:22.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:25:22.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:25:22.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:25:22.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:25:22.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:25:22.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:25:25.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:25:25.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:25:25.776 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:25:25.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:25:25.786 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:25:25.799 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:25:25.799 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:25:25.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:25:25.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:25:25.801 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:25:25.801 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:25:25.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:25:25.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-03T23:25:25.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:25:26.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-03T23:25:26.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:25:26.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:25:26.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:25:26.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:25:26.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:25:26.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:25:26.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:25:26.121 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:25:26.190 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:25:22
2026-06-03T23:25:26.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87326, datetime.datetime(2026, 6, 3, 23, 25, 22), datetime.datetime(2026, 6, 3, 23, 25, 21), 'salt', 1.86, 100.14, None, 39.98, 123.14, -0.02, 822.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:25:26.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:25:26.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-03T23:25:26.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:25:21, diff=5.197574s, valid=True
2026-06-03T23:25:26.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:25:26.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:25:26.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:25:12, diff=14.201006s, valid=True
2026-06-03T23:25:26.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:25:26.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-03T23:25:26.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:25:19, diff=7.209065s, valid=True
2026-06-03T23:25:26.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:25:26.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:25:26.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:25:26.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:25:26.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:25:26.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:25:26.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:25:12, diff=14.212715s, valid=True
2026-06-03T23:25:26.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:25:26.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:25:26.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:25:26.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96123.21349s, valid=True
2026-06-03T23:25:26.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:25:26.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:25:26.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:25:26.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:25:26.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:25:26.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:25:26.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:25:26.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:25:26.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:25:26.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:25:26.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:25:26.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:25:26.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:25:26.607 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:25:26.811 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:25:27.156 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:25:27.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:25:27.260 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:25:27.260 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:25:27.447 [WARNING] [MainThread] [clean.py] [copy_files()] Error uploading images and files to the web server: rsync: [sender] read errors mapping "/home/io/development/weatherplots/weatherplots/images/atlas/ref_zp.dat": No data available (61)
WARNING: atlas/ref_zp.dat failed verification -- update discarded (will try again).
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1338) [sender=3.2.7]

2026-06-03T23:25:27.448 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:25:57.453 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:25:57.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:25:57.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:25:57.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:25:57.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:25:58.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:25:58.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:25:58.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:25:58.034 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:25:58.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:25:58.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:25:58.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:25:58.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:26:00.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:26:00.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:26:00.742 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:26:00.742 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:26:00.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:26:00.766 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:26:00.766 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:26:00.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:26:00.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:26:00.767 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:26:00.768 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:26:00.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:26:00.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:26:00.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:26:01.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:26:01.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:26:01.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:26:01.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:26:01.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:26:01.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:26:01.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:26:01.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:26:01.103 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:26:01.175 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:25:52
2026-06-03T23:26:01.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87327, datetime.datetime(2026, 6, 3, 23, 25, 52), datetime.datetime(2026, 6, 3, 23, 25, 51), 'salt', 1.89, 100.17, None, 44.74, 115.22, -0.03, 822.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:26:01.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:26:01.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:26:01.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:25:51, diff=10.182573s, valid=True
2026-06-03T23:26:01.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:26:01.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:26:01.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:26:12, diff=-10.813883s, valid=True
2026-06-03T23:26:01.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:26:01.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:26:01.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:25:50, diff=11.194423s, valid=True
2026-06-03T23:26:01.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:26:01.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:26:01.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:26:01.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:26:01.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:26:01.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:26:01.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:26:12, diff=-10.801793s, valid=True
2026-06-03T23:26:01.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:26:01.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:26:01.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:26:01.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96158.199026s, valid=True
2026-06-03T23:26:01.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:26:01.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:26:01.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:26:01.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:26:01.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:26:01.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:26:01.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:26:01.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:26:01.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:26:01.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:26:01.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:26:01.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:26:01.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:26:01.519 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:26:01.756 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:26:02.102 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:26:02.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:26:02.205 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:26:02.205 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:26:02.418 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:26:02.418 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:26:32.446 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:26:32.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:26:32.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:26:32.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:26:32.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:26:33.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:26:33.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:26:33.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:26:33.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:26:33.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:26:33.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:26:33.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:26:33.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:26:36.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:26:36.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:26:36.061 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:26:36.061 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:26:36.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:26:36.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:26:36.084 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:26:36.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:26:36.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:26:36.086 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:26:36.086 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:26:36.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:26:36.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:26:36.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:26:36.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:26:36.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:26:36.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:26:36.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:26:36.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:26:36.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:26:36.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:26:36.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:26:36.415 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:26:36.488 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:26:22
2026-06-03T23:26:36.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87328, datetime.datetime(2026, 6, 3, 23, 26, 22), datetime.datetime(2026, 6, 3, 23, 26, 22), 'salt', 1.83, 100.1, None, 42.02, 113.72, -0.01, 822.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:26:36.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:26:36.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:26:36.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:26:22, diff=14.496927s, valid=True
2026-06-03T23:26:36.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:26:36.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:26:36.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:26:12, diff=24.500991s, valid=True
2026-06-03T23:26:36.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:26:36.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:26:36.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:26:19, diff=17.508993s, valid=True
2026-06-03T23:26:36.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:26:36.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:26:36.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:26:36.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:26:36.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:26:36.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:26:36.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:26:12, diff=24.512553s, valid=True
2026-06-03T23:26:36.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:26:36.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:26:36.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:26:36.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96193.51336s, valid=True
2026-06-03T23:26:36.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:26:36.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:26:36.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:26:36.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:26:36.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:26:36.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:26:36.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:26:36.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:26:36.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:26:36.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:26:36.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:26:36.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:26:36.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:26:36.901 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:26:37.106 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:26:37.448 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:26:37.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:26:37.550 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:26:37.550 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:26:37.816 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:26:37.816 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:27:07.827 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:27:07.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:27:07.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:27:07.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:27:07.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:27:08.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:27:08.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:27:08.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:27:08.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:27:08.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:27:08.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:27:08.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:27:08.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:27:11.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:27:11.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:27:11.056 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:27:11.057 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:27:11.068 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:27:11.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:27:11.082 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:27:11.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:27:11.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:27:11.083 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:27:11.084 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:27:11.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:27:11.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:27:11.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:27:11.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:27:11.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:27:11.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:27:11.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:27:11.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:27:11.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:27:11.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:27:11.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:27:11.404 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:27:11.476 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:26:53
2026-06-03T23:27:11.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87329, datetime.datetime(2026, 6, 3, 23, 26, 53), datetime.datetime(2026, 6, 3, 23, 26, 52), 'salt', 1.86, 100.14, None, 40.47, 127.01, -0.02, 822.07, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:27:11.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:27:11.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:27:11.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:26:52, diff=19.484758s, valid=True
2026-06-03T23:27:11.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:27:11.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:27:11.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:27:12, diff=-0.511214s, valid=True
2026-06-03T23:27:11.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:27:11.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:27:11.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:26:49, diff=22.496992s, valid=True
2026-06-03T23:27:11.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:27:11.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:27:11.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:27:11.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:27:11.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:27:11.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:27:11.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:27:12, diff=-0.49928s, valid=True
2026-06-03T23:27:11.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:27:11.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:27:11.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:27:11.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96228.501512s, valid=True
2026-06-03T23:27:11.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:27:11.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:27:11.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:27:11.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:27:11.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:27:11.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:27:11.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:27:11.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:27:11.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:27:11.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:27:11.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:27:11.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:27:11.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:27:11.860 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:27:12.071 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:27:12.429 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:27:12.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:27:12.539 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:27:12.539 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:27:12.774 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:27:12.774 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:27:42.805 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:27:42.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:27:42.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:27:42.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:27:42.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:27:43.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:27:43.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:27:43.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:27:43.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:27:43.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:27:43.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:27:43.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:27:43.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:27:46.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:27:46.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:27:46.295 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:27:46.295 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:27:46.305 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:27:46.318 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:27:46.319 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:27:46.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:27:46.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:27:46.320 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:27:46.320 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:27:46.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:27:46.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:27:46.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:27:46.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:27:46.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:27:46.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:27:46.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:27:46.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:27:46.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:27:46.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:27:46.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:27:46.657 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:27:46.738 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:27:23
2026-06-03T23:27:46.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87330, datetime.datetime(2026, 6, 3, 23, 27, 23), datetime.datetime(2026, 6, 3, 23, 27, 22), 'salt', 1.86, 100.14, None, 31.19, 105.73, -0.02, 822.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:27:46.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:27:46.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:27:46.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:27:22, diff=24.745691s, valid=True
2026-06-03T23:27:46.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:27:46.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:27:46.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:27:12, diff=34.749178s, valid=True
2026-06-03T23:27:46.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:27:46.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:27:46.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:27:20, diff=26.757276s, valid=True
2026-06-03T23:27:46.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:27:46.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:27:46.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:27:46.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:27:46.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:27:46.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:27:46.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:27:12, diff=34.761045s, valid=True
2026-06-03T23:27:46.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:27:46.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:27:46.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:27:46.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96263.76186s, valid=True
2026-06-03T23:27:46.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:27:46.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:27:46.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:27:46.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:27:46.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:27:46.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:27:46.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:27:46.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:27:46.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:27:46.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:27:47.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:27:47.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:27:47.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:27:47.168 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:27:47.375 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:27:47.716 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:27:47.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:27:47.818 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:27:47.818 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:27:48.020 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:27:48.020 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:28:18.030 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:28:18.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:28:18.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:28:18.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:28:18.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:28:18.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:28:18.458 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:28:18.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:28:18.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:28:18.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:28:18.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:28:18.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:28:18.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:28:21.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:28:21.081 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:28:21.082 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:28:21.082 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:28:21.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:28:21.113 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:28:21.114 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:28:21.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:28:21.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:28:21.115 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:28:21.115 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:28:21.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:28:21.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:28:21.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:28:21.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:28:21.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:28:21.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:28:21.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:28:21.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:28:21.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:28:21.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:28:21.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:28:21.450 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:28:21.532 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:27:54
2026-06-03T23:28:21.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87331, datetime.datetime(2026, 6, 3, 23, 27, 54), datetime.datetime(2026, 6, 3, 23, 27, 53), 'salt', 1.86, 100.1, None, 39.62, 103.81, -0.02, 822.19, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:28:21.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:28:21.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:28:21.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:27:53, diff=28.538475s, valid=True
2026-06-03T23:28:21.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:28:21.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:28:21.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:28:12, diff=9.541381s, valid=True
2026-06-03T23:28:21.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:28:21.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:28:21.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:27:52, diff=29.548161s, valid=True
2026-06-03T23:28:21.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:28:21.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:28:21.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:28:21.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:28:21.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:28:21.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:28:21.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:28:12, diff=9.551217s, valid=True
2026-06-03T23:28:21.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:28:21.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:28:21.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:28:21.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96298.551874s, valid=True
2026-06-03T23:28:21.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:28:21.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:28:21.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:28:21.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:28:21.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:28:21.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:28:21.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:28:21.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:28:21.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:28:21.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:28:21.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:28:21.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:28:21.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:28:21.867 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:28:22.072 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:28:22.412 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:28:22.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:28:22.515 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:28:22.515 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:28:22.688 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:28:22.689 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:28:52.702 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:28:52.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:28:52.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:28:53.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:28:53.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:28:53.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:28:53.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:28:53.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:28:53.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:28:53.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:28:53.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:28:53.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:28:53.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:28:56.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:28:56.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:28:56.190 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:28:56.190 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:28:56.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:28:56.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:28:56.214 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:28:56.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:28:56.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:28:56.215 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:28:56.215 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:28:56.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:28:56.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-03T23:28:56.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:28:56.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-03T23:28:56.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:28:56.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T23:28:56.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:28:56.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T23:28:56.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:28:56.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:28:56.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:28:56.558 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:28:56.633 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:28:54
2026-06-03T23:28:56.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87333, datetime.datetime(2026, 6, 3, 23, 28, 54), datetime.datetime(2026, 6, 3, 23, 28, 53), 'salt', 1.86, 100.1, None, 41.32, 105.73, -0.02, 822.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:28:56.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:28:56.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-03T23:28:56.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:28:53, diff=3.640481s, valid=True
2026-06-03T23:28:56.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:28:56.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T23:28:56.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:29:12, diff=-15.355982s, valid=True
2026-06-03T23:28:56.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:28:56.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-03T23:28:56.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:28:50, diff=6.652104s, valid=True
2026-06-03T23:28:56.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:28:56.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:28:56.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:28:56.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:28:56.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:28:56.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T23:28:56.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:29:12, diff=-15.344139s, valid=True
2026-06-03T23:28:56.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:28:56.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:28:56.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:28:56.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96333.656673s, valid=True
2026-06-03T23:28:56.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:28:56.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:28:56.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:28:56.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:28:56.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:28:56.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:28:56.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:28:56.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:28:56.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:28:56.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:28:56.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:28:56.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:28:56.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:28:56.977 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:28:57.185 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:28:57.529 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:28:57.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:28:57.632 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:28:57.632 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:28:57.823 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:28:57.823 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:29:27.853 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:29:27.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:29:27.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:29:28.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:29:28.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:29:28.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:29:28.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:29:28.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:29:28.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:29:28.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:29:28.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:29:28.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:29:28.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:29:31.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:29:31.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:29:31.599 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:29:31.599 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:29:31.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:29:31.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:29:31.623 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:29:31.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:29:31.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:29:31.624 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:29:31.625 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:29:31.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:29:31.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:29:31.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:29:31.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:29:31.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:29:31.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:29:31.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:29:31.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:29:31.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:29:31.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:29:31.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:29:31.982 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:29:32.055 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:29:24
2026-06-03T23:29:32.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87334, datetime.datetime(2026, 6, 3, 23, 29, 24), datetime.datetime(2026, 6, 3, 23, 29, 24), 'salt', 1.86, 100.14, None, 37.33, 112.92, -0.02, 821.88, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:29:32.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:29:32.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:29:32.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:29:24, diff=8.062955s, valid=True
2026-06-03T23:29:32.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:29:32.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:29:32.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:29:12, diff=20.066608s, valid=True
2026-06-03T23:29:32.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:29:32.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:29:32.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:29:21, diff=11.074993s, valid=True
2026-06-03T23:29:32.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:29:32.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:29:32.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:29:32.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:29:32.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:29:32.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:29:32.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:29:12, diff=20.078902s, valid=True
2026-06-03T23:29:32.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:29:32.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:29:32.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:29:32.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96369.079763s, valid=True
2026-06-03T23:29:32.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:29:32.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:29:32.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:29:32.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:29:32.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:29:32.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:29:32.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:29:32.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:29:32.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:29:32.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:29:32.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:29:32.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:29:32.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:29:32.402 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:29:32.671 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:29:33.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:29:33.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:29:33.118 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:29:33.118 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:29:33.317 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:29:33.317 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:30:03.347 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:30:03.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:30:03.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:30:03.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:30:03.477 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:30:03.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:30:03.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:30:03.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:30:03.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:30:03.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:30:03.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:30:03.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:30:03.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:30:06.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:30:06.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:30:06.295 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:30:06.295 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:30:06.306 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:30:06.318 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:30:06.319 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:30:06.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:30:06.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:30:06.320 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:30:06.320 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:30:06.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:30:06.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:30:06.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:30:06.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:30:06.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:30:06.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:30:06.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:30:06.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:30:06.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:30:06.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:30:06.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:30:06.682 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:30:06.755 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:29:55
2026-06-03T23:30:06.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87335, datetime.datetime(2026, 6, 3, 23, 29, 55), datetime.datetime(2026, 6, 3, 23, 29, 54), 'salt', 1.86, 100.1, None, 46.4, 120.72, -0.02, 821.95, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:30:06.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:30:06.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:30:06.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:29:54, diff=12.763009s, valid=True
2026-06-03T23:30:06.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:30:06.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:30:06.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:30:12, diff=-5.233532s, valid=True
2026-06-03T23:30:06.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:30:06.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:30:06.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:29:51, diff=15.774714s, valid=True
2026-06-03T23:30:06.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:30:06.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:30:06.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:30:06.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:30:06.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:30:06.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:30:06.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:30:12, diff=-5.221544s, valid=True
2026-06-03T23:30:06.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:30:06.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:30:06.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:30:06.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96403.779289s, valid=True
2026-06-03T23:30:06.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:30:06.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:30:06.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:30:06.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:30:06.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:30:06.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:30:06.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:30:06.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:30:06.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:30:06.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:30:06.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:30:07.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:30:07.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:30:07.100 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:30:07.305 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:30:07.645 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:30:07.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:30:07.748 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:30:07.748 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:30:07.987 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:30:07.987 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:30:38.017 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:30:38.018 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:30:38.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:30:38.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:30:38.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:30:38.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:30:38.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:30:38.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:30:38.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:30:38.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:30:38.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:30:38.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:30:38.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:30:41.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:30:41.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:30:41.107 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:30:41.107 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:30:41.118 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:30:41.132 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:30:41.132 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:30:41.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:30:41.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:30:41.133 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:30:41.134 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:30:41.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:30:41.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:30:41.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:30:41.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:30:41.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:30:41.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:30:41.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:30:41.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:30:41.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:30:41.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:30:41.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:30:41.467 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:30:41.539 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:30:25
2026-06-03T23:30:41.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87336, datetime.datetime(2026, 6, 3, 23, 30, 25), datetime.datetime(2026, 6, 3, 23, 30, 24), 'salt', 1.83, 100.14, None, 47.17, 122.06, -0.02, 822.07, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:30:41.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:30:41.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:30:41.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:30:24, diff=17.54654s, valid=True
2026-06-03T23:30:41.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:30:41.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:30:41.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:30:12, diff=29.550029s, valid=True
2026-06-03T23:30:41.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:30:41.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:30:41.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:30:21, diff=20.558313s, valid=True
2026-06-03T23:30:41.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:30:41.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:30:41.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:30:41.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:30:41.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:30:41.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:30:41.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:30:12, diff=29.562032s, valid=True
2026-06-03T23:30:41.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:30:41.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:30:41.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:30:41.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96438.562844s, valid=True
2026-06-03T23:30:41.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:30:41.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:30:41.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:30:41.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:30:41.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:30:41.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:30:41.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:30:41.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:30:41.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:30:41.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:30:41.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:30:41.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:30:41.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:30:41.959 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:30:42.163 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:30:42.505 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:30:42.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:30:42.608 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:30:42.608 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:30:42.788 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:30:42.789 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:31:12.804 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:31:12.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:31:12.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:31:13.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:31:13.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:31:13.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:31:13.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:31:13.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:31:13.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:31:13.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:31:13.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:31:13.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:31:13.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:31:16.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:31:16.221 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:31:16.222 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:31:16.222 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:31:16.233 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:31:16.245 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:31:16.246 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:31:16.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:31:16.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:31:16.247 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:31:16.248 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:31:16.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:31:16.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:31:16.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:31:16.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:31:16.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:31:16.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:31:16.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:31:16.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:31:16.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:31:16.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:31:16.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:31:16.598 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:31:16.687 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:30:55
2026-06-03T23:31:16.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87337, datetime.datetime(2026, 6, 3, 23, 30, 55), datetime.datetime(2026, 6, 3, 23, 30, 54), 'salt', 1.83, 100.1, None, 48.51, 125.75, -0.01, 821.88, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:31:16.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:31:16.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:31:16.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:30:54, diff=22.695161s, valid=True
2026-06-03T23:31:16.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:31:16.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:31:16.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:31:12, diff=4.698643s, valid=True
2026-06-03T23:31:16.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:31:16.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:31:16.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:30:52, diff=24.706788s, valid=True
2026-06-03T23:31:16.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:31:16.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:31:16.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:31:16.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:31:16.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:31:16.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:31:16.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:31:12, diff=4.710538s, valid=True
2026-06-03T23:31:16.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:31:16.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:31:16.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:31:16.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96473.711345s, valid=True
2026-06-03T23:31:16.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:31:16.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:31:16.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:31:16.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:31:16.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:31:16.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:31:16.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:31:16.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:31:16.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:31:16.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:31:16.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:31:16.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:31:16.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:31:17.032 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:31:17.238 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:31:17.579 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:31:17.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:31:17.681 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:31:17.681 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:31:17.869 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:31:17.869 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:31:47.892 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:31:47.892 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:31:47.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:31:48.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:31:48.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:31:48.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:31:48.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:31:48.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:31:48.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:31:48.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:31:48.507 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:31:48.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:31:48.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:31:51.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:31:51.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:31:51.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:31:51.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:31:51.730 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:31:51.743 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:31:51.743 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:31:51.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:31:51.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:31:51.744 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:31:51.745 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:31:51.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:31:51.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:31:51.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:31:52.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:31:52.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:31:52.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:31:52.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:31:52.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:31:52.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:31:52.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:31:52.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:31:52.101 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:31:52.176 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:31:25
2026-06-03T23:31:52.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87338, datetime.datetime(2026, 6, 3, 23, 31, 25), datetime.datetime(2026, 6, 3, 23, 31, 24), 'salt', 1.86, 100.14, None, 46.4, 119.52, -0.02, 821.88, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:31:52.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:31:52.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:31:52.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:31:24, diff=28.183443s, valid=True
2026-06-03T23:31:52.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:31:52.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:31:52.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:31:12, diff=40.186921s, valid=True
2026-06-03T23:31:52.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:31:52.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:31:52.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:31:22, diff=30.194977s, valid=True
2026-06-03T23:31:52.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:31:52.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:31:52.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:31:52.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:31:52.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:31:52.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:31:52.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:31:12, diff=40.1987s, valid=True
2026-06-03T23:31:52.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:31:52.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:31:52.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:31:52.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96509.199509s, valid=True
2026-06-03T23:31:52.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:31:52.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:31:52.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:31:52.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:31:52.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:31:52.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:31:52.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:31:52.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:31:52.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:31:52.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:31:52.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:31:52.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:31:52.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:31:52.594 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:31:52.800 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:31:53.147 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:31:53.249 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:31:53.249 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:31:53.250 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:31:53.431 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:31:53.432 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:32:23.441 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:32:23.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:32:23.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:32:23.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:32:23.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:32:24.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:32:24.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:32:24.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:32:24.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:32:24.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:32:24.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:32:24.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:32:24.052 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:32:26.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:32:26.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:32:26.765 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:32:26.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:32:26.775 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:32:26.788 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:32:26.788 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:32:26.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:32:26.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:32:26.789 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:32:26.790 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:32:26.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:32:26.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-03T23:32:26.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:32:27.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-03T23:32:27.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:32:27.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:32:27.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:32:27.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:32:27.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:32:27.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:32:27.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:32:27.124 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:32:27.196 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:32:26
2026-06-03T23:32:27.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87340, datetime.datetime(2026, 6, 3, 23, 32, 26), datetime.datetime(2026, 6, 3, 23, 32, 25), 'salt', 1.86, 100.1, None, 44.67, 127.51, -0.02, 822.13, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:32:27.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:32:27.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-03T23:32:27.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:32:25, diff=2.203596s, valid=True
2026-06-03T23:32:27.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:32:27.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:32:27.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:32:12, diff=15.207133s, valid=True
2026-06-03T23:32:27.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:32:27.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-03T23:32:27.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:32:22, diff=5.215211s, valid=True
2026-06-03T23:32:27.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:32:27.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:32:27.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:32:27.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:32:27.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:32:27.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:32:27.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:32:12, diff=15.218897s, valid=True
2026-06-03T23:32:27.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:32:27.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:32:27.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:32:27.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96544.21971s, valid=True
2026-06-03T23:32:27.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:32:27.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:32:27.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:32:27.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:32:27.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:32:27.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:32:27.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:32:27.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:32:27.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:32:27.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:32:27.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:32:27.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:32:27.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:32:27.539 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:32:27.744 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:32:28.086 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:32:28.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:32:28.188 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:32:28.188 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:32:28.375 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:32:28.375 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:32:58.384 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:32:58.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:32:58.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:32:58.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:32:58.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:32:58.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:32:58.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:32:58.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:32:58.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:32:58.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:32:58.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:32:58.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:32:58.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:33:01.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:33:01.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:33:01.478 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:33:01.478 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:33:01.489 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:33:01.501 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:33:01.502 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:33:01.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:33:01.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:33:01.503 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:33:01.503 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:33:01.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:33:01.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:33:01.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:33:01.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:33:01.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:33:01.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:33:01.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:33:01.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:33:01.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:33:01.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:33:01.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:33:01.859 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:33:01.931 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:32:56
2026-06-03T23:33:01.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87341, datetime.datetime(2026, 6, 3, 23, 32, 56), datetime.datetime(2026, 6, 3, 23, 32, 56), 'salt', 1.89, 100.17, None, 41.07, 128.92, -0.03, 822.13, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T23:33:01.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:33:01.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:33:01.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:32:56, diff=5.937884s, valid=True
2026-06-03T23:33:01.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:33:01.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:33:01.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:33:12, diff=-10.05928s, valid=True
2026-06-03T23:33:01.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:33:01.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:33:01.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:32:52, diff=9.947373s, valid=True
2026-06-03T23:33:01.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:33:01.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:33:01.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:33:01.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:33:01.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:33:01.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:33:01.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:33:12, diff=-10.049633s, valid=True
2026-06-03T23:33:01.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:33:01.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:33:01.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:33:01.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96578.951017s, valid=True
2026-06-03T23:33:01.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:33:01.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:33:01.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:33:01.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:33:01.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:33:02.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:33:02.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:33:02.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:33:02.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:33:02.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:33:02.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:33:02.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:33:02.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:33:02.331 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:33:02.538 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:33:02.881 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:33:02.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:33:02.984 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:33:02.984 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:33:03.842 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:33:03.842 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:33:33.872 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:33:33.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:33:33.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:33:34.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:33:34.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:33:34.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:33:34.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:33:34.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:33:34.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:33:34.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:33:34.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:33:34.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:33:34.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:33:36.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:33:36.823 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:33:36.824 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:33:36.824 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:33:36.833 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:33:36.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:33:36.846 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:33:36.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:33:36.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:33:36.848 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:33:36.848 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:33:36.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:33:36.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:33:36.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:33:37.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:33:37.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:33:37.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:33:37.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:33:37.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:33:37.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:33:37.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:33:37.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:33:37.177 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:33:37.246 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:33:27
2026-06-03T23:33:37.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87342, datetime.datetime(2026, 6, 3, 23, 33, 27), datetime.datetime(2026, 6, 3, 23, 33, 26), 'salt', 1.86, 100.14, None, 49.92, 124.83, -0.02, 822.07, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T23:33:37.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:33:37.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:33:37.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:33:26, diff=11.252632s, valid=True
2026-06-03T23:33:37.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:33:37.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:33:37.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:33:12, diff=25.255506s, valid=True
2026-06-03T23:33:37.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:33:37.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:33:37.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:33:23, diff=14.262327s, valid=True
2026-06-03T23:33:37.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:33:37.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:33:37.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:33:37.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:33:37.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:33:37.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:33:37.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:33:12, diff=25.265376s, valid=True
2026-06-03T23:33:37.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:33:37.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:33:37.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:33:37.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96614.266052s, valid=True
2026-06-03T23:33:37.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:33:37.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:33:37.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:33:37.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:33:37.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:33:37.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:33:37.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:33:37.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:33:37.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:33:37.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:33:37.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:33:37.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:33:37.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:33:37.749 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:33:37.971 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:33:38.357 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:33:38.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:33:38.475 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:33:38.476 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:33:38.645 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:33:38.646 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:34:08.676 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:34:08.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:34:08.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:34:09.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:34:09.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:34:09.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:34:09.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:34:09.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:34:09.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:34:09.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:34:09.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:34:09.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:34:09.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:34:11.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:34:11.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:34:11.860 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:34:11.860 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:34:11.870 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:34:11.883 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:34:11.884 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:34:11.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:34:11.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:34:11.885 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:34:11.885 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:34:11.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:34:12.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:34:12.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:34:12.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:34:12.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:34:12.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:34:12.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:34:12.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:34:12.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:34:12.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:34:12.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:34:12.216 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:34:12.288 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:33:57
2026-06-03T23:34:12.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87343, datetime.datetime(2026, 6, 3, 23, 33, 57), datetime.datetime(2026, 6, 3, 23, 33, 56), 'salt', 1.79, 100.07, None, 38.04, 117.97, -0.02, 821.88, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T23:34:12.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:34:12.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:34:12.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:33:56, diff=16.295707s, valid=True
2026-06-03T23:34:12.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:34:12.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:34:12.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:34:12, diff=0.299222s, valid=True
2026-06-03T23:34:12.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:34:12.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:34:12.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:33:53, diff=19.307636s, valid=True
2026-06-03T23:34:12.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:34:12.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:34:12.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:34:12.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:34:12.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:34:12.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:34:12.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:34:12, diff=0.311395s, valid=True
2026-06-03T23:34:12.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:34:12.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:34:12.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:34:12.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96649.312233s, valid=True
2026-06-03T23:34:12.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:34:12.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:34:12.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:34:12.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:34:12.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:34:12.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:34:12.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:34:12.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:34:12.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:34:12.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:34:12.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:34:12.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:34:12.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:34:12.633 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:34:12.839 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:34:13.183 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:34:13.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:34:13.286 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:34:13.286 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:34:13.496 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:34:13.497 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:34:43.527 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:34:43.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:34:43.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:34:43.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:34:43.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:34:44.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:34:44.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:34:44.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:34:44.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:34:44.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:34:44.117 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:34:44.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:34:44.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:34:46.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:34:46.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:34:46.577 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:34:46.577 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:34:46.587 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:34:46.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:34:46.600 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:34:46.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:34:46.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:34:46.601 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:34:46.602 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:34:46.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:34:46.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:34:46.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:34:46.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:34:46.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:34:46.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:34:46.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:34:46.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:34:46.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:34:46.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:34:46.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:34:46.938 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:34:47.008 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:34:27
2026-06-03T23:34:47.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87344, datetime.datetime(2026, 6, 3, 23, 34, 27), datetime.datetime(2026, 6, 3, 23, 34, 26), 'salt', 1.89, 100.14, None, 39.06, 126.59, -0.03, 822.07, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T23:34:47.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:34:47.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:34:47.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:34:26, diff=21.015901s, valid=True
2026-06-03T23:34:47.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:34:47.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:34:47.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:34:12, diff=35.01926s, valid=True
2026-06-03T23:34:47.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:34:47.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:34:47.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:34:23, diff=24.026831s, valid=True
2026-06-03T23:34:47.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:34:47.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:34:47.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:34:47.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:34:47.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:34:47.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:34:47.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:34:12, diff=35.030081s, valid=True
2026-06-03T23:34:47.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:34:47.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:34:47.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:34:47.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96684.030765s, valid=True
2026-06-03T23:34:47.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:34:47.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:34:47.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:34:47.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:34:47.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:34:47.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:34:47.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:34:47.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:34:47.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:34:47.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:34:47.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:34:47.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:34:47.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:34:47.345 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:34:47.550 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:34:47.954 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:34:48.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:34:48.056 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:34:48.056 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:34:48.244 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:34:48.244 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:35:18.245 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:35:18.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:35:18.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:35:18.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:35:18.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:35:18.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:35:18.806 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:35:18.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:35:18.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:35:18.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:35:18.831 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:35:18.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:35:18.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:35:21.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:35:21.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:35:21.193 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:35:21.193 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:35:21.205 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:35:21.218 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:35:21.219 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:35:21.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:35:21.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:35:21.220 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:35:21.220 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:35:21.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:35:21.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:35:21.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:35:21.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:35:21.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:35:21.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:35:21.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:35:21.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:35:21.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:35:21.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:35:21.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:35:21.554 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:35:21.625 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:34:57
2026-06-03T23:35:21.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87345, datetime.datetime(2026, 6, 3, 23, 34, 57), datetime.datetime(2026, 6, 3, 23, 34, 57), 'salt', 1.86, 100.14, None, 47.74, 120.84, -0.02, 821.95, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T23:35:21.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:35:21.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:35:21.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:34:57, diff=24.632518s, valid=True
2026-06-03T23:35:21.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:35:21.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:35:21.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:35:12, diff=9.635981s, valid=True
2026-06-03T23:35:21.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:35:21.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:35:21.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:34:53, diff=28.64408s, valid=True
2026-06-03T23:35:21.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:35:21.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:35:21.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:35:21.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:35:21.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:35:21.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:35:21.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:35:12, diff=9.647798s, valid=True
2026-06-03T23:35:21.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:35:21.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:35:21.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:35:21.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96718.648586s, valid=True
2026-06-03T23:35:21.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:35:21.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:35:21.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:35:21.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:35:21.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:35:21.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:35:21.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:35:21.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:35:21.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:35:21.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:35:21.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:35:21.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:35:21.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:35:21.966 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:35:22.172 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:35:22.512 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:35:22.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:35:22.614 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:35:22.614 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:35:22.824 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:35:22.824 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:35:52.855 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:35:52.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:35:52.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:35:53.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:35:53.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:35:53.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:35:53.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:35:53.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:35:53.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:35:53.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:35:53.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:35:53.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:35:53.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:35:55.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:35:55.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:35:55.805 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:35:55.805 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:35:55.816 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:35:55.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:35:55.829 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:35:55.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:35:55.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:35:55.830 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:35:55.830 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:35:55.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:35:55.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:35:55.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:35:56.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:35:56.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:35:56.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:35:56.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:35:56.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:35:56.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:35:56.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:35:56.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:35:56.134 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:35:56.204 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:35:28
2026-06-03T23:35:56.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87346, datetime.datetime(2026, 6, 3, 23, 35, 28), datetime.datetime(2026, 6, 3, 23, 35, 27), 'salt', 1.89, 100.14, None, 48.48, 121.64, -0.03, 821.95, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:35:56.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:35:56.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:35:56.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:35:27, diff=29.211297s, valid=True
2026-06-03T23:35:56.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:35:56.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:35:56.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:35:12, diff=44.214608s, valid=True
2026-06-03T23:35:56.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:35:56.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:35:56.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:35:24, diff=32.222396s, valid=True
2026-06-03T23:35:56.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:35:56.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:35:56.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:35:56.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:35:56.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:35:56.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:35:56.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:35:12, diff=44.225923s, valid=True
2026-06-03T23:35:56.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:35:56.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:35:56.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:35:56.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96753.22668s, valid=True
2026-06-03T23:35:56.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:35:56.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:35:56.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:35:56.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:35:56.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:35:56.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:35:56.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:35:56.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:35:56.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:35:56.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:35:56.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:35:56.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:35:56.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:35:56.544 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:35:56.822 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:35:57.163 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:35:57.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:35:57.265 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:35:57.265 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:35:57.494 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:35:57.494 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:36:27.512 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:36:27.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:36:27.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:36:27.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:36:27.860 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:36:28.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:36:28.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:36:28.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:36:28.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:36:28.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:36:28.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:36:28.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:36:28.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:36:30.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:36:30.717 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:36:30.718 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:36:30.719 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:36:30.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:36:30.741 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:36:30.741 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:36:30.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:36:30.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:36:30.743 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:36:30.743 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:36:30.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:36:30.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-03T23:36:30.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:36:30.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-03T23:36:30.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:36:31.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:36:31.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:36:31.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:36:31.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:36:31.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:36:31.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:36:31.070 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:36:31.141 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:36:28
2026-06-03T23:36:31.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87348, datetime.datetime(2026, 6, 3, 23, 36, 28), datetime.datetime(2026, 6, 3, 23, 36, 27), 'salt', 1.83, 100.2, None, 47.56, 121.87, -0.03, 822.07, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:36:31.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:36:31.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-03T23:36:31.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:36:27, diff=4.148657s, valid=True
2026-06-03T23:36:31.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:36:31.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:36:31.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:36:12, diff=19.152258s, valid=True
2026-06-03T23:36:31.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:36:31.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-03T23:36:31.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:36:24, diff=7.160477s, valid=True
2026-06-03T23:36:31.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:36:31.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:36:31.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:36:31.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:36:31.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:36:31.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:36:31.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:36:12, diff=19.164238s, valid=True
2026-06-03T23:36:31.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:36:31.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:36:31.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:36:31.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96788.165052s, valid=True
2026-06-03T23:36:31.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:36:31.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:36:31.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:36:31.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:36:31.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:36:31.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:36:31.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:36:31.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:36:31.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:36:31.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:36:31.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:36:31.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:36:31.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:36:31.485 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:36:31.691 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:36:32.033 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:36:32.135 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:36:32.135 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:36:32.135 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:36:32.387 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:36:32.387 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:37:02.417 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:37:02.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:37:02.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:37:02.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:37:02.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:37:02.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:37:02.993 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:37:03.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:37:03.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:37:03.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:37:03.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:37:03.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:37:03.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:37:05.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:37:05.372 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:37:05.373 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:37:05.373 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:37:05.383 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:37:05.396 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:37:05.397 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:37:05.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:37:05.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:37:05.398 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:37:05.398 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:37:05.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:37:05.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:37:05.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:37:05.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:37:05.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:37:05.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:37:05.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:37:05.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:37:05.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:37:05.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:37:05.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:37:05.736 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:37:05.806 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:36:58
2026-06-03T23:37:05.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87349, datetime.datetime(2026, 6, 3, 23, 36, 58), datetime.datetime(2026, 6, 3, 23, 36, 58), 'salt', 1.79, 100.17, None, 46.33, 123.35, -0.03, 821.88, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:37:05.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:37:05.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:37:05.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:36:58, diff=7.814257s, valid=True
2026-06-03T23:37:05.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:37:05.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:37:05.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:37:12, diff=-6.182247s, valid=True
2026-06-03T23:37:05.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:37:05.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:37:05.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:36:55, diff=10.82597s, valid=True
2026-06-03T23:37:05.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:37:05.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:37:05.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:37:05.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:37:05.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:37:05.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:37:05.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:37:12, diff=-6.170296s, valid=True
2026-06-03T23:37:05.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:37:05.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:37:05.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:37:05.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96822.830499s, valid=True
2026-06-03T23:37:05.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:37:05.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:37:05.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:37:05.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:37:05.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:37:05.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:37:05.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:37:05.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:37:05.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:37:05.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:37:06.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:37:06.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:37:06.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:37:06.220 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:37:06.416 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:37:06.749 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:37:06.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:37:06.850 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:37:06.850 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:37:07.104 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:37:07.105 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:37:37.135 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:37:37.135 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:37:37.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:37:37.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:37:37.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:37:37.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:37:37.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:37:37.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:37:37.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:37:37.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:37:37.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:37:37.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:37:37.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:37:40.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:37:40.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:37:40.273 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:37:40.273 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:37:40.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:37:40.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:37:40.297 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:37:40.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:37:40.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:37:40.298 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:37:40.298 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:37:40.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:37:40.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:37:40.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:37:40.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:37:40.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:37:40.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:37:40.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:37:40.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:37:40.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:37:40.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:37:40.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:37:40.643 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:37:40.715 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:37:29
2026-06-03T23:37:40.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87350, datetime.datetime(2026, 6, 3, 23, 37, 29), datetime.datetime(2026, 6, 3, 23, 37, 28), 'salt', 1.86, 100.17, None, 49.92, 123.16, -0.03, 822.13, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T23:37:40.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:37:40.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:37:40.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:37:28, diff=12.722652s, valid=True
2026-06-03T23:37:40.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:37:40.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:37:40.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:37:12, diff=28.726157s, valid=True
2026-06-03T23:37:40.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:37:40.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:37:40.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:37:25, diff=15.734304s, valid=True
2026-06-03T23:37:40.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:37:40.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:37:40.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:37:40.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:37:40.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:37:40.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:37:40.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:37:12, diff=28.73804s, valid=True
2026-06-03T23:37:40.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:37:40.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:37:40.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:37:40.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96857.738852s, valid=True
2026-06-03T23:37:40.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:37:40.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:37:40.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:37:40.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:37:40.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:37:40.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:37:40.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:37:40.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:37:40.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:37:40.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:37:40.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:37:40.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:37:41.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:37:41.058 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:37:41.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:37:41.588 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:37:41.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:37:41.689 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:37:41.689 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:37:41.842 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:37:41.842 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:38:11.848 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:38:11.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:38:11.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:38:12.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:38:12.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:38:12.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:38:12.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:38:12.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:38:12.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:38:12.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:38:12.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:38:12.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:38:12.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:38:14.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:38:14.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:38:14.902 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:38:14.902 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:38:14.914 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:38:14.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:38:14.927 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:38:14.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:38:14.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:38:14.928 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:38:14.928 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:38:14.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:38:15.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:38:15.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:38:15.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:38:15.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:38:15.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:38:15.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:38:15.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:38:15.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:38:15.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:38:15.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:38:15.289 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:38:15.376 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:37:59
2026-06-03T23:38:15.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87351, datetime.datetime(2026, 6, 3, 23, 37, 59), datetime.datetime(2026, 6, 3, 23, 37, 58), 'salt', 1.86, 100.17, None, 47.74, 123.44, -0.03, 822.01, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T23:38:15.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:38:15.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:38:15.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:37:58, diff=17.384389s, valid=True
2026-06-03T23:38:15.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:38:15.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:38:15.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:38:12, diff=3.388055s, valid=True
2026-06-03T23:38:15.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:38:15.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:38:15.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:37:55, diff=20.39652s, valid=True
2026-06-03T23:38:15.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:38:15.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:38:15.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:38:15.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:38:15.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:38:15.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:38:15.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:38:12, diff=3.400377s, valid=True
2026-06-03T23:38:15.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:38:15.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:38:15.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:38:15.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96892.40122s, valid=True
2026-06-03T23:38:15.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:38:15.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:38:15.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:38:15.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:38:15.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:38:15.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:38:15.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:38:15.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:38:15.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:38:15.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:38:15.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:38:15.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:38:15.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:38:15.789 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:38:15.986 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:38:16.321 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:38:16.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:38:16.421 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:38:16.421 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:38:16.695 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:38:16.695 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:38:46.722 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:38:46.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:38:46.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:38:46.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:38:46.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:38:47.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:38:47.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:38:47.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:38:47.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:38:47.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:38:47.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:38:47.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:38:47.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:38:49.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:38:49.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:38:49.643 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:38:49.644 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:38:49.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:38:49.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:38:49.675 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:38:49.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:38:49.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:38:49.676 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:38:49.676 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:38:49.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:38:49.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:38:49.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:38:49.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:38:49.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:38:49.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:38:49.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:38:50.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:38:50.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:38:50.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:38:50.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:38:50.012 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:38:50.097 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:38:29
2026-06-03T23:38:50.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87352, datetime.datetime(2026, 6, 3, 23, 38, 29), datetime.datetime(2026, 6, 3, 23, 38, 29), 'salt', 1.83, 100.14, None, 42.41, 128.75, -0.02, 821.89, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T23:38:50.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:38:50.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:38:50.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:38:29, diff=21.103959s, valid=True
2026-06-03T23:38:50.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:38:50.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:38:50.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:38:12, diff=38.107094s, valid=True
2026-06-03T23:38:50.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:38:50.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:38:50.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:38:25, diff=25.113927s, valid=True
2026-06-03T23:38:50.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:38:50.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:38:50.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:38:50.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:38:50.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:38:50.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:38:50.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:38:12, diff=38.117039s, valid=True
2026-06-03T23:38:50.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:38:50.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:38:50.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:38:50.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96927.117709s, valid=True
2026-06-03T23:38:50.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:38:50.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:38:50.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:38:50.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:38:50.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:38:50.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:38:50.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:38:50.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:38:50.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:38:50.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:38:50.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:38:50.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:38:50.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:38:50.435 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:38:50.633 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:38:50.966 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:38:51.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:38:51.066 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:38:51.066 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:38:51.489 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:38:51.489 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:39:21.519 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:39:21.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:39:21.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:39:21.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:39:21.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:39:22.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:39:22.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:39:22.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:39:22.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:39:22.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:39:22.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:39:22.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:39:22.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:39:24.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:39:24.579 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:39:24.580 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:39:24.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:39:24.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:39:24.605 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:39:24.606 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:39:24.606 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:39:24.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:39:24.607 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:39:24.607 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:39:24.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:39:24.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:39:24.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:39:24.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:39:24.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:39:24.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:39:24.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:39:25.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:39:25.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:39:25.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:39:25.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:39:25.024 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:39:25.097 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:39:00
2026-06-03T23:39:25.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87353, datetime.datetime(2026, 6, 3, 23, 39), datetime.datetime(2026, 6, 3, 23, 38, 59), 'salt', 1.8, 100.24, None, 47.21, 124.08, -0.03, 822.13, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T23:39:25.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:39:25.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:39:25.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:38:59, diff=26.103355s, valid=True
2026-06-03T23:39:25.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:39:25.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:39:25.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:39:12, diff=13.106209s, valid=True
2026-06-03T23:39:25.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:39:25.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:39:25.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:38:55, diff=30.112754s, valid=True
2026-06-03T23:39:25.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:39:25.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:39:25.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:39:25.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:39:25.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:39:25.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:39:25.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:39:12, diff=13.11577s, valid=True
2026-06-03T23:39:25.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:39:25.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:39:25.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:39:25.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96962.116414s, valid=True
2026-06-03T23:39:25.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:39:25.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:39:25.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:39:25.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:39:25.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:39:25.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:39:25.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:39:25.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:39:25.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:39:25.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:39:25.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:39:25.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:39:25.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:39:25.427 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:39:25.624 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:39:25.958 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:39:26.059 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:39:26.059 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:39:26.059 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:39:26.253 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:39:26.254 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:39:56.284 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:39:56.284 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:39:56.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:39:56.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:39:56.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:39:56.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:39:56.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:39:56.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:39:56.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:39:56.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:39:56.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:39:56.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:39:56.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:39:59.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:39:59.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:39:59.722 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:39:59.722 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:39:59.733 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:39:59.747 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:39:59.748 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:39:59.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:39:59.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:39:59.749 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:39:59.749 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:39:59.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:39:59.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:39:59.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:39:59.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:39:59.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:40:00.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:40:00.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:40:00.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:40:00.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:40:00.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:40:00.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:40:00.065 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:40:00.138 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:39:30
2026-06-03T23:40:00.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87354, datetime.datetime(2026, 6, 3, 23, 39, 30), datetime.datetime(2026, 6, 3, 23, 39, 29), 'salt', 1.86, 100.17, None, 40.43, 113.16, -0.03, 821.89, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:40:00.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:40:00.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:40:00.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:39:29, diff=31.14479s, valid=True
2026-06-03T23:40:00.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:40:00.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:40:00.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:39:12, diff=48.1477s, valid=True
2026-06-03T23:40:00.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:40:00.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:40:00.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:39:26, diff=34.154493s, valid=True
2026-06-03T23:40:00.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:40:00.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:40:00.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:40:00.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:40:00.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:40:00.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:40:00.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:39:12, diff=48.15864s, valid=True
2026-06-03T23:40:00.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:40:00.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:40:00.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:40:00.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=96997.159324s, valid=True
2026-06-03T23:40:00.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:40:00.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:40:00.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:40:00.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:40:00.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:40:00.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:40:00.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:40:00.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:40:00.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:40:00.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:40:00.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:40:00.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:40:00.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:40:00.479 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:40:00.696 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:40:01.031 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:40:01.132 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:40:01.132 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:40:01.132 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:40:01.216 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:40:01.217 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:40:31.220 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:40:31.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:40:31.221 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:40:31.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:40:31.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:40:31.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:40:31.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:40:31.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:40:31.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:40:31.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:40:31.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:40:31.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:40:31.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:40:35.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:40:35.823 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:40:35.824 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:40:35.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:40:35.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:40:35.848 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:40:35.849 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:40:35.849 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:40:35.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:40:35.850 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:40:35.850 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:40:35.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:40:35.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:40:35.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:40:36.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:40:36.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:40:36.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:40:36.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:40:36.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:40:36.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:40:36.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:40:36.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:40:36.197 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:40:36.274 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:40:31
2026-06-03T23:40:36.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87356, datetime.datetime(2026, 6, 3, 23, 40, 31), datetime.datetime(2026, 6, 3, 23, 40, 30), 'salt', 1.8, 100.1, None, 40.61, 121.85, -0.01, 821.89, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:40:36.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:40:36.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:40:36.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:40:30, diff=6.282084s, valid=True
2026-06-03T23:40:36.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:40:36.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:40:36.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:40:12, diff=24.285597s, valid=True
2026-06-03T23:40:36.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:40:36.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:40:36.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:40:26, diff=10.293764s, valid=True
2026-06-03T23:40:36.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:40:36.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:40:36.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:40:36.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:40:36.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:40:36.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:40:36.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:40:12, diff=24.297478s, valid=True
2026-06-03T23:40:36.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:40:36.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:40:36.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:40:36.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97033.298285s, valid=True
2026-06-03T23:40:36.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:40:36.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:40:36.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:40:36.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:40:36.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:40:36.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:40:36.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:40:36.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:40:36.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:40:36.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:40:36.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:40:36.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:40:36.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:40:36.619 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:40:36.816 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:40:37.150 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:40:37.251 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:40:37.251 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:40:37.251 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:40:37.438 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:40:37.439 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:41:07.451 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:41:07.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:41:07.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:41:07.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:41:07.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:41:08.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:41:08.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:41:08.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:41:08.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:41:08.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:41:08.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:41:08.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:41:08.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:41:10.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:41:10.865 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:41:10.866 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:41:10.866 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:41:10.878 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:41:10.891 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:41:10.892 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:41:10.892 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:41:10.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:41:10.893 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:41:10.893 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:41:10.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:41:11.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:41:11.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:41:11.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:41:11.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:41:11.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:41:11.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:41:11.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:41:11.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:41:11.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:41:11.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:41:11.218 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:41:11.287 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:41:01
2026-06-03T23:41:11.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87357, datetime.datetime(2026, 6, 3, 23, 41, 1), datetime.datetime(2026, 6, 3, 23, 41, 1), 'salt', 1.8, 100.14, None, 37.47, 127.72, -0.02, 821.95, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:41:11.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:41:11.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:41:11.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:41:01, diff=10.29343s, valid=True
2026-06-03T23:41:11.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:41:11.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:41:11.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:40:12, diff=59.296284s, valid=True
2026-06-03T23:41:11.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:41:11.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:41:11.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:41:00, diff=11.303121s, valid=True
2026-06-03T23:41:11.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:41:11.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:41:11.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:41:11.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:41:11.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:41:11.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:41:11.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:40:12, diff=59.306172s, valid=True
2026-06-03T23:41:11.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:41:11.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:41:11.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:41:11.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97068.306832s, valid=True
2026-06-03T23:41:11.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:41:11.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:41:11.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:41:11.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:41:11.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:41:11.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:41:11.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:41:11.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:41:11.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:41:11.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:41:11.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:41:11.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:41:11.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:41:11.625 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:41:11.823 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:41:12.216 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:41:12.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:41:12.316 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:41:12.316 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:41:12.405 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:41:12.405 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:41:42.415 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:41:42.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:41:42.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:41:42.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:41:42.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:41:42.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:41:42.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:41:42.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:41:42.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:41:42.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:41:42.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:41:42.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:41:42.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:41:45.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:41:45.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:41:45.566 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:41:45.566 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:41:45.575 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:41:45.587 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:41:45.587 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:41:45.587 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:41:45.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:41:45.587 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:41:45.588 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:41:45.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:41:45.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:41:45.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:41:45.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:41:45.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:41:45.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:41:45.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:41:45.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:41:45.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:41:45.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:41:45.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:41:45.867 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:41:45.940 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:41:32
2026-06-03T23:41:45.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87358, datetime.datetime(2026, 6, 3, 23, 41, 32), datetime.datetime(2026, 6, 3, 23, 41, 31), 'salt', 1.86, 100.2, None, 45.59, 106.13, -0.03, 821.76, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:41:45.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:41:45.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:41:45.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:41:31, diff=14.947565s, valid=True
2026-06-03T23:41:45.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:41:45.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:41:45.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:40:12, diff=93.950716s, valid=True
2026-06-03T23:41:45.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:41:45.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:41:45.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:41:27, diff=18.958244s, valid=True
2026-06-03T23:41:45.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:41:45.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:41:45.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:41:45.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:41:45.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:41:45.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:41:45.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:40:12, diff=93.96157s, valid=True
2026-06-03T23:41:45.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:41:45.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:41:45.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:41:45.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97102.962296s, valid=True
2026-06-03T23:41:45.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:41:45.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:41:45.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:41:45.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:41:45.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:41:46.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:41:46.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:41:46.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:41:46.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:41:46.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:41:46.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:41:46.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:41:46.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:41:46.627 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:41:46.825 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:41:47.158 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:41:47.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:41:47.259 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:41:47.259 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:41:47.442 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:41:47.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:42:17.466 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:42:17.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:42:17.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:42:17.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:42:17.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:42:18.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:42:18.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:42:18.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:42:18.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:42:18.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:42:18.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:42:18.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:42:18.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:42:20.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:42:20.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:42:20.931 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:42:20.932 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:42:20.943 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:42:20.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:42:20.957 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:42:20.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:42:20.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:42:20.958 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:42:20.958 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:42:20.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:42:21.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:42:21.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:42:21.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:42:21.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:42:21.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:42:21.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:42:21.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:42:21.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:42:21.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:42:21.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:42:21.318 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:42:21.391 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:42:03
2026-06-03T23:42:21.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87359, datetime.datetime(2026, 6, 3, 23, 42, 3), datetime.datetime(2026, 6, 3, 23, 42, 2), 'salt', 1.8, 100.17, None, 45.9, 113.79, -0.02, 821.82, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:42:21.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:42:21.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:42:21.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:42:02, diff=19.398398s, valid=True
2026-06-03T23:42:21.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:42:21.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:42:21.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:40:12, diff=129.401719s, valid=True
2026-06-03T23:42:21.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:42:21.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:42:21.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:41:57, diff=24.409013s, valid=True
2026-06-03T23:42:21.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:42:21.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:42:21.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:42:21.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:42:21.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:42:21.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:42:21.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:40:12, diff=129.412202s, valid=True
2026-06-03T23:42:21.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:42:21.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:42:21.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:42:21.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97138.412874s, valid=True
2026-06-03T23:42:21.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:42:21.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:42:21.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:42:21.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:42:21.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:42:21.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:42:21.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:42:21.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:42:21.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:42:21.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:42:21.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:42:21.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:42:21.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:42:21.730 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:42:22.000 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:42:22.334 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:42:22.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:42:22.435 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:42:22.435 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:42:22.686 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:42:22.686 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:42:52.716 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:42:52.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:42:52.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:42:53.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:42:53.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:42:53.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:42:53.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:42:53.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:42:53.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:42:53.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:42:53.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:42:53.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:42:53.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:42:56.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:42:56.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:42:56.122 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:42:56.123 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:42:56.134 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:42:56.146 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:42:56.147 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:42:56.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:42:56.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:42:56.148 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:42:56.148 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:42:56.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:42:56.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:42:56.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:42:56.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:42:56.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:42:56.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:42:56.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:42:56.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:42:56.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:42:56.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:42:56.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:42:56.500 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:42:56.574 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:42:33
2026-06-03T23:42:56.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87360, datetime.datetime(2026, 6, 3, 23, 42, 33), datetime.datetime(2026, 6, 3, 23, 42, 32), 'salt', 1.83, 100.17, None, 44.21, 120.46, -0.02, 821.89, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T23:42:56.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:42:56.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:42:56.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:42:32, diff=24.582451s, valid=True
2026-06-03T23:42:56.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:42:56.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:42:56.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:43:12, diff=-15.413951s, valid=True
2026-06-03T23:42:56.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:42:56.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:42:56.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:42:28, diff=28.594516s, valid=True
2026-06-03T23:42:56.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:42:56.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:42:56.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:42:56.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:42:56.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:42:56.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:42:56.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:43:12, diff=-15.400979s, valid=True
2026-06-03T23:42:56.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:42:56.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:42:56.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:42:56.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97173.599914s, valid=True
2026-06-03T23:42:56.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:42:56.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:42:56.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:42:56.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:42:56.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:42:56.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:42:56.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:42:56.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:42:56.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:42:56.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:42:56.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:42:56.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:42:56.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:42:56.922 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:42:57.120 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:42:57.453 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:42:57.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:42:57.554 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:42:57.555 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:42:57.640 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:42:57.640 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:43:27.642 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:43:27.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:43:27.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:43:27.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:43:27.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:43:28.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:43:28.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:43:28.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:43:28.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:43:28.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:43:28.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:43:28.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:43:28.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:43:30.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:43:30.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:43:30.820 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:43:30.820 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:43:30.829 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:43:30.842 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:43:30.843 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:43:30.843 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:43:30.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:43:30.844 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:43:30.844 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:43:30.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:43:30.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:43:30.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:43:31.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:43:31.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:43:31.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:43:31.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:43:31.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:43:31.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:43:31.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:43:31.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:43:31.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:43:31.270 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:43:04
2026-06-03T23:43:31.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87361, datetime.datetime(2026, 6, 3, 23, 43, 4), datetime.datetime(2026, 6, 3, 23, 43, 3), 'salt', 1.86, 100.17, None, 49.71, 125.56, -0.03, 822.01, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T23:43:31.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:43:31.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:43:31.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:43:03, diff=28.278185s, valid=True
2026-06-03T23:43:31.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:43:31.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:43:31.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:43:12, diff=19.281709s, valid=True
2026-06-03T23:43:31.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:43:31.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:43:31.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:42:58, diff=33.289956s, valid=True
2026-06-03T23:43:31.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:43:31.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:43:31.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:43:31.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:43:31.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:43:31.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:43:31.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:43:12, diff=19.293636s, valid=True
2026-06-03T23:43:31.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:43:31.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:43:31.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:43:31.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97208.294434s, valid=True
2026-06-03T23:43:31.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:43:31.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:43:31.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:43:31.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:43:31.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:43:31.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:43:31.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:43:31.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:43:31.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:43:31.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:43:31.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:43:31.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:43:31.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:43:31.688 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:43:31.884 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:43:32.218 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:43:32.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:43:32.320 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:43:32.320 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:43:32.475 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:43:32.475 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:44:02.506 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:44:02.506 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:44:02.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:44:02.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:44:02.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:44:02.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:44:02.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:44:02.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:44:02.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:44:02.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:44:02.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:44:02.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:44:02.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:44:05.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:44:05.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:44:05.292 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:44:05.292 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:44:05.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:44:05.316 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:44:05.317 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:44:05.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:44:05.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:44:05.318 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:44:05.318 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:44:05.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:44:05.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-03T23:44:05.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:44:05.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-03T23:44:05.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:44:05.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:44:05.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:44:05.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:44:05.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:44:05.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:44:05.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:44:05.682 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:44:05.767 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:44:04
2026-06-03T23:44:05.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87363, datetime.datetime(2026, 6, 3, 23, 44, 4), datetime.datetime(2026, 6, 3, 23, 44, 4), 'salt', 1.8, 100.17, None, 44.17, 119.08, -0.02, 822.07, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T23:44:05.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:44:05.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-03T23:44:05.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:44:04, diff=1.775193s, valid=True
2026-06-03T23:44:05.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:44:05.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:44:05.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:44:12, diff=-6.221328s, valid=True
2026-06-03T23:44:05.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:44:05.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-03T23:44:05.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:43:58, diff=7.786981s, valid=True
2026-06-03T23:44:05.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:44:05.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:44:05.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:44:05.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:44:05.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:44:05.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:44:05.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:44:12, diff=-6.209304s, valid=True
2026-06-03T23:44:05.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:44:05.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:44:05.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:44:05.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97242.791511s, valid=True
2026-06-03T23:44:05.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:44:05.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:44:05.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:44:05.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:44:05.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:44:05.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:44:05.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:44:05.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:44:05.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:44:05.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:44:05.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:44:06.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:44:06.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:44:06.112 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:44:06.308 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:44:06.641 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:44:06.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:44:06.741 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:44:06.741 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:44:06.899 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:44:06.900 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:44:36.922 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:44:36.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:44:36.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:44:37.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:44:37.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:44:37.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:44:37.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:44:37.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:44:37.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:44:38.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:44:38.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:44:38.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:44:38.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:44:40.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:44:40.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:44:40.771 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:44:40.771 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:44:40.782 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:44:40.795 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:44:40.795 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:44:40.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:44:40.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:44:40.796 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:44:40.796 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:44:40.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:44:40.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:44:40.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:44:41.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:44:41.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:44:41.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:44:41.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:44:41.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:44:41.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:44:41.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:44:41.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:44:41.152 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:44:41.225 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:44:34
2026-06-03T23:44:41.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87364, datetime.datetime(2026, 6, 3, 23, 44, 34), datetime.datetime(2026, 6, 3, 23, 44, 34), 'salt', 1.8, 100.14, None, 47.7, 122.72, -0.02, 821.76, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T23:44:41.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:44:41.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:44:41.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:44:34, diff=7.23248s, valid=True
2026-06-03T23:44:41.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:44:41.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:44:41.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:45:12, diff=-30.764051s, valid=True
2026-06-03T23:44:41.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:44:41.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:44:41.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:44:29, diff=12.244086s, valid=True
2026-06-03T23:44:41.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:44:41.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:44:41.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:44:41.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:44:41.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:44:41.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:44:41.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:45:12, diff=-30.752113s, valid=True
2026-06-03T23:44:41.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:44:41.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:44:41.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:44:41.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97278.248723s, valid=True
2026-06-03T23:44:41.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:44:41.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:44:41.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:44:41.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:44:41.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:44:41.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:44:41.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:44:41.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:44:41.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:44:41.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:44:41.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:44:41.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:44:41.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:44:41.636 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:44:41.834 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:44:42.168 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:44:42.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:44:42.269 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:44:42.269 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:44:42.467 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:44:42.468 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:45:12.498 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:45:12.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:45:12.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:45:12.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:45:12.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:45:12.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:45:12.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:45:12.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:45:12.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:45:12.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:45:12.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:45:12.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:45:12.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:45:15.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:45:15.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:45:15.385 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:45:15.385 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:45:15.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:45:15.409 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:45:15.410 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:45:15.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:45:15.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:45:15.411 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:45:15.411 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:45:15.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:45:15.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:45:15.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:45:15.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:45:15.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:45:15.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:45:15.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:45:15.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:45:15.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:45:15.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:45:15.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:45:15.754 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:45:15.832 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:45:05
2026-06-03T23:45:15.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87365, datetime.datetime(2026, 6, 3, 23, 45, 5), datetime.datetime(2026, 6, 3, 23, 45, 4), 'salt', 1.76, 100.14, None, 46.82, 126.97, -0.02, 821.82, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T23:45:15.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:45:15.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:45:15.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:45:04, diff=11.840204s, valid=True
2026-06-03T23:45:15.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:45:15.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:45:15.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:45:12, diff=3.843691s, valid=True
2026-06-03T23:45:15.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:45:15.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:45:15.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:44:59, diff=16.851882s, valid=True
2026-06-03T23:45:15.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:45:15.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:45:15.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:45:15.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:45:15.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:45:15.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:45:15.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:45:12, diff=3.855612s, valid=True
2026-06-03T23:45:15.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:45:15.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:45:15.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:45:15.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97312.856427s, valid=True
2026-06-03T23:45:15.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:45:15.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:45:15.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:45:15.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:45:15.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:45:15.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:45:15.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:45:15.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:45:15.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:45:15.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:45:16.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:45:16.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:45:16.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:45:16.177 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:45:16.374 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:45:16.708 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:45:16.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:45:16.808 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:45:16.808 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:45:17.002 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:45:17.002 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:45:47.010 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:45:47.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:45:47.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:45:47.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:45:47.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:45:47.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:45:47.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:45:47.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:45:47.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:45:47.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:45:47.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:45:47.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:45:47.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:45:50.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:45:50.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:45:50.179 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:45:50.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:45:50.187 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:45:50.199 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:45:50.200 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:45:50.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:45:50.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:45:50.201 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:45:50.201 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:45:50.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:45:50.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:45:50.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:45:50.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:45:50.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:45:50.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:45:50.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:45:50.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:45:50.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:45:50.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:45:50.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:45:50.626 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:45:50.703 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:45:35
2026-06-03T23:45:50.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87366, datetime.datetime(2026, 6, 3, 23, 45, 35), datetime.datetime(2026, 6, 3, 23, 45, 34), 'salt', 1.76, 100.1, None, 48.02, 131.15, -0.02, 821.64, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:45:50.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:45:50.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:45:50.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:45:34, diff=16.70974s, valid=True
2026-06-03T23:45:50.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:45:50.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:45:50.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:46:12, diff=-21.287383s, valid=True
2026-06-03T23:45:50.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:45:50.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:45:50.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:45:29, diff=21.719284s, valid=True
2026-06-03T23:45:50.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:45:50.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:45:50.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:45:50.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:45:50.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:45:50.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:45:50.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:46:12, diff=-21.277672s, valid=True
2026-06-03T23:45:50.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:45:50.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:45:50.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:45:50.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97347.722981s, valid=True
2026-06-03T23:45:50.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:45:50.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:45:50.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:45:50.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:45:50.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:45:50.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:45:50.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:45:50.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:45:50.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:45:50.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:45:50.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:45:50.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:45:50.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:45:51.040 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:45:51.244 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:45:51.581 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:45:51.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:45:51.685 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:45:51.686 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:45:51.957 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:45:51.957 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:46:21.958 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:46:21.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:46:21.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:46:22.117 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:46:22.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:46:22.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:46:22.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:46:22.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:46:22.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:46:22.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:46:22.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:46:22.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:46:22.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:46:24.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:46:24.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:46:24.809 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:46:24.809 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:46:24.820 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:46:24.833 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:46:24.834 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:46:24.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:46:24.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:46:24.835 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:46:24.835 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:46:24.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:46:24.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:46:24.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:46:25.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:46:25.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:46:25.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:46:25.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:46:25.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:46:25.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:46:25.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:46:25.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:46:25.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:46:25.260 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:46:05
2026-06-03T23:46:25.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87367, datetime.datetime(2026, 6, 3, 23, 46, 5), datetime.datetime(2026, 6, 3, 23, 46, 5), 'salt', 1.76, 100.2, None, 41.49, 127.88, -0.03, 821.95, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:46:25.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:46:25.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:46:25.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:46:05, diff=20.268016s, valid=True
2026-06-03T23:46:25.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:46:25.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:46:25.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:46:12, diff=13.271396s, valid=True
2026-06-03T23:46:25.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:46:25.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:46:25.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:46:00, diff=25.280755s, valid=True
2026-06-03T23:46:25.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:46:25.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:46:25.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:46:25.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:46:25.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:46:25.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:46:25.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:46:12, diff=13.284409s, valid=True
2026-06-03T23:46:25.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:46:25.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:46:25.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:46:25.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97382.28521s, valid=True
2026-06-03T23:46:25.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:46:25.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:46:25.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:46:25.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:46:25.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:46:25.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:46:25.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:46:25.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:46:25.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:46:25.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:46:25.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:46:25.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:46:25.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:46:25.631 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:46:25.835 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:46:26.171 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:46:26.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:46:26.272 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:46:26.272 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:46:26.573 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:46:26.574 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:46:56.583 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:46:56.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:46:56.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:46:56.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:46:56.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:46:57.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:46:57.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:46:57.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:46:57.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:46:57.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:46:57.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:46:57.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:46:57.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:46:59.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:46:59.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:46:59.744 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:46:59.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:46:59.756 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:46:59.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:46:59.769 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:46:59.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:46:59.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:46:59.770 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:46:59.771 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:46:59.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:46:59.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:46:59.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:46:59.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:46:59.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:47:00.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:47:00.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:47:00.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:47:00.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:47:00.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:47:00.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:47:00.075 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:47:00.146 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:46:36
2026-06-03T23:47:00.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87368, datetime.datetime(2026, 6, 3, 23, 46, 36), datetime.datetime(2026, 6, 3, 23, 46, 35), 'salt', 1.76, 100.07, None, 39.06, 110.03, -0.01, 822.01, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:47:00.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:47:00.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:47:00.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:46:35, diff=25.153793s, valid=True
2026-06-03T23:47:00.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:47:00.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:47:00.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:47:12, diff=-11.842966s, valid=True
2026-06-03T23:47:00.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:47:00.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:47:00.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:46:30, diff=30.164539s, valid=True
2026-06-03T23:47:00.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:47:00.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:47:00.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:47:00.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:47:00.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:47:00.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:47:00.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:47:12, diff=-11.831818s, valid=True
2026-06-03T23:47:00.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:47:00.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:47:00.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:47:00.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97417.169042s, valid=True
2026-06-03T23:47:00.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:47:00.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:47:00.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:47:00.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:47:00.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:47:00.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:47:00.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:47:00.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:47:00.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:47:00.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:47:00.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:47:00.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:47:00.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:47:00.489 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:47:00.686 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:47:01.019 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:47:01.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:47:01.120 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:47:01.120 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:47:01.321 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:47:01.321 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:47:31.351 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:47:31.351 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:47:31.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:47:31.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:47:31.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:47:31.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:47:31.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:47:31.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:47:31.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:47:31.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:47:31.926 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:47:31.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:47:31.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:47:34.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:47:34.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:47:34.418 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:47:34.418 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:47:34.427 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:47:34.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:47:34.441 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:47:34.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:47:34.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:47:34.442 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:47:34.442 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:47:34.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:47:34.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:47:34.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:47:34.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:47:34.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:47:34.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:47:34.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:47:34.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:47:34.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:47:34.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:47:34.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:47:34.790 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:47:34.860 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:47:06
2026-06-03T23:47:34.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87369, datetime.datetime(2026, 6, 3, 23, 47, 6), datetime.datetime(2026, 6, 3, 23, 47, 5), 'salt', 1.8, 100.14, None, 38.95, 128.85, -0.02, 821.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:47:34.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:47:34.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:47:34.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:47:05, diff=29.867427s, valid=True
2026-06-03T23:47:34.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:47:34.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:47:34.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:47:12, diff=22.870898s, valid=True
2026-06-03T23:47:34.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:47:34.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:47:34.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:47:05, diff=29.879029s, valid=True
2026-06-03T23:47:34.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:47:34.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:47:34.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:47:34.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:47:34.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:47:34.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:47:34.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:47:12, diff=22.882701s, valid=True
2026-06-03T23:47:34.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:47:34.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:47:34.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:47:34.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97451.883483s, valid=True
2026-06-03T23:47:34.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:47:34.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:47:34.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:47:34.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:47:34.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:47:34.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:47:34.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:47:34.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:47:34.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:47:35.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:47:35.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:47:35.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:47:35.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:47:35.207 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:47:35.404 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:47:35.800 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:47:35.900 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:47:35.900 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:47:35.901 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:47:36.104 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:47:36.104 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:48:06.126 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:48:06.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:48:06.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:48:06.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:48:06.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:48:06.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:48:06.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:48:06.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:48:06.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:48:06.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:48:06.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:48:06.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:48:06.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:48:09.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:48:09.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:48:09.196 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:48:09.196 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:48:09.205 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:48:09.217 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:48:09.217 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:48:09.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:48:09.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:48:09.218 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:48:09.218 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:48:09.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:48:09.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:48:09.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:48:09.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:48:09.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:48:09.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:48:09.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:48:09.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:48:09.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:48:09.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:48:09.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:48:09.505 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:48:09.579 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:48:06
2026-06-03T23:48:09.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87371, datetime.datetime(2026, 6, 3, 23, 48, 6), datetime.datetime(2026, 6, 3, 23, 48, 6), 'salt', 1.76, 100.17, None, 44.53, 119.83, -0.03, 821.7, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T23:48:09.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:48:09.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:48:09.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:48:06, diff=3.58651s, valid=True
2026-06-03T23:48:09.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:48:09.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:48:09.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:48:12, diff=-2.410324s, valid=True
2026-06-03T23:48:09.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:48:09.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:48:09.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:48:01, diff=8.597046s, valid=True
2026-06-03T23:48:09.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:48:09.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:48:09.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:48:09.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:48:09.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:48:09.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:48:09.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:48:12, diff=-2.399581s, valid=True
2026-06-03T23:48:09.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:48:09.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:48:09.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:48:09.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97486.601161s, valid=True
2026-06-03T23:48:09.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:48:09.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:48:09.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:48:09.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:48:09.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:48:09.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:48:09.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:48:09.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:48:09.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:48:09.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:48:09.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:48:09.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:48:09.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:48:09.936 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:48:10.152 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:48:10.486 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:48:10.587 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:48:10.587 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:48:10.587 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:48:10.844 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:48:10.844 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:48:40.874 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:48:40.874 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:48:40.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:48:41.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:48:41.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:48:41.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:48:41.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:48:41.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:48:41.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:48:41.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:48:41.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:48:41.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:48:41.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:48:44.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:48:44.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:48:44.195 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:48:44.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:48:44.204 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:48:44.215 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:48:44.216 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:48:44.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:48:44.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:48:44.216 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:48:44.216 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:48:44.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:48:44.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:48:44.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:48:44.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:48:44.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:48:44.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:48:44.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:48:44.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:48:44.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:48:44.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:48:44.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:48:44.506 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:48:44.580 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:48:37
2026-06-03T23:48:44.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87372, datetime.datetime(2026, 6, 3, 23, 48, 37), datetime.datetime(2026, 6, 3, 23, 48, 36), 'salt', 1.8, 100.17, None, 49.11, 116.44, -0.02, 821.76, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T23:48:44.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:48:44.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:48:44.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:48:36, diff=8.58765s, valid=True
2026-06-03T23:48:44.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:48:44.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:48:44.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:49:12, diff=-27.409097s, valid=True
2026-06-03T23:48:44.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:48:44.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:48:44.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:48:36, diff=8.598599s, valid=True
2026-06-03T23:48:44.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:48:44.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:48:44.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:48:44.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:48:44.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:48:44.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:48:44.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:49:12, diff=-27.397928s, valid=True
2026-06-03T23:48:44.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:48:44.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:48:44.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:48:44.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97521.602826s, valid=True
2026-06-03T23:48:44.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:48:44.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:48:44.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:48:44.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:48:44.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:48:44.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:48:44.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:48:44.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:48:44.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:48:44.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:48:44.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:48:44.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:48:44.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:48:44.919 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:48:45.190 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:48:45.522 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:48:45.623 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:48:45.623 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:48:45.623 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:48:45.824 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:48:45.824 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:49:15.854 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:49:15.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:49:15.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:49:16.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:49:16.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:49:16.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:49:16.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:49:16.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:49:16.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:49:16.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:49:16.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:49:16.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:49:16.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:49:18.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:49:18.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:49:18.841 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:49:18.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:49:18.852 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:49:18.865 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:49:18.865 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:49:18.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:49:18.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:49:18.866 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:49:18.867 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:49:18.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:49:19.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:49:19.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:49:19.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:49:19.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:49:19.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:49:19.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:49:19.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:49:19.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:49:19.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:49:19.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:49:19.200 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:49:19.269 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:49:07
2026-06-03T23:49:19.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87373, datetime.datetime(2026, 6, 3, 23, 49, 7), datetime.datetime(2026, 6, 3, 23, 49, 6), 'salt', 1.73, 100.1, None, 41.78, 128.31, -0.01, 821.82, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T23:49:19.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:49:19.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:49:19.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:49:06, diff=13.275881s, valid=True
2026-06-03T23:49:19.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:49:19.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:49:19.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:49:12, diff=7.278712s, valid=True
2026-06-03T23:49:19.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:49:19.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:49:19.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:49:01, diff=18.285374s, valid=True
2026-06-03T23:49:19.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:49:19.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:49:19.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:49:19.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:49:19.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:49:19.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:49:19.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:49:12, diff=7.28835s, valid=True
2026-06-03T23:49:19.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:49:19.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:49:19.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:49:19.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97556.289001s, valid=True
2026-06-03T23:49:19.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:49:19.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:49:19.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:49:19.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:49:19.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:49:19.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:49:19.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:49:19.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:49:19.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:49:19.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:49:19.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:49:19.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:49:19.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:49:19.602 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:49:19.799 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:49:20.146 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:49:20.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:49:20.246 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:49:20.246 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:49:20.403 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:49:20.403 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:49:50.433 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:49:50.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:49:50.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:49:50.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:49:50.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:49:51.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:49:51.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:49:51.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:49:51.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:49:51.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:49:51.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:49:51.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:49:51.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:49:53.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:49:53.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:49:53.697 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:49:53.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:49:53.708 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:49:53.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:49:53.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:49:53.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:49:53.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:49:53.722 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:49:53.722 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:49:53.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:49:53.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:49:53.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:49:53.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:49:53.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:49:54.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:49:54.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:49:54.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:49:54.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:49:54.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:49:54.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:49:54.050 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:49:54.120 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:49:37
2026-06-03T23:49:54.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87374, datetime.datetime(2026, 6, 3, 23, 49, 37), datetime.datetime(2026, 6, 3, 23, 49, 36), 'salt', 1.76, 100.14, None, 43.54, 117.9, -0.02, 821.95, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T23:49:54.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:49:54.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:49:54.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:49:36, diff=18.127998s, valid=True
2026-06-03T23:49:54.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:49:54.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:49:54.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:50:12, diff=-17.86861s, valid=True
2026-06-03T23:49:54.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:49:54.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:49:54.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:49:31, diff=23.139376s, valid=True
2026-06-03T23:49:54.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:49:54.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:49:54.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:49:54.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:49:54.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:49:54.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:49:54.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:50:12, diff=-17.856972s, valid=True
2026-06-03T23:49:54.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:49:54.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:49:54.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:49:54.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97591.143859s, valid=True
2026-06-03T23:49:54.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:49:54.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:49:54.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:49:54.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:49:54.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:49:54.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:49:54.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:49:54.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:49:54.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:49:54.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:49:54.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:49:54.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:49:54.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:49:54.534 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:49:54.732 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:49:55.068 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:49:55.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:49:55.171 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:49:55.171 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:49:55.364 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:49:55.365 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:50:25.374 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:50:25.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:50:25.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:50:25.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:50:25.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:50:25.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:50:25.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:50:25.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:50:25.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:50:25.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:50:25.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:50:25.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:50:25.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:50:28.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:50:29.330 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:50:29.331 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:50:29.331 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:50:29.342 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:50:29.355 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:50:29.395 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:50:29.395 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:50:29.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:50:29.395 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:50:29.396 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:50:29.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:50:29.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:50:29.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:50:29.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:50:29.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:50:29.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:50:29.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:50:29.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:50:29.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:50:29.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:50:29.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:50:29.728 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:50:29.800 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:50:07
2026-06-03T23:50:29.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87375, datetime.datetime(2026, 6, 3, 23, 50, 7), datetime.datetime(2026, 6, 3, 23, 50, 7), 'salt', 1.66, 100.04, None, 42.73, 123.82, -0.01, 821.7, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T23:50:29.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:50:29.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:50:29.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:50:07, diff=22.808091s, valid=True
2026-06-03T23:50:29.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:50:29.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:50:29.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:50:12, diff=17.811666s, valid=True
2026-06-03T23:50:29.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:50:29.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:50:29.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:50:02, diff=27.8198s, valid=True
2026-06-03T23:50:29.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:50:29.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:50:29.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:50:29.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:50:29.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:50:29.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:50:29.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:50:12, diff=17.823644s, valid=True
2026-06-03T23:50:29.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:50:29.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:50:29.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:50:29.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97626.824461s, valid=True
2026-06-03T23:50:29.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:50:29.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:50:29.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:50:29.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:50:29.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:50:29.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:50:29.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:50:29.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:50:29.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:50:29.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:50:30.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:50:30.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:50:30.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:50:30.157 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:50:30.364 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:50:30.705 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:50:30.807 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:50:30.807 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:50:30.807 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:50:31.890 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:50:31.890 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:51:01.920 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:51:01.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:51:01.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:51:02.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:51:02.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:51:02.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:51:02.353 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:51:02.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:51:02.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:51:02.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:51:02.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:51:02.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:51:02.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:51:04.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:51:04.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:51:04.947 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:51:04.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:51:04.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:51:04.968 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:51:04.968 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:51:04.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:51:04.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:51:04.968 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:51:04.968 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:51:04.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:51:05.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:51:05.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:51:05.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:51:05.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:51:05.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:51:05.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:51:05.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:51:05.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:51:05.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:51:05.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:51:05.298 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:51:05.370 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:50:38
2026-06-03T23:51:05.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87376, datetime.datetime(2026, 6, 3, 23, 50, 38), datetime.datetime(2026, 6, 3, 23, 50, 37), 'salt', 1.73, 100.17, None, 46.26, 125.28, -0.02, 822.01, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T23:51:05.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:51:05.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:51:05.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:50:37, diff=28.378425s, valid=True
2026-06-03T23:51:05.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:51:05.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:51:05.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:51:12, diff=-6.618019s, valid=True
2026-06-03T23:51:05.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:51:05.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:51:05.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:50:32, diff=33.390285s, valid=True
2026-06-03T23:51:05.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:51:05.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:51:05.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:51:05.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:51:05.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:51:05.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:51:05.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:51:12, diff=-6.605966s, valid=True
2026-06-03T23:51:05.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:51:05.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:51:05.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:51:05.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97662.394851s, valid=True
2026-06-03T23:51:05.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:51:05.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:51:05.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:51:05.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:51:05.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:51:05.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:51:05.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:51:05.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:51:05.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:51:05.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:51:05.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:51:05.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:51:05.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:51:05.782 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:51:05.988 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:51:06.331 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:51:06.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:51:06.434 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:51:06.434 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:51:06.698 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:51:06.698 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:51:36.728 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:51:36.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:51:36.728 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:51:37.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:51:37.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:51:37.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:51:37.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:51:37.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:51:37.483 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:51:37.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:51:37.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:51:37.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:51:37.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:51:39.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:51:39.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:51:39.997 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:51:39.997 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:51:40.006 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:51:40.017 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:51:40.018 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:51:40.018 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:51:40.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:51:40.018 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:51:40.018 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:51:40.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:51:40.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:51:40.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:51:40.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:51:40.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:51:40.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:51:40.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:51:40.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:51:40.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:51:40.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:51:40.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:51:40.310 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:51:40.383 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:51:38
2026-06-03T23:51:40.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87378, datetime.datetime(2026, 6, 3, 23, 51, 38), datetime.datetime(2026, 6, 3, 23, 51, 38), 'salt', 1.76, 100.1, None, 41.1, 120.27, -0.02, 821.76, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-03T23:51:40.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:51:40.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:51:40.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:51:38, diff=2.390536s, valid=True
2026-06-03T23:51:40.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:51:40.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:51:40.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:52:12, diff=-31.606093s, valid=True
2026-06-03T23:51:40.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:51:40.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:51:40.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:51:33, diff=7.401438s, valid=True
2026-06-03T23:51:40.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:51:40.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:51:40.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:51:40.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:51:40.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:51:40.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:51:40.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:52:12, diff=-31.595033s, valid=True
2026-06-03T23:51:40.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:51:40.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:51:40.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:51:40.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97697.405716s, valid=True
2026-06-03T23:51:40.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:51:40.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:51:40.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:51:40.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:51:40.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:51:40.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:51:40.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:51:40.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:51:40.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:51:40.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:51:40.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:51:40.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:51:40.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:51:40.725 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:51:40.930 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:51:41.272 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:51:41.373 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:51:41.373 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:51:41.373 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:51:41.604 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:51:41.604 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:52:11.611 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:52:11.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:52:11.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:52:12.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:52:12.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:52:12.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:52:12.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:52:12.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:52:12.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:52:12.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:52:12.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:52:12.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:52:12.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:52:15.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:52:15.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:52:15.291 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:52:15.291 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:52:15.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:52:15.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:52:15.315 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:52:15.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:52:15.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:52:15.316 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:52:15.316 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:52:15.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:52:15.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:52:15.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:52:15.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:52:15.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:52:15.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:52:15.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:52:15.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:52:15.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:52:15.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:52:15.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:52:15.680 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:52:15.756 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:52:09
2026-06-03T23:52:15.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87379, datetime.datetime(2026, 6, 3, 23, 52, 9), datetime.datetime(2026, 6, 3, 23, 52, 8), 'salt', 1.76, 100.17, None, 45.73, 127.84, -0.03, 821.64, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T23:52:15.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:52:15.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:52:15.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:52:08, diff=7.763557s, valid=True
2026-06-03T23:52:15.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:52:15.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:52:15.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:52:12, diff=3.76707s, valid=True
2026-06-03T23:52:15.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:52:15.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:52:15.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:52:03, diff=12.775226s, valid=True
2026-06-03T23:52:15.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:52:15.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:52:15.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:52:15.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:52:15.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:52:15.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:52:15.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:52:12, diff=3.778949s, valid=True
2026-06-03T23:52:15.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:52:15.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:52:15.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:52:15.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97732.779755s, valid=True
2026-06-03T23:52:15.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:52:15.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:52:15.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:52:15.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:52:15.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:52:15.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:52:15.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:52:15.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:52:15.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:52:15.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:52:16.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:52:16.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:52:16.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:52:16.167 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:52:16.374 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:52:16.719 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:52:16.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:52:16.821 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:52:16.821 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:52:16.978 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:52:16.979 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:52:47.008 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:52:47.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:52:47.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:52:47.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:52:47.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:52:47.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:52:47.606 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:52:47.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:52:47.619 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:52:47.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:52:47.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:52:47.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:52:47.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:52:50.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:52:50.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:52:50.056 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:52:50.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:52:50.062 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:52:50.074 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:52:50.075 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:52:50.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:52:50.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:52:50.075 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:52:50.075 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:52:50.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:52:50.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:52:50.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:52:50.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:52:50.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:52:50.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:52:50.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:52:50.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:52:50.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:52:50.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:52:50.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:52:50.367 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:52:50.437 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:52:39
2026-06-03T23:52:50.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87380, datetime.datetime(2026, 6, 3, 23, 52, 39), datetime.datetime(2026, 6, 3, 23, 52, 38), 'salt', 1.83, 100.14, None, 45.66, 123.87, -0.02, 821.89, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-03T23:52:50.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:52:50.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:52:50.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:52:38, diff=12.444681s, valid=True
2026-06-03T23:52:50.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:52:50.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:52:50.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:53:12, diff=-21.552005s, valid=True
2026-06-03T23:52:50.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:52:50.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:52:50.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:52:33, diff=17.455669s, valid=True
2026-06-03T23:52:50.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:52:50.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:52:50.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:52:50.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:52:50.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:52:50.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:52:50.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:53:12, diff=-21.540936s, valid=True
2026-06-03T23:52:50.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:52:50.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:52:50.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:52:50.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97767.45983s, valid=True
2026-06-03T23:52:50.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:52:50.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:52:50.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:52:50.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:52:50.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:52:50.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:52:50.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:52:50.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:52:50.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:52:50.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:52:50.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:52:50.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:52:50.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:52:50.787 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:52:50.997 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:52:51.343 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:52:51.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:52:51.447 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:52:51.447 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:52:51.532 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:52:51.532 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:53:21.562 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:53:21.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:53:21.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:53:21.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:53:21.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:53:22.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:53:22.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:53:22.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:53:22.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:53:22.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:53:22.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:53:22.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:53:22.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:53:24.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:53:24.882 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:53:24.883 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:53:24.883 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:53:24.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:53:24.907 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:53:24.908 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:53:24.908 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:53:24.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:53:24.909 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:53:24.909 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:53:24.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:53:25.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:53:25.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:53:25.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:53:25.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:53:25.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:53:25.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:53:25.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:53:25.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:53:25.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:53:25.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:53:25.237 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:53:25.307 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:53:09
2026-06-03T23:53:25.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87381, datetime.datetime(2026, 6, 3, 23, 53, 9), datetime.datetime(2026, 6, 3, 23, 53, 8), 'salt', 1.8, 100.2, None, 45.2, 123.09, -0.03, 821.7, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:53:25.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:53:25.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:53:25.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:53:08, diff=17.314868s, valid=True
2026-06-03T23:53:25.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:53:25.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:53:25.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:53:12, diff=13.318333s, valid=True
2026-06-03T23:53:25.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:53:25.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:53:25.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:53:03, diff=22.326355s, valid=True
2026-06-03T23:53:25.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:53:25.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:53:25.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:53:25.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:53:25.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:53:25.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:53:25.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:53:12, diff=13.33011s, valid=True
2026-06-03T23:53:25.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:53:25.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:53:25.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:53:25.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97802.330927s, valid=True
2026-06-03T23:53:25.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:53:25.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:53:25.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:53:25.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:53:25.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:53:25.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:53:25.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:53:25.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:53:25.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:53:25.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:53:25.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:53:25.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:53:25.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:53:25.650 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:53:25.858 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:53:26.204 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:53:26.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:53:26.307 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:53:26.307 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:53:26.529 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:53:26.529 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:53:56.559 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:53:56.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:53:56.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:53:56.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:53:56.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:53:57.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:53:57.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:53:57.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:53:57.169 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:53:57.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:53:57.181 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:53:57.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:53:57.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:53:59.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:53:59.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:53:59.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:53:59.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:53:59.730 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:53:59.743 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:53:59.743 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:53:59.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:53:59.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:53:59.744 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:53:59.745 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:53:59.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:53:59.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:53:59.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:53:59.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:53:59.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:54:00.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:54:00.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:54:00.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:54:00.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:54:00.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:54:00.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:54:00.057 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:54:00.128 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:53:39
2026-06-03T23:54:00.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87382, datetime.datetime(2026, 6, 3, 23, 53, 39), datetime.datetime(2026, 6, 3, 23, 53, 39), 'salt', 1.8, 100.17, None, 47.0, 123.87, -0.02, 821.7, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:54:00.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:54:00.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:54:00.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:53:39, diff=21.134701s, valid=True
2026-06-03T23:54:00.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:54:00.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:54:00.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:54:12, diff=-11.862253s, valid=True
2026-06-03T23:54:00.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:54:00.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:54:00.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:53:34, diff=26.145367s, valid=True
2026-06-03T23:54:00.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:54:00.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:54:00.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:54:00.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:54:00.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:54:00.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:54:00.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:54:12, diff=-11.851062s, valid=True
2026-06-03T23:54:00.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:54:00.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:54:00.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:54:00.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97837.149719s, valid=True
2026-06-03T23:54:00.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:54:00.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:54:00.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:54:00.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:54:00.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:54:00.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:54:00.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:54:00.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:54:00.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:54:00.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:54:00.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:54:00.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:54:00.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:54:00.472 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:54:00.739 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:54:01.084 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:54:01.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:54:01.187 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:54:01.187 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:54:01.340 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:54:01.340 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:54:31.342 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:54:31.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:54:31.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:54:31.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:54:31.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:54:31.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:54:31.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:54:31.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:54:31.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:54:31.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:54:31.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:54:31.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:54:31.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:54:35.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:54:35.145 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:54:35.146 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:54:35.146 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:54:35.155 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:54:35.168 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:54:35.168 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:54:35.169 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:54:35.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:54:35.170 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:54:35.170 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:54:35.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:54:35.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:54:35.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:54:35.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:54:35.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:54:35.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:54:35.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:54:35.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:54:35.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:54:35.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:54:35.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:54:35.504 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:54:35.576 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:54:10
2026-06-03T23:54:35.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87383, datetime.datetime(2026, 6, 3, 23, 54, 10), datetime.datetime(2026, 6, 3, 23, 54, 9), 'salt', 1.7, 100.17, None, 43.75, 110.52, -0.02, 821.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:54:35.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:54:35.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:54:35.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:54:09, diff=26.584327s, valid=True
2026-06-03T23:54:35.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:54:35.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:54:35.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:54:12, diff=23.587912s, valid=True
2026-06-03T23:54:35.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:54:35.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:54:35.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:54:04, diff=31.596061s, valid=True
2026-06-03T23:54:35.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:54:35.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:54:35.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:54:35.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:54:35.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:54:35.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:54:35.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:54:12, diff=23.599751s, valid=True
2026-06-03T23:54:35.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:54:35.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:54:35.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:54:35.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97872.600556s, valid=True
2026-06-03T23:54:35.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:54:35.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:54:35.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:54:35.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:54:35.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:54:35.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:54:35.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:54:35.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:54:35.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:54:35.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:54:35.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:54:35.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:54:35.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:54:35.925 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:54:36.130 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:54:36.471 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:54:36.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:54:36.575 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:54:36.575 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:54:36.768 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:54:36.768 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:55:06.798 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:55:06.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:55:06.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:55:07.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:55:07.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:55:07.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:55:07.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:55:07.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:55:07.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:55:07.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:55:07.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:55:07.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:55:07.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:55:09.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:55:09.831 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:55:09.832 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:55:09.832 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:55:09.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:55:09.852 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:55:09.853 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:55:09.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:55:09.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:55:09.853 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:55:09.853 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:55:09.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:55:09.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:55:09.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:55:10.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:55:10.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:55:10.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:55:10.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:55:10.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:55:10.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:55:10.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:55:10.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:55:10.136 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:55:10.215 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:54:40
2026-06-03T23:55:10.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87384, datetime.datetime(2026, 6, 3, 23, 54, 40), datetime.datetime(2026, 6, 3, 23, 54, 39), 'salt', 1.66, 100.14, None, 52.36, 131.2, -0.02, 821.64, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:55:10.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:55:10.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:55:10.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:54:39, diff=31.22255s, valid=True
2026-06-03T23:55:10.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:55:10.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:55:10.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:55:12, diff=-1.77421s, valid=True
2026-06-03T23:55:10.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:55:10.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:55:10.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:54:34, diff=36.234174s, valid=True
2026-06-03T23:55:10.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:55:10.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:55:10.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:55:10.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:55:10.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:55:10.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:55:10.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:55:12, diff=-1.761394s, valid=True
2026-06-03T23:55:10.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:55:10.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:55:10.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:55:10.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97907.239426s, valid=True
2026-06-03T23:55:10.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:55:10.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:55:10.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:55:10.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:55:10.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:55:10.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:55:10.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:55:10.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:55:10.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:55:10.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:55:10.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:55:10.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:55:10.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:55:10.670 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:55:10.889 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:55:11.244 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:55:11.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:55:11.347 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:55:11.347 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:55:11.603 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:55:11.603 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:55:41.633 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:55:41.634 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:55:41.634 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:55:41.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:55:41.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:55:42.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:55:42.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:55:42.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:55:42.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:55:42.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:55:42.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:55:42.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:55:42.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:55:44.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:55:44.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:55:44.604 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:55:44.604 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:55:44.615 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:55:44.628 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:55:44.629 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:55:44.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:55:44.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:55:44.630 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:55:44.630 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:55:44.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:55:44.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:55:44.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:55:44.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:55:44.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:55:44.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:55:44.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:55:44.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:55:44.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:55:44.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:55:44.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:55:44.946 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:55:45.014 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:55:40
2026-06-03T23:55:45.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87386, datetime.datetime(2026, 6, 3, 23, 55, 40), datetime.datetime(2026, 6, 3, 23, 55, 40), 'salt', 1.73, 100.14, None, 45.23, 132.79, -0.02, 821.76, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:55:45.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:55:45.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:55:45.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:55:40, diff=5.021234s, valid=True
2026-06-03T23:55:45.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:55:45.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:55:45.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:56:12, diff=-26.975315s, valid=True
2026-06-03T23:55:45.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:55:45.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:55:45.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:55:35, diff=10.032672s, valid=True
2026-06-03T23:55:45.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:55:45.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:55:45.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:55:45.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:55:45.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:55:45.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:55:45.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:56:12, diff=-26.963733s, valid=True
2026-06-03T23:55:45.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:55:45.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:55:45.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:55:45.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97942.037067s, valid=True
2026-06-03T23:55:45.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:55:45.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:55:45.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:55:45.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:55:45.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:55:45.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:55:45.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:55:45.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:55:45.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:55:45.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:55:45.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:55:45.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:55:45.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:55:45.355 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:55:45.578 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:55:45.920 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:55:46.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:55:46.025 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:55:46.025 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:55:46.218 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:55:46.218 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:56:16.248 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:56:16.249 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:56:16.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:56:16.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:56:16.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:56:17.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:56:17.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:56:17.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:56:17.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:56:17.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:56:17.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:56:17.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:56:17.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:56:19.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:56:19.571 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:56:19.572 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:56:19.572 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:56:19.583 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:56:19.596 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:56:19.596 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:56:19.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:56:19.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:56:19.598 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:56:19.598 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:56:19.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:56:19.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:56:19.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:56:19.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:56:19.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:56:19.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:56:19.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:56:19.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:56:19.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:56:19.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:56:19.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:56:19.926 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:56:19.998 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:56:11
2026-06-03T23:56:19.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87387, datetime.datetime(2026, 6, 3, 23, 56, 11), datetime.datetime(2026, 6, 3, 23, 56, 10), 'salt', 1.76, 100.24, None, 42.41, 132.09, -0.04, 821.7, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:56:19.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:56:19.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:56:20.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:56:10, diff=10.005099s, valid=True
2026-06-03T23:56:20.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:56:20.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:56:20.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:56:12, diff=8.008291s, valid=True
2026-06-03T23:56:20.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:56:20.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:56:20.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:56:05, diff=15.01614s, valid=True
2026-06-03T23:56:20.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:56:20.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:56:20.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:56:20.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:56:20.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:56:20.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:56:20.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:56:12, diff=8.019266s, valid=True
2026-06-03T23:56:20.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:56:20.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:56:20.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:56:20.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=97977.019923s, valid=True
2026-06-03T23:56:20.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:56:20.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:56:20.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:56:20.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:56:20.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:56:20.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:56:20.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:56:20.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:56:20.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:56:20.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:56:20.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:56:20.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:56:20.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:56:20.409 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:56:20.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:56:20.956 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:56:21.059 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:56:21.059 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:56:21.059 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:56:21.601 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:56:21.601 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:56:51.630 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:56:51.631 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:56:51.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:56:51.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:56:51.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:56:52.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:56:52.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:56:52.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:56:52.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:56:52.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:56:52.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:56:52.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:56:52.244 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:56:55.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:56:55.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:56:55.178 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:56:55.178 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:56:55.187 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:56:55.200 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:56:55.200 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:56:55.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:56:55.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:56:55.201 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:56:55.201 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:56:55.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:56:55.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:56:55.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:56:55.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:56:55.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:56:55.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:56:55.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:56:55.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:56:55.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:56:55.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:56:55.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:56:55.546 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:56:55.622 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:56:41
2026-06-03T23:56:55.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87388, datetime.datetime(2026, 6, 3, 23, 56, 41), datetime.datetime(2026, 6, 3, 23, 56, 40), 'salt', 1.76, 100.14, None, 52.78, 137.16, -0.02, 821.7, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:56:55.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:56:55.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:56:55.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:56:40, diff=15.629559s, valid=True
2026-06-03T23:56:55.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:56:55.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:56:55.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:57:12, diff=-16.366941s, valid=True
2026-06-03T23:56:55.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:56:55.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:56:55.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:56:35, diff=20.641243s, valid=True
2026-06-03T23:56:55.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:56:55.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:56:55.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:56:55.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:56:55.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:56:55.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:56:55.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:57:12, diff=-16.355018s, valid=True
2026-06-03T23:56:55.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:56:55.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:56:55.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:56:55.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98012.645796s, valid=True
2026-06-03T23:56:55.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:56:55.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:56:55.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:56:55.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:56:55.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:56:55.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:56:55.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:56:55.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:56:55.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:56:55.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:56:55.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:56:55.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:56:55.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:56:55.966 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:56:56.173 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:56:56.517 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:56:56.615 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:56:56.615 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:56:56.616 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:56:56.879 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:56:56.879 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:57:26.909 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:57:26.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:57:26.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:57:27.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:57:27.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:57:27.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:57:27.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:57:27.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:57:27.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:57:27.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:57:27.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:57:27.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:57:27.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:57:31.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:57:31.040 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:57:31.041 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:57:31.041 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:57:31.052 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:57:31.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:57:31.065 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:57:31.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:57:31.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:57:31.066 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:57:31.067 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:57:31.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:57:31.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:57:31.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:57:31.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:57:31.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:57:31.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:57:31.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:57:31.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-03T23:57:31.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:57:31.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:57:31.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:57:31.426 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:57:31.498 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:57:11
2026-06-03T23:57:31.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87389, datetime.datetime(2026, 6, 3, 23, 57, 11), datetime.datetime(2026, 6, 3, 23, 57, 10), 'salt', 1.8, 100.2, None, 42.62, 119.24, -0.03, 821.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-03T23:57:31.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:57:31.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:57:31.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:57:10, diff=21.506251s, valid=True
2026-06-03T23:57:31.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:57:31.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:57:31.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:57:12, diff=19.50971s, valid=True
2026-06-03T23:57:31.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:57:31.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:57:31.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:57:05, diff=26.517817s, valid=True
2026-06-03T23:57:31.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:57:31.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:57:31.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:57:31.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:57:31.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:57:31.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-03T23:57:31.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:57:12, diff=19.521504s, valid=True
2026-06-03T23:57:31.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:57:31.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:57:31.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:57:31.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98048.522336s, valid=True
2026-06-03T23:57:31.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:57:31.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:57:31.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:57:31.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:57:31.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:57:31.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:57:31.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:57:31.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:57:31.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:57:31.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:57:31.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:57:31.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:57:31.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:57:31.922 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:57:32.134 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:57:32.482 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:57:32.587 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:57:32.588 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:57:32.588 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:57:32.785 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:57:32.785 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:58:02.816 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:58:02.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:58:02.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:58:03.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:58:03.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:58:03.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:58:03.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:58:03.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:58:03.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:58:03.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:58:03.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:58:03.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:58:03.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:58:05.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:58:05.709 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:58:05.710 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:58:05.710 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:58:05.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:58:05.734 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:58:05.735 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:58:05.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:58:05.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:58:05.736 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:58:05.736 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:58:05.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:58:05.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:58:05.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:58:05.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:58:05.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:58:06.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:58:06.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:58:06.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:58:06.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:58:06.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:58:06.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:58:06.082 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:58:06.158 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:57:41
2026-06-03T23:58:06.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87390, datetime.datetime(2026, 6, 3, 23, 57, 41), datetime.datetime(2026, 6, 3, 23, 57, 41), 'salt', 1.76, 100.1, None, 46.15, 116.7, -0.02, 821.52, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:58:06.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:58:06.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:58:06.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:57:41, diff=25.165561s, valid=True
2026-06-03T23:58:06.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:58:06.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:58:06.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:58:12, diff=-5.830965s, valid=True
2026-06-03T23:58:06.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:58:06.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:58:06.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:57:35, diff=31.177245s, valid=True
2026-06-03T23:58:06.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:58:06.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:58:06.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:58:06.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:58:06.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:58:06.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:58:06.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:58:12, diff=-5.819035s, valid=True
2026-06-03T23:58:06.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:58:06.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:58:06.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:58:06.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98083.181779s, valid=True
2026-06-03T23:58:06.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:58:06.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:58:06.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:58:06.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:58:06.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:58:06.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:58:06.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:58:06.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:58:06.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:58:06.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:58:06.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:58:06.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:58:06.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:58:06.502 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:58:06.723 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:58:07.065 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:58:07.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:58:07.167 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:58:07.167 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:58:07.359 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:58:07.359 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:58:37.389 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:58:37.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:58:37.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:58:37.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:58:37.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:58:37.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:58:37.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:58:37.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:58:37.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:58:38.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:58:38.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:58:38.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:58:38.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:58:40.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:58:40.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:58:40.705 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:58:40.706 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:58:40.714 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:58:40.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:58:40.726 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:58:40.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:58:40.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:58:40.726 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:58:40.726 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:58:40.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:58:40.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:58:40.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:58:40.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:58:40.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:58:40.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:58:40.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:58:41.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-03T23:58:41.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:58:41.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:58:41.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:58:41.012 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:58:41.081 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:58:12
2026-06-03T23:58:41.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87391, datetime.datetime(2026, 6, 3, 23, 58, 12), datetime.datetime(2026, 6, 3, 23, 58, 11), 'salt', 1.76, 100.24, None, 54.02, 122.01, -0.04, 821.64, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:58:41.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:58:41.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:58:41.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:58:11, diff=30.088337s, valid=True
2026-06-03T23:58:41.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:58:41.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:58:41.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:58:12, diff=29.091408s, valid=True
2026-06-03T23:58:41.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:58:41.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:58:41.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:58:06, diff=35.098733s, valid=True
2026-06-03T23:58:41.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:58:41.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:58:41.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:58:41.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:58:41.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:58:41.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-03T23:58:41.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:58:12, diff=29.102038s, valid=True
2026-06-03T23:58:41.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:58:41.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:58:41.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:58:41.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98118.102752s, valid=True
2026-06-03T23:58:41.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:58:41.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:58:41.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:58:41.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:58:41.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:58:41.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:58:41.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:58:41.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:58:41.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:58:41.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:58:41.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:58:41.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:58:41.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:58:41.418 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:58:41.626 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:58:41.970 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:58:42.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:58:42.071 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:58:42.071 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:58:42.270 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:58:42.270 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:59:12.272 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:59:12.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:59:12.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:59:12.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:59:12.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:59:13.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:59:13.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:59:13.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:59:13.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:59:13.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:59:13.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:59:13.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:59:13.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:59:16.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:59:16.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:59:16.281 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:59:16.282 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:59:16.292 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:59:16.305 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:59:16.306 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:59:16.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:59:16.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:59:16.307 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:59:16.307 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:59:16.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:59:16.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:59:16.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:59:16.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:59:16.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:59:16.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:59:16.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:59:16.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-03T23:59:16.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:59:16.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:59:16.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:59:16.664 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:59:16.740 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:59:13
2026-06-03T23:59:16.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87393, datetime.datetime(2026, 6, 3, 23, 59, 13), datetime.datetime(2026, 6, 3, 23, 59, 12), 'salt', 1.73, 100.21, None, 49.33, 120.58, -0.03, 821.71, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:59:16.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:59:16.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:59:16.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:59:12, diff=4.748137s, valid=True
2026-06-03T23:59:16.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:59:16.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:59:16.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:59:12, diff=4.751536s, valid=True
2026-06-03T23:59:16.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:59:16.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:59:16.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:59:06, diff=10.759557s, valid=True
2026-06-03T23:59:16.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:59:16.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:59:16.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:59:16.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:59:16.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:59:16.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-03T23:59:16.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:59:12, diff=4.763204s, valid=True
2026-06-03T23:59:16.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:59:16.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:59:16.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:59:16.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98153.764029s, valid=True
2026-06-03T23:59:16.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:59:16.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:59:16.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:59:16.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:59:16.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:59:16.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:59:16.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:59:16.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:59:16.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:59:16.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:59:16.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:59:17.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:59:17.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:59:17.093 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:59:17.388 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:59:17.735 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:59:17.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:59:17.842 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:59:17.842 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:59:18.031 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:59:18.031 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-03T23:59:48.041 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-03T23:59:48.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-03T23:59:48.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-03T23:59:48.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-03T23:59:48.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-03T23:59:48.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-03T23:59:48.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-03T23:59:48.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-03T23:59:48.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-03T23:59:48.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-03T23:59:48.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-03T23:59:48.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-03T23:59:48.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-03T23:59:51.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-03T23:59:51.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-03T23:59:51.246 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-03T23:59:51.246 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-03T23:59:51.255 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-03T23:59:51.268 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-03T23:59:51.268 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-03T23:59:51.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-03T23:59:51.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-03T23:59:51.270 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-03T23:59:51.270 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-03T23:59:51.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-03T23:59:51.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-03T23:59:51.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-03T23:59:51.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-03T23:59:51.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:59:51.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T23:59:51.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-03T23:59:51.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-03T23:59:51.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-03T23:59:51.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-03T23:59:51.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-03T23:59:51.625 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-03T23:59:51.705 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-03 23:59:43
2026-06-03T23:59:51.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87394, datetime.datetime(2026, 6, 3, 23, 59, 43), datetime.datetime(2026, 6, 3, 23, 59, 42), 'salt', 1.73, 100.21, None, 49.18, 124.08, -0.03, 821.77, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-03T23:59:51.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-03T23:59:51.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-03T23:59:51.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:59:42, diff=9.712739s, valid=True
2026-06-03T23:59:51.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-03T23:59:51.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T23:59:51.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:00:12, diff=-20.283706s, valid=True
2026-06-03T23:59:51.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-03T23:59:51.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-03T23:59:51.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-03 23:59:36, diff=15.724186s, valid=True
2026-06-03T23:59:51.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-03T23:59:51.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:59:51.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-03T23:59:51.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-03T23:59:51.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-03T23:59:51.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-03T23:59:51.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:00:12, diff=-20.27244s, valid=True
2026-06-03T23:59:51.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-03T23:59:51.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-03T23:59:51.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-03T23:59:51.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98188.728286s, valid=True
2026-06-03T23:59:51.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-03T23:59:51.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-03T23:59:51.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-03T23:59:51.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-03T23:59:51.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-03T23:59:51.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-03T23:59:51.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-03T23:59:51.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-03T23:59:51.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-03T23:59:51.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-03T23:59:51.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-03T23:59:51.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-03T23:59:52.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-03T23:59:52.047 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-03T23:59:52.270 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:59:52.611 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-03T23:59:52.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-03T23:59:52.713 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-03T23:59:52.713 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-03T23:59:52.925 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-03T23:59:52.925 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:00:22.942 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:00:22.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:00:22.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:00:23.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:00:23.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:00:23.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:00:23.634 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:00:23.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:00:23.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:00:23.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:00:23.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:00:23.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:00:23.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:00:26.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:00:26.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:00:26.187 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:00:26.187 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:00:26.197 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:00:26.209 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:00:26.209 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:00:26.209 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:00:26.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:00:26.209 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:00:26.209 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:00:26.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:00:26.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:00:26.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:00:26.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:00:26.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:00:26.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T00:00:26.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:00:26.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T00:00:26.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:00:26.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:00:26.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:00:26.521 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:00:26.608 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:00:13
2026-06-04T00:00:26.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87395, datetime.datetime(2026, 6, 4, 0, 0, 13), datetime.datetime(2026, 6, 4, 0, 0, 13), 'salt', 1.66, 100.17, None, 46.89, 112.36, -0.03, 821.65, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:00:26.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:00:26.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:00:26.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:00:13, diff=13.61546s, valid=True
2026-06-04T00:00:26.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:00:26.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T00:00:26.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:00:12, diff=14.618834s, valid=True
2026-06-04T00:00:26.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:00:26.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:00:26.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:00:07, diff=19.62665s, valid=True
2026-06-04T00:00:26.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:00:26.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:00:26.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:00:26.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:00:26.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:00:26.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T00:00:26.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:00:12, diff=14.63023s, valid=True
2026-06-04T00:00:26.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:00:26.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:00:26.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:00:26.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98223.631026s, valid=True
2026-06-04T00:00:26.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:00:26.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:00:26.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:00:26.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:00:26.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:00:26.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:00:26.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:00:26.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:00:26.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:00:26.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:00:26.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:00:26.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:00:26.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:00:27.024 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:00:27.228 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:00:27.568 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:00:27.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:00:27.670 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:00:27.670 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:00:27.848 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:00:27.848 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:00:57.878 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:00:57.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:00:57.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:00:58.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:00:58.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:00:58.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:00:58.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:00:58.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:00:58.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:00:58.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:00:58.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:00:58.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:00:58.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:01:00.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:01:00.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:01:00.958 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:01:00.958 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:01:00.969 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:01:00.981 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:01:00.982 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:01:00.982 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:01:00.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:01:00.983 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:01:00.983 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:01:00.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:01:01.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:01:01.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:01:01.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:01:01.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:01:01.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:01:01.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:01:01.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:01:01.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:01:01.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:01:01.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:01:01.300 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:01:01.385 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:00:44
2026-06-04T00:01:01.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87396, datetime.datetime(2026, 6, 4, 0, 0, 44), datetime.datetime(2026, 6, 4, 0, 0, 43), 'salt', 1.63, 100.11, None, 55.46, 117.34, -0.02, 821.52, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:01:01.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:01:01.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:01:01.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:00:43, diff=18.391539s, valid=True
2026-06-04T00:01:01.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:01:01.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:01:01.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:01:12, diff=-10.605391s, valid=True
2026-06-04T00:01:01.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:01:01.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:01:01.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:00:37, diff=24.402001s, valid=True
2026-06-04T00:01:01.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:01:01.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:01:01.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:01:01.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:01:01.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:01:01.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:01:01.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:01:12, diff=-10.594547s, valid=True
2026-06-04T00:01:01.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:01:01.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:01:01.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:01:01.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98258.406195s, valid=True
2026-06-04T00:01:01.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:01:01.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:01:01.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:01:01.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:01:01.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:01:01.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:01:01.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:01:01.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:01:01.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:01:01.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:01:01.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:01:01.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:01:01.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:01:01.724 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:01:01.930 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:01:02.271 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:01:02.375 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:01:02.375 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:01:02.375 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:01:02.551 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:01:02.551 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:01:32.561 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:01:32.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:01:32.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:01:32.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:01:32.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:01:33.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:01:33.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:01:33.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:01:33.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:01:33.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:01:33.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:01:33.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:01:33.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:01:35.719 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:01:35.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:01:35.728 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:01:35.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:01:35.739 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:01:35.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:01:35.752 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:01:35.753 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:01:35.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:01:35.753 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:01:35.754 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:01:35.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:01:35.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:01:35.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:01:36.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:01:36.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:01:36.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:01:36.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:01:36.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:01:36.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:01:36.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:01:36.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:01:36.102 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:01:36.200 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:01:14
2026-06-04T00:01:36.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87397, datetime.datetime(2026, 6, 4, 0, 1, 14), datetime.datetime(2026, 6, 4, 0, 1, 13), 'salt', 1.63, 100.17, None, 51.02, 127.44, -0.03, 821.4, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:01:36.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:01:36.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:01:36.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:01:13, diff=23.20785s, valid=True
2026-06-04T00:01:36.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:01:36.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:01:36.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:01:12, diff=24.211326s, valid=True
2026-06-04T00:01:36.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:01:36.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:01:36.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:01:08, diff=28.219523s, valid=True
2026-06-04T00:01:36.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:01:36.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:01:36.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:01:36.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:01:36.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:01:36.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:01:36.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:01:12, diff=24.223289s, valid=True
2026-06-04T00:01:36.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:01:36.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:01:36.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:01:36.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98293.224112s, valid=True
2026-06-04T00:01:36.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:01:36.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:01:36.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:01:36.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:01:36.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:01:36.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:01:36.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:01:36.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:01:36.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:01:36.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:01:36.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:01:36.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:01:36.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:01:36.620 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:01:36.827 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:01:37.169 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:01:37.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:01:37.270 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:01:37.270 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:01:37.514 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:01:37.514 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:02:07.524 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:02:07.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:02:07.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:02:07.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:02:07.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:02:08.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:02:08.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:02:08.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:02:08.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:02:08.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:02:08.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:02:08.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:02:08.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:02:11.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:02:11.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:02:11.106 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:02:11.106 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:02:11.117 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:02:11.129 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:02:11.130 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:02:11.130 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:02:11.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:02:11.131 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:02:11.131 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:02:11.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:02:11.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:02:11.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:02:11.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:02:11.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:02:11.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:02:11.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:02:11.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:02:11.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:02:11.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:02:11.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:02:11.451 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:02:11.534 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:01:44
2026-06-04T00:02:11.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87398, datetime.datetime(2026, 6, 4, 0, 1, 44), datetime.datetime(2026, 6, 4, 0, 1, 43), 'salt', 1.63, 100.17, None, 46.96, 117.97, -0.03, 821.46, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:02:11.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:02:11.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:02:11.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:01:43, diff=28.541635s, valid=True
2026-06-04T00:02:11.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:02:11.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:02:11.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:02:12, diff=-0.455085s, valid=True
2026-06-04T00:02:11.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:02:11.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:02:11.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:01:38, diff=33.552107s, valid=True
2026-06-04T00:02:11.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:02:11.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:02:11.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:02:11.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:02:11.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:02:11.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:02:11.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:02:12, diff=-0.444618s, valid=True
2026-06-04T00:02:11.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:02:11.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:02:11.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:02:11.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98328.55609s, valid=True
2026-06-04T00:02:11.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:02:11.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:02:11.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:02:11.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:02:11.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:02:11.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:02:11.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:02:11.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:02:11.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:02:11.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:02:11.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:02:11.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:02:11.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:02:11.879 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:02:12.085 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:02:12.430 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:02:12.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:02:12.534 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:02:12.534 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:02:12.733 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:02:12.733 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:02:42.746 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:02:42.746 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:02:42.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:02:42.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:02:42.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:02:43.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:02:43.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:02:43.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:02:43.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:02:43.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:02:43.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:02:43.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:02:43.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:02:45.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:02:45.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:02:45.796 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:02:45.796 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:02:45.807 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:02:45.819 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:02:45.820 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:02:45.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:02:45.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:02:45.821 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:02:45.821 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:02:45.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:02:45.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T00:02:45.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:02:46.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T00:02:46.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:02:46.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 674 rows from lcogt
2026-06-04T00:02:46.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:02:46.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 674 rows from lcogt
2026-06-04T00:02:46.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:02:46.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:02:46.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:02:46.156 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:02:46.231 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:02:45
2026-06-04T00:02:46.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87400, datetime.datetime(2026, 6, 4, 0, 2, 45), datetime.datetime(2026, 6, 4, 0, 2, 44), 'salt', 1.66, 100.14, None, 54.33, 121.35, -0.02, 821.4, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:02:46.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:02:46.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T00:02:46.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:02:44, diff=2.238028s, valid=True
2026-06-04T00:02:46.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:02:46.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 674 rows. Structure expected: 10 fields
2026-06-04T00:02:46.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:03:12, diff=-25.758729s, valid=True
2026-06-04T00:02:46.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:02:46.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T00:02:46.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:02:38, diff=8.248927s, valid=True
2026-06-04T00:02:46.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:02:46.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:02:46.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:02:46.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:02:46.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:02:46.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 674 rows. Structure expected: 10 fields
2026-06-04T00:02:46.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:03:12, diff=-25.747629s, valid=True
2026-06-04T00:02:46.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:02:46.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:02:46.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:02:46.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98363.253132s, valid=True
2026-06-04T00:02:46.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:02:46.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:02:46.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:02:46.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:02:46.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:02:46.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:02:46.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:02:46.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:02:46.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:02:46.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:02:46.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:02:46.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:02:46.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:02:46.642 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:02:46.865 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:02:47.207 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:02:47.309 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:02:47.310 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:02:47.310 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:02:47.511 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:02:47.512 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:03:17.515 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:03:17.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:03:17.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:03:17.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:03:17.944 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:03:18.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:03:18.199 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:03:18.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:03:18.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:03:18.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:03:18.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:03:18.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:03:18.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:03:21.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:03:21.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:03:21.106 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:03:21.106 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:03:21.118 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:03:21.131 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:03:21.131 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:03:21.132 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:03:21.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:03:21.132 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:03:21.132 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:03:21.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:03:21.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:03:21.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:03:21.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:03:21.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:03:21.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:03:21.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:03:21.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:03:21.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:03:21.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:03:21.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:03:21.474 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:03:21.551 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:03:15
2026-06-04T00:03:21.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87401, datetime.datetime(2026, 6, 4, 0, 3, 15), datetime.datetime(2026, 6, 4, 0, 3, 14), 'salt', 1.7, 100.24, None, 46.78, 120.6, -0.03, 821.52, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:03:21.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:03:21.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:03:21.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:03:14, diff=7.55957s, valid=True
2026-06-04T00:03:21.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:03:21.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:03:21.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:03:12, diff=9.563224s, valid=True
2026-06-04T00:03:21.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:03:21.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:03:21.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:03:09, diff=12.571829s, valid=True
2026-06-04T00:03:21.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:03:21.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:03:21.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:03:21.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:03:21.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:03:21.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:03:21.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:03:12, diff=9.575712s, valid=True
2026-06-04T00:03:21.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:03:21.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:03:21.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:03:21.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98398.57654s, valid=True
2026-06-04T00:03:21.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:03:21.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:03:21.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:03:21.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:03:21.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:03:21.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:03:21.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:03:21.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:03:21.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:03:21.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:03:21.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:03:21.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:03:21.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:03:21.899 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:03:22.104 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:03:22.456 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:03:22.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:03:22.558 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:03:22.558 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:03:22.775 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:03:22.775 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:03:52.793 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:03:52.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:03:52.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:03:53.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:03:53.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:03:53.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:03:53.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:03:53.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:03:53.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:03:53.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:03:53.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:03:53.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:03:53.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:03:56.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:03:56.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:03:56.302 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:03:56.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:03:56.313 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:03:56.325 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:03:56.326 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:03:56.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:03:56.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:03:56.327 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:03:56.327 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:03:56.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:03:56.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:03:56.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:03:56.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:03:56.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:03:56.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:03:56.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:03:56.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:03:56.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:03:56.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:03:56.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:03:56.684 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:03:56.768 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:03:45
2026-06-04T00:03:56.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87402, datetime.datetime(2026, 6, 4, 0, 3, 45), datetime.datetime(2026, 6, 4, 0, 3, 44), 'salt', 1.66, 100.07, None, 43.47, 127.16, -0.02, 821.64, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T00:03:56.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:03:56.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:03:56.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:03:44, diff=12.776082s, valid=True
2026-06-04T00:03:56.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:03:56.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:03:56.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:04:12, diff=-15.220454s, valid=True
2026-06-04T00:03:56.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:03:56.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:03:56.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:03:40, diff=16.78758s, valid=True
2026-06-04T00:03:56.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:03:56.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:03:56.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:03:56.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:03:56.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:03:56.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:03:56.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:04:12, diff=-15.208687s, valid=True
2026-06-04T00:03:56.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:03:56.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:03:56.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:03:56.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98433.792144s, valid=True
2026-06-04T00:03:56.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:03:56.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:03:56.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:03:56.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:03:56.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:03:56.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:03:56.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:03:56.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:03:56.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:03:56.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:03:56.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:03:57.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:03:57.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:03:57.110 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:03:57.315 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:03:57.657 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:03:57.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:03:57.758 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:03:57.758 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:03:57.915 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:03:57.915 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:04:27.945 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:04:27.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:04:27.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:04:28.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:04:28.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:04:28.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:04:28.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:04:28.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:04:28.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:04:28.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:04:28.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:04:28.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:04:28.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:04:30.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:04:30.822 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:04:30.823 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:04:30.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:04:30.833 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:04:30.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:04:30.846 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:04:30.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:04:30.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:04:30.848 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:04:30.848 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:04:30.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:04:30.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:04:30.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:04:31.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:04:31.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:04:31.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:04:31.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:04:31.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:04:31.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:04:31.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:04:31.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:04:31.195 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:04:31.267 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:04:15
2026-06-04T00:04:31.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87403, datetime.datetime(2026, 6, 4, 0, 4, 15), datetime.datetime(2026, 6, 4, 0, 4, 15), 'salt', 1.63, 100.04, None, 43.64, 110.64, -0.01, 821.89, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T00:04:31.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:04:31.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:04:31.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:04:15, diff=16.27532s, valid=True
2026-06-04T00:04:31.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:04:31.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:04:31.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:04:12, diff=19.278979s, valid=True
2026-06-04T00:04:31.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:04:31.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:04:31.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:04:09, diff=22.287353s, valid=True
2026-06-04T00:04:31.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:04:31.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:04:31.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:04:31.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:04:31.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:04:31.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:04:31.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:04:12, diff=19.29125s, valid=True
2026-06-04T00:04:31.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:04:31.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:04:31.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:04:31.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98468.292097s, valid=True
2026-06-04T00:04:31.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:04:31.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:04:31.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:04:31.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:04:31.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:04:31.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:04:31.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:04:31.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:04:31.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:04:31.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:04:31.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:04:31.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:04:31.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:04:31.613 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:04:31.880 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:04:32.219 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:04:32.323 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:04:32.323 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:04:32.323 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:04:32.516 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:04:32.516 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:05:02.547 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:05:02.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:05:02.547 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:05:02.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:05:02.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:05:03.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:05:03.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:05:03.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:05:03.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:05:03.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:05:03.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:05:03.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:05:03.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:05:05.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:05:05.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:05:05.416 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:05:05.416 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:05:05.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:05:05.436 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:05:05.436 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:05:05.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:05:05.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:05:05.437 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:05:05.437 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:05:05.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:05:05.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:05:05.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:05:05.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:05:05.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:05:05.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:05:05.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:05:05.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:05:05.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:05:05.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:05:05.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:05:05.720 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:05:05.794 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:04:46
2026-06-04T00:05:05.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87404, datetime.datetime(2026, 6, 4, 0, 4, 46), datetime.datetime(2026, 6, 4, 0, 4, 46), 'salt', 1.73, 100.14, None, 42.34, 112.17, -0.02, 821.65, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T00:05:05.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:05:05.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:05:05.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:04:46, diff=19.801281s, valid=True
2026-06-04T00:05:05.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:05:05.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:05:05.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:05:12, diff=-6.195648s, valid=True
2026-06-04T00:05:05.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:05:05.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:05:05.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:04:39, diff=26.811436s, valid=True
2026-06-04T00:05:05.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:05:05.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:05:05.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:05:05.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:05:05.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:05:05.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:05:05.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:05:12, diff=-6.185184s, valid=True
2026-06-04T00:05:05.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:05:05.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:05:05.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:05:05.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98502.815542s, valid=True
2026-06-04T00:05:05.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:05:05.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:05:05.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:05:05.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:05:05.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:05:05.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:05:05.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:05:05.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:05:05.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:05:05.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:05:06.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:05:06.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:05:06.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:05:06.132 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:05:06.337 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:05:06.682 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:05:06.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:05:06.784 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:05:06.784 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:05:07.079 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:05:07.079 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:05:37.109 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:05:37.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:05:37.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:05:37.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:05:37.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:05:37.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:05:37.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:05:37.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:05:37.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:05:37.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:05:37.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:05:37.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:05:37.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:05:39.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:05:39.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:05:39.892 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:05:39.892 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:05:39.899 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:05:39.911 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:05:39.912 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:05:39.912 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:05:39.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:05:39.912 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:05:39.912 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:05:39.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:05:40.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:05:40.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:05:40.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:05:40.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:05:40.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:05:40.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:05:40.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:05:40.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:05:40.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:05:40.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:05:40.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:05:40.257 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:05:17
2026-06-04T00:05:40.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87405, datetime.datetime(2026, 6, 4, 0, 5, 17), datetime.datetime(2026, 6, 4, 0, 5, 16), 'salt', 1.7, 100.21, None, 44.6, 120.41, -0.03, 821.89, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T00:05:40.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:05:40.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:05:40.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:05:16, diff=24.263943s, valid=True
2026-06-04T00:05:40.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:05:40.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:05:40.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:05:12, diff=28.267073s, valid=True
2026-06-04T00:05:40.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:05:40.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:05:40.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:05:10, diff=30.274467s, valid=True
2026-06-04T00:05:40.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:05:40.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:05:40.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:05:40.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:05:40.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:05:40.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:05:40.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:05:12, diff=28.277804s, valid=True
2026-06-04T00:05:40.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:05:40.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:05:40.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:05:40.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98537.278512s, valid=True
2026-06-04T00:05:40.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:05:40.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:05:40.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:05:40.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:05:40.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:05:40.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:05:40.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:05:40.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:05:40.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:05:40.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:05:40.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:05:40.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:05:40.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:05:40.674 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:05:40.901 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:05:41.246 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:05:41.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:05:41.348 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:05:41.349 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:05:41.508 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:05:41.508 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:06:11.539 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:06:11.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:06:11.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:06:11.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:06:11.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:06:12.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:06:12.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:06:12.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:06:12.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:06:12.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:06:12.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:06:12.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:06:12.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:06:14.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:06:14.801 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:06:14.802 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:06:14.802 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:06:14.814 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:06:14.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:06:14.827 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:06:14.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:06:14.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:06:14.828 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:06:14.828 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:06:14.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:06:14.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:06:14.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:06:15.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:06:15.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:06:15.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:06:15.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:06:15.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:06:15.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:06:15.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:06:15.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:06:15.158 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:06:15.229 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:05:47
2026-06-04T00:06:15.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87406, datetime.datetime(2026, 6, 4, 0, 5, 47), datetime.datetime(2026, 6, 4, 0, 5, 46), 'salt', 1.8, 100.21, None, 45.94, 122.36, -0.03, 821.52, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:06:15.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:06:15.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:06:15.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:05:46, diff=29.236971s, valid=True
2026-06-04T00:06:15.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:06:15.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:06:15.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:06:12, diff=3.240544s, valid=True
2026-06-04T00:06:15.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:06:15.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:06:15.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:05:40, diff=35.24878s, valid=True
2026-06-04T00:06:15.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:06:15.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:06:15.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:06:15.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:06:15.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:06:15.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:06:15.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:06:12, diff=3.252576s, valid=True
2026-06-04T00:06:15.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:06:15.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:06:15.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:06:15.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98572.253387s, valid=True
2026-06-04T00:06:15.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:06:15.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:06:15.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:06:15.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:06:15.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:06:15.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:06:15.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:06:15.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:06:15.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:06:15.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:06:15.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:06:15.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:06:15.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:06:15.576 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:06:15.781 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:06:16.122 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:06:16.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:06:16.226 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:06:16.226 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:06:16.416 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:06:16.417 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:06:46.446 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:06:46.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:06:46.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:06:46.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:06:46.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:06:47.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:06:47.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:06:47.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:06:47.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:06:47.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:06:47.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:06:47.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:06:47.052 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:06:50.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:06:50.148 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:06:50.149 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:06:50.149 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:06:50.155 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:06:50.167 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:06:50.167 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:06:50.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:06:50.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:06:50.168 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:06:50.168 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:06:50.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:06:50.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:06:50.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:06:50.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:06:50.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:06:50.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:06:50.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:06:50.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:06:50.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:06:50.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:06:50.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:06:50.494 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:06:50.566 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:06:47
2026-06-04T00:06:50.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87408, datetime.datetime(2026, 6, 4, 0, 6, 47), datetime.datetime(2026, 6, 4, 0, 6, 47), 'salt', 1.7, 100.14, None, 54.69, 122.06, -0.02, 821.71, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:06:50.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:06:50.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:06:50.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:06:47, diff=3.573727s, valid=True
2026-06-04T00:06:50.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:06:50.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:06:50.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:07:12, diff=-21.422793s, valid=True
2026-06-04T00:06:50.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:06:50.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:06:50.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:06:43, diff=7.585381s, valid=True
2026-06-04T00:06:50.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:06:50.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:06:50.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:06:50.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:06:50.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:06:50.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:06:50.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:07:12, diff=-21.410906s, valid=True
2026-06-04T00:06:50.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:06:50.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:06:50.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:06:50.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98607.589902s, valid=True
2026-06-04T00:06:50.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:06:50.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:06:50.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:06:50.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:06:50.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:06:50.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:06:50.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:06:50.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:06:50.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:06:50.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:06:50.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:06:50.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:06:50.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:06:50.979 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:06:51.185 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:06:51.532 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:06:51.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:06:51.636 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:06:51.636 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:06:51.946 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:06:51.946 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:07:21.950 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:07:21.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:07:21.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:07:22.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:07:22.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:07:22.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:07:22.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:07:22.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:07:22.387 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:07:22.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:07:22.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:07:22.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:07:22.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:07:24.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:07:24.868 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:07:24.869 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:07:24.869 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:07:24.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:07:24.893 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:07:24.894 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:07:24.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:07:24.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:07:24.895 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:07:24.895 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:07:24.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:07:25.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:07:25.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:07:25.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:07:25.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:07:25.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:07:25.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:07:25.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:07:25.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:07:25.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:07:25.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:07:25.226 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:07:25.299 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:07:18
2026-06-04T00:07:25.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87409, datetime.datetime(2026, 6, 4, 0, 7, 18), datetime.datetime(2026, 6, 4, 0, 7, 17), 'salt', 1.63, 100.11, None, 51.19, 121.71, -0.02, 821.52, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:07:25.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:07:25.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:07:25.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:07:17, diff=8.307138s, valid=True
2026-06-04T00:07:25.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:07:25.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:07:25.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:07:12, diff=13.31067s, valid=True
2026-06-04T00:07:25.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:07:25.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:07:25.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:07:10, diff=15.31881s, valid=True
2026-06-04T00:07:25.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:07:25.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:07:25.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:07:25.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:07:25.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:07:25.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:07:25.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:07:12, diff=13.322494s, valid=True
2026-06-04T00:07:25.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:07:25.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:07:25.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:07:25.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98642.32331s, valid=True
2026-06-04T00:07:25.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:07:25.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:07:25.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:07:25.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:07:25.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:07:25.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:07:25.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:07:25.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:07:25.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:07:25.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:07:25.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:07:25.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:07:25.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:07:25.643 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:07:25.849 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:07:26.190 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:07:26.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:07:26.293 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:07:26.293 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:07:26.442 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:07:26.443 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:07:56.446 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:07:56.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:07:56.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:07:56.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:07:56.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:07:57.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:07:57.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:07:57.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:07:57.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:07:57.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:07:57.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:07:57.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:07:57.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:07:59.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:07:59.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:07:59.983 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:07:59.983 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:07:59.992 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:08:00.007 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:08:00.008 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:08:00.008 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:08:00.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:08:00.008 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:08:00.008 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:08:00.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:08:00.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:08:00.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:08:00.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:08:00.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:08:00.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:08:00.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:08:00.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:08:00.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:08:00.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:08:00.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:08:00.346 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:08:00.418 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:07:48
2026-06-04T00:08:00.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87410, datetime.datetime(2026, 6, 4, 0, 7, 48), datetime.datetime(2026, 6, 4, 0, 7, 47), 'salt', 1.6, 100.11, None, 52.39, 126.05, -0.01, 821.46, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:08:00.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:08:00.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:08:00.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:07:47, diff=13.424901s, valid=True
2026-06-04T00:08:00.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:08:00.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:08:00.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:08:12, diff=-11.572066s, valid=True
2026-06-04T00:08:00.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:08:00.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:08:00.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:07:41, diff=19.434943s, valid=True
2026-06-04T00:08:00.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:08:00.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:08:00.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:08:00.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:08:00.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:08:00.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:08:00.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:08:12, diff=-11.561779s, valid=True
2026-06-04T00:08:00.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:08:00.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:08:00.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:08:00.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98677.438941s, valid=True
2026-06-04T00:08:00.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:08:00.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:08:00.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:08:00.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:08:00.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:08:00.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:08:00.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:08:00.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:08:00.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:08:00.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:08:00.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:08:00.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:08:00.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:08:00.823 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:08:01.029 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:08:01.370 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:08:01.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:08:01.478 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:08:01.478 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:08:01.665 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:08:01.665 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:08:31.695 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:08:31.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:08:31.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:08:32.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:08:32.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:08:32.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:08:32.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:08:32.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:08:32.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:08:32.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:08:32.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:08:32.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:08:32.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:08:34.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:08:34.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:08:34.734 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:08:34.734 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:08:34.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:08:34.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:08:34.759 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:08:34.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:08:34.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:08:34.760 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:08:34.760 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:08:34.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:08:34.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:08:34.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:08:34.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:08:34.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:08:35.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:08:35.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:08:35.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:08:35.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:08:35.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:08:35.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:08:35.095 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:08:35.170 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:08:18
2026-06-04T00:08:35.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87411, datetime.datetime(2026, 6, 4, 0, 8, 18), datetime.datetime(2026, 6, 4, 0, 8, 17), 'salt', 1.7, 100.21, None, 46.5, 128.17, -0.03, 821.71, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:08:35.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:08:35.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:08:35.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:08:17, diff=18.177649s, valid=True
2026-06-04T00:08:35.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:08:35.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:08:35.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:08:12, diff=23.181145s, valid=True
2026-06-04T00:08:35.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:08:35.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:08:35.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:08:11, diff=24.189271s, valid=True
2026-06-04T00:08:35.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:08:35.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:08:35.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:08:35.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:08:35.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:08:35.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:08:35.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:08:12, diff=23.193015s, valid=True
2026-06-04T00:08:35.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:08:35.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:08:35.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:08:35.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98712.193839s, valid=True
2026-06-04T00:08:35.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:08:35.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:08:35.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:08:35.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:08:35.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:08:35.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:08:35.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:08:35.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:08:35.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:08:35.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:08:35.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:08:35.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:08:35.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:08:35.514 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:08:35.719 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:08:36.060 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:08:36.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:08:36.162 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:08:36.163 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:08:36.251 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:08:36.251 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:09:06.277 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:09:06.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:09:06.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:09:06.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:09:06.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:09:06.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:09:06.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:09:06.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:09:06.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:09:06.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:09:06.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:09:06.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:09:06.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:09:09.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:09:09.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:09:09.326 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:09:09.326 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:09:09.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:09:09.350 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:09:09.350 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:09:09.351 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:09:09.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:09:09.352 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:09:09.352 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:09:09.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:09:09.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:09:09.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:09:09.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:09:09.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:09:09.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:09:09.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:09:09.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:09:09.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:09:09.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:09:09.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:09:09.704 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:09:09.775 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:08:48
2026-06-04T00:09:09.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87412, datetime.datetime(2026, 6, 4, 0, 8, 48), datetime.datetime(2026, 6, 4, 0, 8, 48), 'salt', 1.66, 100.21, None, 43.36, 121.28, -0.03, 821.46, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T00:09:09.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:09:09.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:09:09.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:08:48, diff=21.78198s, valid=True
2026-06-04T00:09:09.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:09:09.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:09:09.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:09:12, diff=-2.215057s, valid=True
2026-06-04T00:09:09.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:09:09.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:09:09.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:08:41, diff=28.79163s, valid=True
2026-06-04T00:09:09.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:09:09.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:09:09.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:09:09.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:09:09.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:09:09.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:09:09.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:09:12, diff=-2.205022s, valid=True
2026-06-04T00:09:09.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:09:09.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:09:09.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:09:09.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98746.795787s, valid=True
2026-06-04T00:09:09.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:09:09.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:09:09.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:09:09.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:09:09.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:09:09.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:09:09.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:09:09.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:09:09.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:09:09.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:09:10.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:09:10.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:09:10.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:09:10.137 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:09:10.367 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:09:10.742 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:09:10.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:09:10.850 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:09:10.850 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:09:11.106 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:09:11.106 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:09:41.112 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:09:41.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:09:41.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:09:41.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:09:41.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:09:41.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:09:41.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:09:41.719 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:09:41.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:09:41.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:09:41.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:09:41.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:09:41.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:09:44.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:09:44.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:09:44.155 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:09:44.155 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:09:44.163 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:09:44.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:09:44.175 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:09:44.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:09:44.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:09:44.175 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:09:44.175 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:09:44.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:09:44.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:09:44.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:09:44.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:09:44.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:09:44.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:09:44.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:09:44.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:09:44.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:09:44.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:09:44.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:09:44.476 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:09:44.546 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:09:19
2026-06-04T00:09:44.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87413, datetime.datetime(2026, 6, 4, 0, 9, 19), datetime.datetime(2026, 6, 4, 0, 9, 18), 'salt', 1.63, 100.21, None, 44.6, 125.96, -0.03, 821.4, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T00:09:44.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:09:44.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:09:44.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:09:18, diff=26.554028s, valid=True
2026-06-04T00:09:44.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:09:44.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:09:44.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:09:12, diff=32.557391s, valid=True
2026-06-04T00:09:44.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:09:44.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:09:44.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:09:11, diff=33.565406s, valid=True
2026-06-04T00:09:44.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:09:44.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:09:44.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:09:44.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:09:44.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:09:44.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:09:44.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:09:12, diff=32.569038s, valid=True
2026-06-04T00:09:44.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:09:44.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:09:44.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:09:44.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98781.569866s, valid=True
2026-06-04T00:09:44.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:09:44.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:09:44.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:09:44.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:09:44.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:09:44.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:09:44.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:09:44.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:09:44.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:09:44.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:09:44.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:09:44.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:09:44.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:09:44.891 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:09:45.156 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:09:45.496 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:09:45.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:09:45.598 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:09:45.598 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:09:45.902 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:09:45.902 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:10:15.933 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:10:15.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:10:15.933 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:10:16.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:10:16.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:10:16.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:10:16.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:10:16.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:10:16.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:10:16.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:10:16.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:10:16.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:10:16.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:10:18.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:10:18.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:10:18.896 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:10:18.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:10:18.907 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:10:18.920 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:10:18.920 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:10:18.921 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:10:18.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:10:18.922 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:10:18.922 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:10:18.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:10:19.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:10:19.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:10:19.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:10:19.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:10:19.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:10:19.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:10:19.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:10:19.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:10:19.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:10:19.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:10:19.263 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:10:19.333 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:09:49
2026-06-04T00:10:19.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87414, datetime.datetime(2026, 6, 4, 0, 9, 49), datetime.datetime(2026, 6, 4, 0, 9, 48), 'salt', 1.66, 100.17, None, 55.85, 111.23, -0.03, 821.34, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:10:19.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:10:19.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:10:19.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:09:48, diff=31.340765s, valid=True
2026-06-04T00:10:19.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:10:19.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:10:19.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:10:12, diff=7.344043s, valid=True
2026-06-04T00:10:19.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:10:19.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:10:19.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:09:42, diff=37.351796s, valid=True
2026-06-04T00:10:19.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:10:19.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:10:19.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:10:19.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:10:19.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:10:19.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:10:19.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:10:12, diff=7.355296s, valid=True
2026-06-04T00:10:19.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:10:19.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:10:19.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:10:19.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98816.356067s, valid=True
2026-06-04T00:10:19.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:10:19.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:10:19.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:10:19.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:10:19.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:10:19.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:10:19.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:10:19.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:10:19.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:10:19.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:10:19.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:10:19.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:10:19.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:10:19.673 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:10:19.883 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:10:20.234 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:10:20.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:10:20.336 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:10:20.336 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:10:20.490 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:10:20.491 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:10:50.521 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:10:50.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:10:50.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:10:51.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:10:51.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:10:51.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:10:51.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:10:51.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:10:51.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:10:51.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:10:51.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:10:51.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:10:51.547 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:10:53.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:10:53.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:10:53.937 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:10:53.937 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:10:53.948 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:10:53.960 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:10:53.961 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:10:53.961 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:10:53.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:10:53.962 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:10:53.962 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:10:53.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:10:54.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:10:54.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:10:54.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:10:54.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:10:54.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:10:54.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:10:54.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:10:54.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:10:54.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:10:54.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:10:54.321 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:10:54.393 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:10:50
2026-06-04T00:10:54.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87416, datetime.datetime(2026, 6, 4, 0, 10, 50), datetime.datetime(2026, 6, 4, 0, 10, 49), 'salt', 1.6, 100.14, None, 52.32, 112.71, -0.02, 821.59, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:10:54.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:10:54.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:10:54.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:10:49, diff=5.401185s, valid=True
2026-06-04T00:10:54.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:10:54.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:10:54.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:11:12, diff=-17.595308s, valid=True
2026-06-04T00:10:54.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:10:54.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:10:54.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:10:42, diff=12.412887s, valid=True
2026-06-04T00:10:54.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:10:54.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:10:54.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:10:54.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:10:54.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:10:54.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:10:54.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:11:12, diff=-17.583367s, valid=True
2026-06-04T00:10:54.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:10:54.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:10:54.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:10:54.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98851.417431s, valid=True
2026-06-04T00:10:54.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:10:54.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:10:54.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:10:54.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:10:54.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:10:54.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:10:54.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:10:54.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:10:54.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:10:54.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:10:54.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:10:54.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:10:54.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:10:54.811 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:10:55.015 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:10:55.356 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:10:55.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:10:55.458 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:10:55.458 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:10:55.656 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:10:55.656 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:11:25.686 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:11:25.686 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:11:25.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:11:26.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:11:26.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:11:26.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:11:26.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:11:26.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:11:26.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:11:26.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:11:26.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:11:26.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:11:26.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:11:28.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:11:28.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:11:28.820 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:11:28.820 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:11:28.831 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:11:28.844 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:11:28.844 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:11:28.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:11:28.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:11:28.845 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:11:28.846 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:11:28.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:11:28.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:11:28.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:11:29.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:11:29.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:11:29.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:11:29.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:11:29.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:11:29.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:11:29.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:11:29.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:11:29.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:11:29.258 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:11:20
2026-06-04T00:11:29.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87417, datetime.datetime(2026, 6, 4, 0, 11, 20), datetime.datetime(2026, 6, 4, 0, 11, 19), 'salt', 1.6, 100.11, None, 55.5, 121.78, -0.01, 821.53, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:11:29.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:11:29.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:11:29.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:11:19, diff=10.265357s, valid=True
2026-06-04T00:11:29.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:11:29.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:11:29.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:11:12, diff=17.268845s, valid=True
2026-06-04T00:11:29.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:11:29.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:11:29.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:11:12, diff=17.277125s, valid=True
2026-06-04T00:11:29.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:11:29.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:11:29.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:11:29.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:11:29.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:11:29.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:11:29.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:11:12, diff=17.280837s, valid=True
2026-06-04T00:11:29.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:11:29.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:11:29.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:11:29.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98886.281645s, valid=True
2026-06-04T00:11:29.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:11:29.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:11:29.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:11:29.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:11:29.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:11:29.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:11:29.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:11:29.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:11:29.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:11:29.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:11:29.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:11:29.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:11:29.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:11:29.602 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:11:29.807 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:11:30.178 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:11:30.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:11:30.280 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:11:30.280 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:11:30.465 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:11:30.465 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:12:00.492 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:12:00.492 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:12:00.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:12:00.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:12:00.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:12:01.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:12:01.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:12:01.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:12:01.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:12:01.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:12:01.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:12:01.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:12:01.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:12:03.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:12:03.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:12:03.778 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:12:03.778 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:12:03.788 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:12:03.801 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:12:03.802 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:12:03.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:12:03.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:12:03.803 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:12:03.803 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:12:03.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:12:03.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:12:03.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:12:04.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:12:04.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:12:04.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:12:04.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:12:04.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:12:04.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:12:04.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:12:04.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:12:04.140 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:12:04.211 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:11:50
2026-06-04T00:12:04.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87418, datetime.datetime(2026, 6, 4, 0, 11, 50), datetime.datetime(2026, 6, 4, 0, 11, 49), 'salt', 1.6, 100.21, None, 47.88, 107.35, -0.03, 821.53, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:12:04.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:12:04.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:12:04.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:11:49, diff=15.218228s, valid=True
2026-06-04T00:12:04.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:12:04.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:12:04.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:12:12, diff=-7.778389s, valid=True
2026-06-04T00:12:04.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:12:04.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:12:04.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:11:42, diff=22.229486s, valid=True
2026-06-04T00:12:04.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:12:04.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:12:04.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:12:04.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:12:04.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:12:04.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:12:04.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:12:12, diff=-7.766712s, valid=True
2026-06-04T00:12:04.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:12:04.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:12:04.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:12:04.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98921.23411s, valid=True
2026-06-04T00:12:04.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:12:04.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:12:04.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:12:04.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:12:04.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:12:04.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:12:04.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:12:04.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:12:04.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:12:04.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:12:04.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:12:04.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:12:04.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:12:04.634 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:12:04.841 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:12:05.188 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:12:05.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:12:05.292 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:12:05.293 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:12:05.541 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:12:05.541 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:12:35.571 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:12:35.571 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:12:35.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:12:35.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:12:35.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:12:36.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:12:36.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:12:36.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:12:36.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:12:36.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:12:36.163 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:12:36.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:12:36.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:12:38.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:12:38.532 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:12:38.533 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:12:38.533 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:12:38.543 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:12:38.556 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:12:38.556 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:12:38.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:12:38.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:12:38.557 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:12:38.558 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:12:38.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:12:38.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:12:38.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:12:38.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:12:38.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:12:38.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:12:38.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:12:38.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:12:38.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:12:38.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:12:38.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:12:38.893 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:12:38.967 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:12:20
2026-06-04T00:12:38.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87419, datetime.datetime(2026, 6, 4, 0, 12, 20), datetime.datetime(2026, 6, 4, 0, 12, 20), 'salt', 1.6, 100.11, None, 45.9, 120.25, -0.01, 821.59, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:12:38.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:12:38.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:12:38.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:12:20, diff=18.978524s, valid=True
2026-06-04T00:12:38.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:12:38.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:12:38.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:12:12, diff=26.981909s, valid=True
2026-06-04T00:12:38.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:12:38.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:12:38.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:12:13, diff=25.989774s, valid=True
2026-06-04T00:12:38.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:12:38.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:12:38.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:12:38.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:12:38.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:12:38.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:12:38.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:12:12, diff=26.993349s, valid=True
2026-06-04T00:12:38.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:12:38.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:12:38.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:12:38.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98955.994135s, valid=True
2026-06-04T00:12:38.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:12:38.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:12:38.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:12:38.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:12:38.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:12:39.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:12:39.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:12:39.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:12:39.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:12:39.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:12:39.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:12:39.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:12:39.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:12:39.315 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:12:39.525 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:12:39.875 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:12:39.982 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:12:39.983 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:12:39.983 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:12:40.167 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:12:40.167 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:13:10.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:13:10.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:13:10.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:13:10.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:13:10.606 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:13:10.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:13:10.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:13:10.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:13:10.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:13:10.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:13:10.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:13:10.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:13:10.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:13:13.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:13:13.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:13:13.375 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:13:13.375 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:13:13.386 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:13:13.399 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:13:13.399 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:13:13.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:13:13.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:13:13.400 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:13:13.401 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:13:13.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:13:13.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:13:13.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:13:13.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:13:13.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:13:13.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:13:13.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:13:13.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:13:13.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:13:13.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:13:13.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:13:13.758 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:13:13.868 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:12:51
2026-06-04T00:13:13.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87420, datetime.datetime(2026, 6, 4, 0, 12, 51), datetime.datetime(2026, 6, 4, 0, 12, 50), 'salt', 1.66, 100.17, None, 56.73, 114.4, -0.03, 821.47, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:13:13.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:13:13.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:13:13.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:12:50, diff=23.876074s, valid=True
2026-06-04T00:13:13.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:13:13.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:13:13.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:13:12, diff=1.879657s, valid=True
2026-06-04T00:13:13.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:13:13.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:13:13.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:12:43, diff=30.887984s, valid=True
2026-06-04T00:13:13.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:13:13.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:13:13.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:13:13.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:13:13.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:13:13.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:13:13.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:13:12, diff=1.891779s, valid=True
2026-06-04T00:13:13.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:13:13.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:13:13.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:13:13.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=98990.892582s, valid=True
2026-06-04T00:13:13.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:13:13.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:13:13.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:13:13.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:13:13.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:13:13.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:13:13.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:13:13.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:13:14.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:13:14.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:13:14.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:13:14.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:13:14.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:13:14.281 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:13:14.487 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:13:14.830 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:13:14.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:13:14.932 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:13:14.932 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:13:15.193 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:13:15.193 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:13:45.224 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:13:45.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:13:45.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:13:45.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:13:45.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:13:45.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:13:45.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:13:45.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:13:45.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:13:45.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:13:45.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:13:45.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:13:45.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:13:48.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:13:48.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:13:48.202 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:13:48.203 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:13:48.212 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:13:48.229 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:13:48.230 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:13:48.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:13:48.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:13:48.231 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:13:48.231 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:13:48.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:13:48.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:13:48.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:13:48.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:13:48.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:13:48.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:13:48.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:13:48.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:13:48.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:13:48.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:13:48.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:13:48.568 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:13:48.639 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:13:21
2026-06-04T00:13:48.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87421, datetime.datetime(2026, 6, 4, 0, 13, 21), datetime.datetime(2026, 6, 4, 0, 13, 20), 'salt', 1.63, 100.17, None, 48.2, 115.15, -0.03, 821.53, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:13:48.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:13:48.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:13:48.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:13:20, diff=28.645452s, valid=True
2026-06-04T00:13:48.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:13:48.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:13:48.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:13:12, diff=36.648345s, valid=True
2026-06-04T00:13:48.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:13:48.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:13:48.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:13:13, diff=35.655127s, valid=True
2026-06-04T00:13:48.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:13:48.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:13:48.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:13:48.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:13:48.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:13:48.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:13:48.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:13:12, diff=36.658197s, valid=True
2026-06-04T00:13:48.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:13:48.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:13:48.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:13:48.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99025.658855s, valid=True
2026-06-04T00:13:48.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:13:48.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:13:48.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:13:48.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:13:48.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:13:48.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:13:48.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:13:48.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:13:48.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:13:48.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:13:48.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:13:48.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:13:48.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:13:48.976 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:13:49.181 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:13:49.524 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:13:49.626 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:13:49.626 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:13:49.626 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:13:49.779 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:13:49.780 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:14:19.806 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:14:19.806 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:14:19.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:14:19.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:14:19.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:14:20.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:14:20.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:14:20.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:14:20.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:14:20.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:14:20.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:14:20.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:14:20.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:14:22.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:14:22.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:14:22.680 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:14:22.681 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:14:22.692 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:14:22.704 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:14:22.705 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:14:22.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:14:22.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:14:22.706 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:14:22.706 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:14:22.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:14:22.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:14:22.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:14:22.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:14:22.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:14:23.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:14:23.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:14:23.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:14:23.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:14:23.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:14:23.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:14:23.059 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:14:23.139 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:14:22
2026-06-04T00:14:23.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87423, datetime.datetime(2026, 6, 4, 0, 14, 22), datetime.datetime(2026, 6, 4, 0, 14, 21), 'salt', 1.63, 100.21, None, 44.6, 115.2, -0.03, 821.4, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T00:14:23.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:14:23.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:14:23.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:14:21, diff=2.14577s, valid=True
2026-06-04T00:14:23.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:14:23.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:14:23.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:14:12, diff=11.148657s, valid=True
2026-06-04T00:14:23.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:14:23.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:14:23.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:14:13, diff=10.155291s, valid=True
2026-06-04T00:14:23.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:14:23.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:14:23.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:14:23.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:14:23.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:14:23.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:14:23.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:14:12, diff=11.158375s, valid=True
2026-06-04T00:14:23.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:14:23.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:14:23.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:14:23.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99060.159028s, valid=True
2026-06-04T00:14:23.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:14:23.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:14:23.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:14:23.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:14:23.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:14:23.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:14:23.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:14:23.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:14:23.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:14:23.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:14:23.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:14:23.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:14:23.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:14:23.476 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:14:23.682 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:14:24.023 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:14:24.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:14:24.125 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:14:24.125 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:14:24.214 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:14:24.214 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:14:54.244 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:14:54.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:14:54.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:14:54.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:14:54.618 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:14:54.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:14:54.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:14:54.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:14:54.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:14:54.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:14:54.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:14:54.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:14:54.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:14:57.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:14:57.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:14:57.346 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:14:57.346 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:14:57.356 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:14:57.368 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:14:57.368 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:14:57.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:14:57.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:14:57.368 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:14:57.368 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:14:57.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:14:57.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:14:57.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:14:57.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:14:57.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:14:57.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:14:57.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:14:57.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:14:57.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:14:57.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:14:57.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:14:57.653 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:14:57.726 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:14:52
2026-06-04T00:14:57.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87424, datetime.datetime(2026, 6, 4, 0, 14, 52), datetime.datetime(2026, 6, 4, 0, 14, 51), 'salt', 1.63, 99.94, None, 45.97, 123.96, 0.01, 821.52, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:14:57.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:14:57.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:14:57.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:14:51, diff=6.733462s, valid=True
2026-06-04T00:14:57.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:14:57.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:14:57.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:15:12, diff=-14.263239s, valid=True
2026-06-04T00:14:57.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:14:57.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:14:57.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:14:44, diff=13.74428s, valid=True
2026-06-04T00:14:57.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:14:57.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:14:57.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:14:57.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:14:57.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:14:57.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:14:57.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:15:12, diff=-14.252325s, valid=True
2026-06-04T00:14:57.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:14:57.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:14:57.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:14:57.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99094.748404s, valid=True
2026-06-04T00:14:57.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:14:57.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:14:57.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:14:57.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:14:57.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:14:57.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:14:57.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:14:57.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:14:57.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:14:57.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:14:57.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:14:57.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:14:58.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:14:58.069 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:14:58.278 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:14:58.622 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:14:58.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:14:58.785 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:14:58.785 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:14:58.939 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:14:58.939 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:15:28.969 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:15:28.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:15:28.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:15:29.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:15:29.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:15:29.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:15:29.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:15:29.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:15:29.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:15:29.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:15:29.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:15:29.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:15:29.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:15:32.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:15:32.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:15:32.011 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:15:32.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:15:32.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:15:32.034 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:15:32.035 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:15:32.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:15:32.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:15:32.036 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:15:32.036 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:15:32.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:15:32.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:15:32.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:15:32.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:15:32.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:15:32.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:15:32.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:15:32.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:15:32.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:15:32.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:15:32.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:15:32.343 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:15:32.414 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:15:22
2026-06-04T00:15:32.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87425, datetime.datetime(2026, 6, 4, 0, 15, 22), datetime.datetime(2026, 6, 4, 0, 15, 21), 'salt', 1.6, 100.14, None, 48.34, 130.35, -0.02, 821.4, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:15:32.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:15:32.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:15:32.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:15:21, diff=11.421657s, valid=True
2026-06-04T00:15:32.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:15:32.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:15:32.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:15:12, diff=20.424984s, valid=True
2026-06-04T00:15:32.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:15:32.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:15:32.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:15:14, diff=18.432834s, valid=True
2026-06-04T00:15:32.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:15:32.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:15:32.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:15:32.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:15:32.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:15:32.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:15:32.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:15:12, diff=20.436417s, valid=True
2026-06-04T00:15:32.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:15:32.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:15:32.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:15:32.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99129.437209s, valid=True
2026-06-04T00:15:32.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:15:32.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:15:32.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:15:32.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:15:32.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:15:32.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:15:32.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:15:32.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:15:32.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:15:32.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:15:32.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:15:32.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:15:32.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:15:32.757 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:15:32.963 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:15:33.303 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:15:33.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:15:33.405 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:15:33.405 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:15:33.645 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:15:33.646 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:16:03.653 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:16:03.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:16:03.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:16:03.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:16:03.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:16:04.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:16:04.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:16:04.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:16:04.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:16:04.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:16:04.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:16:04.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:16:04.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:16:06.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:16:06.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:16:06.573 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:16:06.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:16:06.584 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:16:06.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:16:06.601 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:16:06.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:16:06.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:16:06.601 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:16:06.601 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:16:06.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:16:06.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:16:06.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:16:06.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:16:06.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:16:06.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:16:06.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:16:06.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:16:06.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:16:06.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:16:06.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:16:06.897 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:16:06.987 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:15:52
2026-06-04T00:16:06.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87426, datetime.datetime(2026, 6, 4, 0, 15, 52), datetime.datetime(2026, 6, 4, 0, 15, 52), 'salt', 1.63, 100.14, None, 52.85, 119.99, -0.02, 821.53, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:16:06.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:16:06.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:16:06.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:15:52, diff=14.994002s, valid=True
2026-06-04T00:16:06.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:16:06.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:16:06.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:16:12, diff=-5.002597s, valid=True
2026-06-04T00:16:06.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:16:06.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:16:07.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:15:44, diff=23.00519s, valid=True
2026-06-04T00:16:07.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:16:07.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:16:07.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:16:07.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:16:07.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:16:07.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:16:07.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:16:12, diff=-4.9912s, valid=True
2026-06-04T00:16:07.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:16:07.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:16:07.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:16:07.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99164.009563s, valid=True
2026-06-04T00:16:07.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:16:07.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:16:07.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:16:07.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:16:07.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:16:07.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:16:07.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:16:07.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:16:07.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:16:07.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:16:07.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:16:07.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:16:07.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:16:07.327 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:16:07.606 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:16:07.945 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:16:08.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:16:08.047 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:16:08.047 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:16:08.262 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:16:08.263 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:16:38.292 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:16:38.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:16:38.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:16:38.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:16:38.437 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:16:38.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:16:38.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:16:38.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:16:38.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:16:38.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:16:38.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:16:38.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:16:38.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:16:41.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:16:41.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:16:41.733 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:16:41.733 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:16:41.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:16:41.757 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:16:41.758 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:16:41.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:16:41.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:16:41.759 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:16:41.759 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:16:41.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:16:41.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:16:41.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:16:42.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:16:42.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:16:42.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:16:42.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:16:42.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:16:42.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:16:42.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:16:42.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:16:42.101 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:16:42.181 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:16:23
2026-06-04T00:16:42.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87427, datetime.datetime(2026, 6, 4, 0, 16, 23), datetime.datetime(2026, 6, 4, 0, 16, 22), 'salt', 1.6, 100.11, None, 55.89, 122.13, -0.01, 821.47, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:16:42.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:16:42.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:16:42.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:16:22, diff=20.195951s, valid=True
2026-06-04T00:16:42.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:16:42.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:16:42.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:16:12, diff=30.202614s, valid=True
2026-06-04T00:16:42.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:16:42.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:16:42.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:16:14, diff=28.216861s, valid=True
2026-06-04T00:16:42.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:16:42.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:16:42.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:16:42.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:16:42.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:16:42.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:16:42.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:16:12, diff=30.22065s, valid=True
2026-06-04T00:16:42.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:16:42.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:16:42.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:16:42.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99199.221295s, valid=True
2026-06-04T00:16:42.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:16:42.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:16:42.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:16:42.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:16:42.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:16:42.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:16:42.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:16:42.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:16:42.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:16:42.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:16:42.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:16:42.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:16:42.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:16:42.533 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:16:42.739 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:16:43.077 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:16:43.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:16:43.175 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:16:43.176 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:16:43.331 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:16:43.331 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:17:13.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:17:13.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:17:13.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:17:13.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:17:13.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:17:13.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:17:13.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:17:13.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:17:13.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:17:13.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:17:13.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:17:13.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:17:13.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:17:16.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:17:16.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:17:16.495 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:17:16.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:17:16.507 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:17:16.528 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:17:16.529 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:17:16.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:17:16.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:17:16.530 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:17:16.530 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:17:16.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:17:16.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:17:16.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:17:16.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:17:16.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:17:16.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:17:16.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:17:16.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:17:16.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:17:16.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:17:16.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:17:16.864 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:17:16.932 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:16:53
2026-06-04T00:17:16.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87428, datetime.datetime(2026, 6, 4, 0, 16, 53), datetime.datetime(2026, 6, 4, 0, 16, 53), 'salt', 1.66, 100.21, None, 51.94, 118.42, -0.03, 821.4, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:17:16.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:17:16.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:17:16.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:16:53, diff=23.939978s, valid=True
2026-06-04T00:17:16.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:17:16.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:17:16.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:17:12, diff=4.943537s, valid=True
2026-06-04T00:17:16.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:17:16.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:17:16.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:16:45, diff=31.952045s, valid=True
2026-06-04T00:17:16.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:17:16.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:17:16.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:17:16.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:17:16.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:17:16.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:17:16.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:17:12, diff=4.955837s, valid=True
2026-06-04T00:17:16.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:17:16.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:17:16.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:17:16.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99233.956653s, valid=True
2026-06-04T00:17:16.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:17:16.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:17:16.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:17:16.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:17:16.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:17:17.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:17:17.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:17:17.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:17:17.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:17:17.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:17:17.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:17:17.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:17:17.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:17:17.351 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:17:17.555 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:17:17.896 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:17:17.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:17:17.997 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:17:17.997 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:17:18.171 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:17:18.171 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:17:48.190 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:17:48.191 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:17:48.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:17:48.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:17:48.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:17:48.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:17:48.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:17:48.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:17:48.619 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:17:48.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:17:48.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:17:48.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:17:48.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:17:51.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:17:51.026 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:17:51.027 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:17:51.027 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:17:51.036 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:17:51.049 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:17:51.049 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:17:51.050 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:17:51.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:17:51.051 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:17:51.051 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:17:51.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:17:51.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:17:51.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:17:51.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:17:51.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:17:51.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:17:51.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:17:51.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:17:51.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:17:51.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:17:51.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:17:51.390 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:17:51.459 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:17:23
2026-06-04T00:17:51.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87429, datetime.datetime(2026, 6, 4, 0, 17, 23), datetime.datetime(2026, 6, 4, 0, 17, 22), 'salt', 1.6, 100.21, None, 54.44, 122.67, -0.03, 821.4, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:17:51.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:17:51.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:17:51.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:17:22, diff=29.465236s, valid=True
2026-06-04T00:17:51.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:17:51.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:17:51.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:17:12, diff=39.468043s, valid=True
2026-06-04T00:17:51.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:17:51.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:17:51.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:17:15, diff=36.474705s, valid=True
2026-06-04T00:17:51.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:17:51.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:17:51.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:17:51.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:17:51.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:17:51.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:17:51.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:17:12, diff=39.477727s, valid=True
2026-06-04T00:17:51.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:17:51.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:17:51.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:17:51.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99268.478372s, valid=True
2026-06-04T00:17:51.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:17:51.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:17:51.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:17:51.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:17:51.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:17:51.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:17:51.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:17:51.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:17:51.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:17:51.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:17:51.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:17:51.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:17:51.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:17:51.799 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:17:52.020 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:17:52.362 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:17:52.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:17:52.465 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:17:52.465 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:17:52.549 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:17:52.549 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:18:22.580 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:18:22.580 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:18:22.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:18:22.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:18:22.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:18:23.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:18:23.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:18:23.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:18:23.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:18:23.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:18:23.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:18:23.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:18:23.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:18:25.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:18:25.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:18:25.888 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:18:25.889 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:18:25.899 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:18:25.912 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:18:25.912 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:18:25.913 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:18:25.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:18:25.913 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:18:25.914 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:18:25.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:18:26.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:18:26.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:18:26.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:18:26.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:18:26.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:18:26.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:18:26.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:18:26.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:18:26.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:18:26.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:18:26.242 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:18:26.314 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:18:24
2026-06-04T00:18:26.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87431, datetime.datetime(2026, 6, 4, 0, 18, 24), datetime.datetime(2026, 6, 4, 0, 18, 23), 'salt', 1.57, 100.08, None, 42.06, 115.62, -0.01, 821.59, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T00:18:26.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:18:26.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:18:26.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:18:23, diff=3.32152s, valid=True
2026-06-04T00:18:26.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:18:26.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:18:26.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:18:12, diff=14.325064s, valid=True
2026-06-04T00:18:26.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:18:26.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:18:26.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:18:16, diff=10.333232s, valid=True
2026-06-04T00:18:26.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:18:26.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:18:26.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:18:26.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:18:26.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:18:26.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:18:26.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:18:12, diff=14.33701s, valid=True
2026-06-04T00:18:26.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:18:26.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:18:26.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:18:26.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99303.337843s, valid=True
2026-06-04T00:18:26.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:18:26.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:18:26.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:18:26.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:18:26.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:18:26.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:18:26.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:18:26.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:18:26.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:18:26.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:18:26.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:18:26.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:18:26.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:18:26.732 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:18:26.938 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:18:27.287 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:18:27.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:18:27.392 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:18:27.392 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:18:27.636 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:18:27.636 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:18:57.666 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:18:57.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:18:57.666 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:18:57.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:18:57.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:18:58.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:18:58.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:18:58.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:18:58.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:18:58.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:18:58.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:18:58.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:18:58.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:19:00.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:19:00.669 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:19:00.670 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:19:00.670 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:19:00.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:19:00.693 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:19:00.693 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:19:00.694 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:19:00.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:19:00.694 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:19:00.695 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:19:00.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:19:00.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:19:00.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:19:00.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:19:00.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:19:00.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:19:00.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:19:01.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:19:01.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:19:01.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:19:01.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:19:01.022 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:19:01.091 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:18:54
2026-06-04T00:19:01.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87432, datetime.datetime(2026, 6, 4, 0, 18, 54), datetime.datetime(2026, 6, 4, 0, 18, 53), 'salt', 1.5, 100.08, None, 53.14, 122.55, -0.01, 821.53, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:19:01.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:19:01.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:19:01.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:18:53, diff=8.099001s, valid=True
2026-06-04T00:19:01.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:19:01.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:19:01.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:19:12, diff=-10.897601s, valid=True
2026-06-04T00:19:01.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:19:01.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:19:01.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:18:46, diff=15.110421s, valid=True
2026-06-04T00:19:01.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:19:01.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:19:01.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:19:01.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:19:01.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:19:01.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:19:01.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:19:12, diff=-10.885916s, valid=True
2026-06-04T00:19:01.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:19:01.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:19:01.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:19:01.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99338.114889s, valid=True
2026-06-04T00:19:01.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:19:01.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:19:01.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:19:01.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:19:01.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:19:01.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:19:01.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:19:01.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:19:01.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:19:01.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:19:01.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:19:01.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:19:01.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:19:01.434 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:19:01.643 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:19:02.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:19:02.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:19:02.115 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:19:02.115 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:19:02.196 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:19:02.196 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:19:32.220 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:19:32.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:19:32.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:19:32.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:19:32.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:19:32.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:19:32.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:19:32.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:19:32.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:19:32.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:19:32.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:19:32.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:19:32.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:19:36.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:19:36.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:19:36.142 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:19:36.142 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:19:36.152 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:19:36.165 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:19:36.165 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:19:36.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:19:36.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:19:36.166 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:19:36.167 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:19:36.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:19:36.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:19:36.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:19:36.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:19:36.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:19:36.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:19:36.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:19:36.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:19:36.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:19:36.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:19:36.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:19:36.498 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:19:36.570 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:19:24
2026-06-04T00:19:36.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87433, datetime.datetime(2026, 6, 4, 0, 19, 24), datetime.datetime(2026, 6, 4, 0, 19, 23), 'salt', 1.6, 100.14, None, 57.09, 121.75, -0.02, 821.47, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:19:36.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:19:36.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:19:36.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:19:23, diff=13.57798s, valid=True
2026-06-04T00:19:36.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:19:36.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:19:36.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:19:12, diff=24.581539s, valid=True
2026-06-04T00:19:36.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:19:36.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:19:36.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:19:16, diff=20.589465s, valid=True
2026-06-04T00:19:36.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:19:36.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:19:36.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:19:36.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:19:36.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:19:36.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:19:36.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:19:12, diff=24.592825s, valid=True
2026-06-04T00:19:36.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:19:36.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:19:36.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:19:36.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99373.593539s, valid=True
2026-06-04T00:19:36.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:19:36.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:19:36.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:19:36.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:19:36.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:19:36.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:19:36.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:19:36.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:19:36.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:19:36.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:19:36.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:19:36.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:19:36.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:19:36.981 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:19:37.188 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:19:37.559 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:19:37.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:19:37.663 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:19:37.663 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:19:37.888 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:19:37.888 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:20:07.918 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:20:07.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:20:07.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:20:08.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:20:08.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:20:08.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:20:08.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:20:08.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:20:08.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:20:08.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:20:08.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:20:08.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:20:08.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:20:11.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:20:11.254 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:20:11.254 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:20:11.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:20:11.264 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:20:11.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:20:11.276 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:20:11.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:20:11.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:20:11.276 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:20:11.277 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:20:11.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:20:11.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:20:11.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:20:11.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:20:11.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:20:11.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:20:11.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:20:11.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:20:11.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:20:11.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:20:11.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:20:11.545 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:20:11.616 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:19:54
2026-06-04T00:20:11.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87434, datetime.datetime(2026, 6, 4, 0, 19, 54), datetime.datetime(2026, 6, 4, 0, 19, 54), 'salt', 1.6, 100.18, None, 47.31, 121.28, -0.02, 821.47, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:20:11.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:20:11.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:20:11.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:19:54, diff=17.62307s, valid=True
2026-06-04T00:20:11.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:20:11.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:20:11.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:20:12, diff=-0.373703s, valid=True
2026-06-04T00:20:11.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:20:11.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:20:11.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:19:46, diff=25.633899s, valid=True
2026-06-04T00:20:11.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:20:11.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:20:11.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:20:11.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:20:11.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:20:11.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:20:11.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:20:12, diff=-0.362644s, valid=True
2026-06-04T00:20:11.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:20:11.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:20:11.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:20:11.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99408.638125s, valid=True
2026-06-04T00:20:11.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:20:11.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:20:11.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:20:11.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:20:11.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:20:11.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:20:11.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:20:11.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:20:11.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:20:11.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:20:11.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:20:11.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:20:11.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:20:11.963 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:20:12.168 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:20:12.507 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:20:12.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:20:12.610 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:20:12.610 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:20:12.696 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:20:12.696 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:20:42.726 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:20:42.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:20:42.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:20:43.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:20:43.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:20:43.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:20:43.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:20:43.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:20:43.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:20:43.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:20:43.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:20:43.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:20:43.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:20:46.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:20:46.616 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:20:46.617 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:20:46.618 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:20:46.627 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:20:46.643 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:20:46.644 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:20:46.644 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:20:46.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:20:46.645 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:20:46.645 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:20:46.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:20:46.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:20:46.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:20:46.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:20:46.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:20:46.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:20:46.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:20:46.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:20:46.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:20:46.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:20:46.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:20:46.975 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:20:47.046 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:20:25
2026-06-04T00:20:47.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87435, datetime.datetime(2026, 6, 4, 0, 20, 25), datetime.datetime(2026, 6, 4, 0, 20, 24), 'salt', 1.57, 100.18, None, 51.41, 117.88, -0.02, 821.53, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:20:47.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:20:47.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:20:47.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:20:24, diff=23.053801s, valid=True
2026-06-04T00:20:47.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:20:47.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:20:47.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:20:12, diff=35.057292s, valid=True
2026-06-04T00:20:47.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:20:47.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:20:47.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:20:17, diff=30.065352s, valid=True
2026-06-04T00:20:47.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:20:47.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:20:47.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:20:47.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:20:47.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:20:47.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:20:47.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:20:12, diff=35.069162s, valid=True
2026-06-04T00:20:47.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:20:47.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:20:47.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:20:47.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99444.069975s, valid=True
2026-06-04T00:20:47.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:20:47.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:20:47.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:20:47.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:20:47.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:20:47.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:20:47.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:20:47.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:20:47.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:20:47.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:20:47.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:20:47.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:20:47.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:20:47.390 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:20:47.596 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:20:47.937 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:20:48.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:20:48.039 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:20:48.039 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:20:48.271 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:20:48.272 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:21:18.302 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:21:18.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:21:18.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:21:18.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:21:18.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:21:18.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:21:18.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:21:18.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:21:18.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:21:18.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:21:18.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:21:18.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:21:18.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:21:21.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:21:21.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:21:21.448 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:21:21.448 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:21:21.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:21:21.472 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:21:21.472 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:21:21.473 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:21:21.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:21:21.473 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:21:21.474 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:21:21.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:21:21.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:21:21.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:21:21.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:21:21.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:21:21.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:21:21.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:21:21.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:21:21.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:21:21.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:21:21.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:21:21.809 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:21:21.888 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:20:55
2026-06-04T00:21:21.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87436, datetime.datetime(2026, 6, 4, 0, 20, 55), datetime.datetime(2026, 6, 4, 0, 20, 54), 'salt', 1.53, 100.18, None, 55.01, 119.45, -0.03, 821.53, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:21:21.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:21:21.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:21:21.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:20:54, diff=27.895556s, valid=True
2026-06-04T00:21:21.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:21:21.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:21:21.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:21:12, diff=9.899105s, valid=True
2026-06-04T00:21:21.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:21:21.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:21:21.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:20:54, diff=27.90727s, valid=True
2026-06-04T00:21:21.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:21:21.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:21:21.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:21:21.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:21:21.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:21:21.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:21:21.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:21:12, diff=9.911025s, valid=True
2026-06-04T00:21:21.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:21:21.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:21:21.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:21:21.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99478.911852s, valid=True
2026-06-04T00:21:21.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:21:21.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:21:21.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:21:21.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:21:21.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:21:21.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:21:21.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:21:21.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:21:21.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:21:22.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:21:22.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:21:22.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:21:22.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:21:22.231 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:21:22.439 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:21:22.838 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:21:22.940 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:21:22.940 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:21:22.940 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:21:23.129 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:21:23.129 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:21:53.158 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:21:53.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:21:53.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:21:53.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:21:53.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:21:53.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:21:53.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:21:53.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:21:53.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:21:53.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:21:53.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:21:53.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:21:53.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:21:56.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:21:56.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:21:56.041 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:21:56.042 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:21:56.051 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:21:56.063 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:21:56.064 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:21:56.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:21:56.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:21:56.065 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:21:56.065 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:21:56.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:21:56.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:21:56.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:21:56.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:21:56.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:21:56.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:21:56.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:21:56.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:21:56.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:21:56.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:21:56.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:21:56.403 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:21:56.474 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:21:55
2026-06-04T00:21:56.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87438, datetime.datetime(2026, 6, 4, 0, 21, 55), datetime.datetime(2026, 6, 4, 0, 21, 55), 'salt', 1.57, 100.08, None, 38.81, 125.04, -0.01, 821.59, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T00:21:56.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:21:56.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:21:56.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:21:55, diff=1.482058s, valid=True
2026-06-04T00:21:56.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:21:56.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:21:56.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:22:12, diff=-15.514414s, valid=True
2026-06-04T00:21:56.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:21:56.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:21:56.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:21:48, diff=8.493729s, valid=True
2026-06-04T00:21:56.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:21:56.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:21:56.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:21:56.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:21:56.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:21:56.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:21:56.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:22:12, diff=-15.502512s, valid=True
2026-06-04T00:21:56.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:21:56.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:21:56.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:21:56.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99513.498302s, valid=True
2026-06-04T00:21:56.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:21:56.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:21:56.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:21:56.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:21:56.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:21:56.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:21:56.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:21:56.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:21:56.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:21:56.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:21:56.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:21:56.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:21:56.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:21:56.818 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:21:57.024 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:21:57.365 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:21:57.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:21:57.467 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:21:57.467 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:21:57.551 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:21:57.551 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:22:27.568 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:22:27.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:22:27.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:22:27.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:22:27.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:22:28.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:22:28.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:22:28.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:22:28.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:22:28.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:22:28.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:22:28.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:22:28.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:22:30.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:22:30.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:22:30.593 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:22:30.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:22:30.604 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:22:30.623 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:22:30.624 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:22:30.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:22:30.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:22:30.625 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:22:30.626 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:22:30.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:22:30.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:22:30.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:22:30.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:22:30.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:22:30.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:22:30.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:22:30.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:22:30.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:22:30.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:22:30.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:22:30.955 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:22:31.026 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:22:26
2026-06-04T00:22:31.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87439, datetime.datetime(2026, 6, 4, 0, 22, 26), datetime.datetime(2026, 6, 4, 0, 22, 25), 'salt', 1.6, 100.14, None, 44.14, 118.63, -0.02, 821.53, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T00:22:31.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:22:31.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:22:31.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:22:25, diff=6.033489s, valid=True
2026-06-04T00:22:31.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:22:31.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:22:31.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:22:12, diff=19.036863s, valid=True
2026-06-04T00:22:31.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:22:31.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:22:31.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:22:18, diff=13.044837s, valid=True
2026-06-04T00:22:31.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:22:31.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:22:31.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:22:31.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:22:31.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:22:31.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:22:31.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:22:12, diff=19.04844s, valid=True
2026-06-04T00:22:31.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:22:31.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:22:31.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:22:31.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99548.049231s, valid=True
2026-06-04T00:22:31.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:22:31.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:22:31.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:22:31.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:22:31.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:22:31.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:22:31.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:22:31.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:22:31.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:22:31.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:22:31.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:22:31.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:22:31.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:22:31.368 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:22:31.650 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:22:31.991 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:22:32.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:22:32.093 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:22:32.093 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:22:32.251 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:22:32.251 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:23:02.281 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:23:02.281 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:23:02.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:23:02.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:23:02.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:23:02.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:23:02.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:23:02.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:23:02.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:23:02.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:23:02.698 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:23:02.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:23:02.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:23:04.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:23:04.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:23:04.969 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:23:04.969 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:23:04.980 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:23:04.992 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:23:04.993 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:23:04.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:23:04.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:23:04.994 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:23:04.994 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:23:05.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:23:05.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:23:05.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:23:05.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:23:05.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:23:05.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:23:05.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:23:05.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:23:05.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:23:05.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:23:05.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:23:05.327 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:23:05.399 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:22:56
2026-06-04T00:23:05.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87440, datetime.datetime(2026, 6, 4, 0, 22, 56), datetime.datetime(2026, 6, 4, 0, 22, 55), 'salt', 1.66, 100.14, None, 43.79, 115.6, -0.03, 821.47, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T00:23:05.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:23:05.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:23:05.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:22:55, diff=10.40681s, valid=True
2026-06-04T00:23:05.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:23:05.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:23:05.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:23:12, diff=-6.589691s, valid=True
2026-06-04T00:23:05.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:23:05.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:23:05.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:22:48, diff=17.418351s, valid=True
2026-06-04T00:23:05.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:23:05.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:23:05.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:23:05.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:23:05.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:23:05.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:23:05.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:23:12, diff=-6.577924s, valid=True
2026-06-04T00:23:05.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:23:05.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:23:05.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:23:05.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99582.422974s, valid=True
2026-06-04T00:23:05.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:23:05.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:23:05.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:23:05.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:23:05.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:23:05.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:23:05.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:23:05.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:23:05.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:23:05.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:23:05.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:23:05.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:23:05.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:23:05.743 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:23:05.948 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:23:06.289 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:23:06.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:23:06.391 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:23:06.391 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:23:06.471 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:23:06.471 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:23:36.473 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:23:36.473 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:23:36.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:23:36.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:23:36.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:23:37.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:23:37.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:23:37.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:23:37.181 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:23:37.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:23:37.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:23:37.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:23:37.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:23:39.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:23:39.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:23:39.589 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:23:39.589 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:23:39.599 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:23:39.619 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:23:39.620 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:23:39.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:23:39.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:23:39.621 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:23:39.621 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:23:39.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:23:39.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:23:39.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:23:39.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:23:39.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:23:39.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:23:39.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:23:39.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:23:39.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:23:39.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:23:39.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:23:39.948 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:23:40.027 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:23:26
2026-06-04T00:23:40.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87441, datetime.datetime(2026, 6, 4, 0, 23, 26), datetime.datetime(2026, 6, 4, 0, 23, 25), 'salt', 1.6, 100.21, None, 52.11, 125.07, -0.03, 821.71, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:23:40.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:23:40.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:23:40.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:23:25, diff=15.034113s, valid=True
2026-06-04T00:23:40.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:23:40.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:23:40.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:23:12, diff=28.037507s, valid=True
2026-06-04T00:23:40.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:23:40.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:23:40.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:23:19, diff=21.045336s, valid=True
2026-06-04T00:23:40.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:23:40.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:23:40.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:23:40.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:23:40.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:23:40.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:23:40.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:23:12, diff=28.04895s, valid=True
2026-06-04T00:23:40.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:23:40.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:23:40.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:23:40.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99617.04974s, valid=True
2026-06-04T00:23:40.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:23:40.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:23:40.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:23:40.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:23:40.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:23:40.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:23:40.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:23:40.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:23:40.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:23:40.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:23:40.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:23:40.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:23:40.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:23:40.444 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:23:40.650 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:23:40.992 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:23:41.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:23:41.094 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:23:41.094 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:23:41.346 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:23:41.346 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:24:11.376 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:24:11.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:24:11.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:24:11.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:24:11.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:24:11.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:24:11.940 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:24:11.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:24:11.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:24:11.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:24:11.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:24:11.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:24:11.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:24:14.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:24:14.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:24:14.408 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:24:14.408 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:24:14.419 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:24:14.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:24:14.433 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:24:14.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:24:14.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:24:14.434 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:24:14.434 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:24:14.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:24:14.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:24:14.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:24:14.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:24:14.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:24:14.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:24:14.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:24:14.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:24:14.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:24:14.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:24:14.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:24:14.768 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:24:14.839 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:23:56
2026-06-04T00:24:14.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87442, datetime.datetime(2026, 6, 4, 0, 23, 56), datetime.datetime(2026, 6, 4, 0, 23, 56), 'salt', 1.67, 100.21, None, 51.83, 138.13, -0.03, 821.47, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:24:14.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:24:14.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:24:14.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:23:56, diff=18.847322s, valid=True
2026-06-04T00:24:14.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:24:14.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:24:14.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:24:12, diff=2.850841s, valid=True
2026-06-04T00:24:14.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:24:14.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:24:14.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:23:49, diff=25.859094s, valid=True
2026-06-04T00:24:14.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:24:14.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:24:14.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:24:14.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:24:14.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:24:14.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:24:14.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:24:12, diff=2.862823s, valid=True
2026-06-04T00:24:14.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:24:14.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:24:14.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:24:14.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99651.863646s, valid=True
2026-06-04T00:24:14.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:24:14.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:24:14.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:24:14.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:24:14.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:24:14.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:24:14.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:24:14.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:24:14.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:24:15.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:24:15.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:24:15.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:24:15.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:24:15.183 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:24:15.388 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:24:15.731 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:24:15.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:24:15.832 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:24:15.833 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:24:16.014 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:24:16.014 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:24:46.021 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:24:46.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:24:46.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:24:46.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:24:46.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:24:46.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:24:46.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:24:46.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:24:46.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:24:46.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:24:46.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:24:46.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:24:46.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:24:49.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:24:49.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:24:49.176 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:24:49.176 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:24:49.186 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:24:49.198 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:24:49.199 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:24:49.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:24:49.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:24:49.200 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:24:49.200 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:24:49.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:24:49.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:24:49.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:24:49.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:24:49.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:24:49.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:24:49.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:24:49.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:24:49.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:24:49.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:24:49.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:24:49.554 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:24:49.633 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:24:27
2026-06-04T00:24:49.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87443, datetime.datetime(2026, 6, 4, 0, 24, 27), datetime.datetime(2026, 6, 4, 0, 24, 26), 'salt', 1.6, 100.18, None, 44.7, 119.57, -0.02, 821.71, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T00:24:49.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:24:49.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:24:49.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:24:26, diff=23.639599s, valid=True
2026-06-04T00:24:49.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:24:49.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:24:49.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:24:12, diff=37.642437s, valid=True
2026-06-04T00:24:49.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:24:49.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:24:49.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:24:19, diff=30.649047s, valid=True
2026-06-04T00:24:49.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:24:49.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:24:49.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:24:49.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:24:49.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:24:49.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:24:49.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:24:12, diff=37.652103s, valid=True
2026-06-04T00:24:49.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:24:49.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:24:49.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:24:49.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99686.652785s, valid=True
2026-06-04T00:24:49.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:24:49.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:24:49.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:24:49.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:24:49.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:24:49.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:24:49.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:24:49.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:24:49.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:24:49.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:24:49.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:24:49.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:24:50.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:24:50.062 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:24:50.274 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:24:50.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:24:50.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:24:50.716 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:24:50.717 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:24:50.935 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:24:50.935 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:25:20.965 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:25:20.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:25:20.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:25:21.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:25:21.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:25:21.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:25:21.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:25:21.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:25:21.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:25:21.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:25:21.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:25:21.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:25:21.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:25:24.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:25:24.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:25:24.357 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:25:24.357 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:25:24.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:25:24.381 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:25:24.382 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:25:24.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:25:24.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:25:24.383 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:25:24.383 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:25:24.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:25:24.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:25:24.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:25:24.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:25:24.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:25:24.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:25:24.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:25:24.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:25:24.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:25:24.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:25:24.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:25:24.726 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:25:24.805 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:24:57
2026-06-04T00:25:24.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87444, datetime.datetime(2026, 6, 4, 0, 24, 57), datetime.datetime(2026, 6, 4, 0, 24, 56), 'salt', 1.63, 100.24, None, 49.89, 114.52, -0.04, 821.78, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:25:24.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:25:24.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:25:24.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:24:56, diff=28.81231s, valid=True
2026-06-04T00:25:24.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:25:24.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:25:24.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:25:12, diff=12.815807s, valid=True
2026-06-04T00:25:24.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:25:24.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:25:24.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:24:49, diff=35.823861s, valid=True
2026-06-04T00:25:24.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:25:24.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:25:24.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:25:24.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:25:24.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:25:24.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:25:24.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:25:12, diff=12.827577s, valid=True
2026-06-04T00:25:24.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:25:24.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:25:24.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:25:24.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99721.828393s, valid=True
2026-06-04T00:25:24.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:25:24.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:25:24.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:25:24.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:25:24.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:25:24.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:25:24.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:25:24.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:25:24.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:25:24.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:25:25.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:25:25.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:25:25.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:25:25.149 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:25:25.355 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:25:25.697 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:25:25.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:25:25.799 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:25:25.799 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:25:25.982 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:25:25.983 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:25:55.991 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:25:55.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:25:55.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:25:56.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:25:56.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:25:56.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:25:56.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:25:56.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:25:56.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:25:56.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:25:56.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:25:56.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:25:56.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:25:58.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:25:59.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:25:59.001 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:25:59.001 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:25:59.013 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:25:59.025 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:25:59.026 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:25:59.026 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:25:59.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:25:59.027 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:25:59.027 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:25:59.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:25:59.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:25:59.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:25:59.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:25:59.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:25:59.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:25:59.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:25:59.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:25:59.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:25:59.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:25:59.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:25:59.355 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:25:59.428 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:25:58
2026-06-04T00:25:59.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87446, datetime.datetime(2026, 6, 4, 0, 25, 58), datetime.datetime(2026, 6, 4, 0, 25, 58), 'salt', 1.57, 100.18, None, 51.34, 129.32, -0.02, 821.71, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:25:59.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:25:59.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:25:59.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:25:58, diff=1.436219s, valid=True
2026-06-04T00:25:59.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:25:59.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:25:59.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:26:12, diff=-12.560262s, valid=True
2026-06-04T00:25:59.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:25:59.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:25:59.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:25:50, diff=9.448076s, valid=True
2026-06-04T00:25:59.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:25:59.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:25:59.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:25:59.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:25:59.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:25:59.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:25:59.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:26:12, diff=-12.548153s, valid=True
2026-06-04T00:25:59.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:25:59.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:25:59.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:25:59.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99756.452665s, valid=True
2026-06-04T00:25:59.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:25:59.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:25:59.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:25:59.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:25:59.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:25:59.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:25:59.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:25:59.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:25:59.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:25:59.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:25:59.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:25:59.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:25:59.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:25:59.846 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:26:00.074 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:26:00.425 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:26:00.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:26:00.529 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:26:00.529 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:26:00.684 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:26:00.684 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:26:30.714 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:26:30.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:26:30.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:26:31.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:26:31.181 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:26:31.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:26:31.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:26:31.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:26:31.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:26:31.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:26:31.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:26:31.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:26:31.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:26:34.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:26:34.068 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:26:34.069 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:26:34.069 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:26:34.078 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:26:34.091 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:26:34.092 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:26:34.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:26:34.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:26:34.093 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:26:34.093 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:26:34.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:26:34.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:26:34.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:26:34.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:26:34.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:26:34.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:26:34.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:26:34.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:26:34.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:26:34.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:26:34.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:26:34.404 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:26:34.478 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:26:29
2026-06-04T00:26:34.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87447, datetime.datetime(2026, 6, 4, 0, 26, 29), datetime.datetime(2026, 6, 4, 0, 26, 28), 'salt', 1.63, 100.21, None, 46.26, 120.11, -0.03, 821.29, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:26:34.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:26:34.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:26:34.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:26:28, diff=6.486033s, valid=True
2026-06-04T00:26:34.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:26:34.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:26:34.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:26:12, diff=22.489484s, valid=True
2026-06-04T00:26:34.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:26:34.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:26:34.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:26:20, diff=14.497305s, valid=True
2026-06-04T00:26:34.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:26:34.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:26:34.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:26:34.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:26:34.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:26:34.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:26:34.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:26:12, diff=22.500844s, valid=True
2026-06-04T00:26:34.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:26:34.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:26:34.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:26:34.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99791.501603s, valid=True
2026-06-04T00:26:34.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:26:34.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:26:34.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:26:34.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:26:34.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:26:34.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:26:34.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:26:34.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:26:34.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:26:34.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:26:34.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:26:34.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:26:34.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:26:34.820 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:26:35.027 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:26:35.367 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:26:35.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:26:35.466 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:26:35.466 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:26:35.620 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:26:35.620 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:27:05.650 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:27:05.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:27:05.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:27:05.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:27:05.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:27:06.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:27:06.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:27:06.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:27:06.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:27:06.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:27:06.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:27:06.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:27:06.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:27:08.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:27:08.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:27:08.760 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:27:08.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:27:08.772 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:27:08.784 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:27:08.785 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:27:08.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:27:08.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:27:08.786 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:27:08.786 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:27:08.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:27:08.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:27:08.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:27:09.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:27:09.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:27:09.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:27:09.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:27:09.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:27:09.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:27:09.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:27:09.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:27:09.122 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:27:09.194 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:26:59
2026-06-04T00:27:09.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87448, datetime.datetime(2026, 6, 4, 0, 26, 59), datetime.datetime(2026, 6, 4, 0, 26, 58), 'salt', 1.63, 100.21, None, 46.78, 115.32, -0.03, 821.53, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:27:09.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:27:09.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:27:09.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:26:58, diff=11.201319s, valid=True
2026-06-04T00:27:09.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:27:09.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:27:09.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:27:12, diff=-2.795172s, valid=True
2026-06-04T00:27:09.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:27:09.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:27:09.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:26:51, diff=18.212934s, valid=True
2026-06-04T00:27:09.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:27:09.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:27:09.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:27:09.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:27:09.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:27:09.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:27:09.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:27:12, diff=-2.783347s, valid=True
2026-06-04T00:27:09.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:27:09.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:27:09.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:27:09.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99826.217445s, valid=True
2026-06-04T00:27:09.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:27:09.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:27:09.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:27:09.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:27:09.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:27:09.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:27:09.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:27:09.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:27:09.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:27:09.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:27:09.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:27:09.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:27:09.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:27:09.536 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:27:09.741 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:27:10.116 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:27:10.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:27:10.232 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:27:10.232 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:27:10.416 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:27:10.416 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:27:40.446 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:27:40.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:27:40.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:27:40.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:27:40.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:27:41.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:27:41.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:27:41.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:27:41.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:27:41.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:27:41.052 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:27:41.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:27:41.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:27:43.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:27:43.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:27:43.486 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:27:43.486 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:27:43.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:27:43.510 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:27:43.511 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:27:43.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:27:43.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:27:43.512 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:27:43.512 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:27:43.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:27:43.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:27:43.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:27:43.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:27:43.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:27:43.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:27:43.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:27:43.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:27:43.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:27:43.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:27:43.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:27:43.856 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:27:43.929 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:27:29
2026-06-04T00:27:43.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87449, datetime.datetime(2026, 6, 4, 0, 27, 29), datetime.datetime(2026, 6, 4, 0, 27, 28), 'salt', 1.6, 100.18, None, 48.87, 124.08, -0.03, 821.53, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:27:43.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:27:43.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:27:43.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:27:28, diff=15.936723s, valid=True
2026-06-04T00:27:43.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:27:43.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:27:43.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:27:12, diff=31.940258s, valid=True
2026-06-04T00:27:43.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:27:43.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:27:43.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:27:21, diff=22.948296s, valid=True
2026-06-04T00:27:43.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:27:43.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:27:43.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:27:43.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:27:43.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:27:43.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:27:43.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:27:12, diff=31.952043s, valid=True
2026-06-04T00:27:43.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:27:43.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:27:43.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:27:43.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99860.952857s, valid=True
2026-06-04T00:27:43.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:27:43.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:27:43.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:27:43.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:27:43.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:27:44.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:27:44.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:27:44.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:27:44.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:27:44.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:27:44.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:27:44.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:27:44.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:27:44.272 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:27:44.496 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:27:44.900 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:27:45.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:27:45.003 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:27:45.003 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:27:45.155 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:27:45.155 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:28:15.186 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:28:15.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:28:15.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:28:15.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:28:15.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:28:15.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:28:15.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:28:15.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:28:15.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:28:15.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:28:15.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:28:15.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:28:15.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:28:18.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:28:18.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:28:18.251 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:28:18.251 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:28:18.263 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:28:18.275 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:28:18.276 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:28:18.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:28:18.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:28:18.277 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:28:18.277 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:28:18.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:28:18.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:28:18.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:28:18.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:28:18.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:28:18.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:28:18.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:28:18.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:28:18.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:28:18.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:28:18.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:28:18.645 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:28:18.724 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:28:00
2026-06-04T00:28:18.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87450, datetime.datetime(2026, 6, 4, 0, 28), datetime.datetime(2026, 6, 4, 0, 27, 59), 'salt', 1.67, 100.21, None, 45.2, 117.76, -0.03, 821.59, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:28:18.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:28:18.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:28:18.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:27:59, diff=19.733503s, valid=True
2026-06-04T00:28:18.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:28:18.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:28:18.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:28:12, diff=6.737182s, valid=True
2026-06-04T00:28:18.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:28:18.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:28:18.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:27:51, diff=27.745607s, valid=True
2026-06-04T00:28:18.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:28:18.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:28:18.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:28:18.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:28:18.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:28:18.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:28:18.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:28:12, diff=6.749486s, valid=True
2026-06-04T00:28:18.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:28:18.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:28:18.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:28:18.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99895.750333s, valid=True
2026-06-04T00:28:18.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:28:18.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:28:18.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:28:18.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:28:18.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:28:18.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:28:18.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:28:18.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:28:18.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:28:18.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:28:18.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:28:18.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:28:19.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:28:19.071 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:28:19.277 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:28:19.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:28:19.718 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:28:19.719 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:28:19.719 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:28:19.875 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:28:19.875 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:28:49.889 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:28:49.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:28:49.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:28:50.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:28:50.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:28:50.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:28:50.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:28:50.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:28:50.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:28:50.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:28:50.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:28:50.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:28:50.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:28:52.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:28:52.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:28:52.859 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:28:52.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:28:52.869 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:28:52.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:28:52.882 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:28:52.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:28:52.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:28:52.883 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:28:52.884 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:28:52.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:28:53.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:28:53.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:28:53.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:28:53.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:28:53.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:28:53.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:28:53.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:28:53.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:28:53.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:28:53.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:28:53.219 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:28:53.292 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:28:30
2026-06-04T00:28:53.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87451, datetime.datetime(2026, 6, 4, 0, 28, 30), datetime.datetime(2026, 6, 4, 0, 28, 29), 'salt', 1.67, 100.24, None, 41.07, 117.53, -0.03, 821.53, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T00:28:53.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:28:53.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:28:53.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:28:29, diff=24.299599s, valid=True
2026-06-04T00:28:53.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:28:53.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:28:53.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:28:12, diff=41.303126s, valid=True
2026-06-04T00:28:53.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:28:53.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:28:53.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:28:22, diff=31.311228s, valid=True
2026-06-04T00:28:53.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:28:53.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:28:53.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:28:53.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:28:53.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:28:53.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:28:53.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:28:12, diff=41.31499s, valid=True
2026-06-04T00:28:53.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:28:53.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:28:53.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:28:53.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99930.315802s, valid=True
2026-06-04T00:28:53.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:28:53.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:28:53.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:28:53.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:28:53.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:28:53.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:28:53.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:28:53.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:28:53.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:28:53.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:28:53.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:28:53.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:28:53.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:28:53.634 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:28:53.912 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:28:54.252 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:28:54.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:28:54.354 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:28:54.354 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:28:54.536 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:28:54.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:29:24.566 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:29:24.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:29:24.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:29:25.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:29:25.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:29:25.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:29:25.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:29:25.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:29:25.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:29:25.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:29:25.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:29:25.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:29:25.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:29:27.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:29:27.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:29:27.867 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:29:27.867 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:29:27.880 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:29:27.892 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:29:27.893 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:29:27.893 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:29:27.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:29:27.894 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:29:27.894 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:29:27.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:29:28.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:29:28.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:29:28.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:29:28.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:29:28.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:29:28.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:29:28.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:29:28.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:29:28.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:29:28.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:29:28.225 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:29:28.294 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:29:00
2026-06-04T00:29:28.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87452, datetime.datetime(2026, 6, 4, 0, 29), datetime.datetime(2026, 6, 4, 0, 28, 59), 'salt', 1.63, 100.24, None, 41.49, 122.74, -0.04, 821.59, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T00:29:28.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:29:28.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:29:28.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:28:59, diff=29.302249s, valid=True
2026-06-04T00:29:28.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:29:28.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:29:28.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:29:12, diff=16.305763s, valid=True
2026-06-04T00:29:28.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:29:28.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:29:28.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:28:52, diff=36.314003s, valid=True
2026-06-04T00:29:28.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:29:28.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:29:28.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:29:28.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:29:28.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:29:28.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:29:28.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:29:12, diff=16.317732s, valid=True
2026-06-04T00:29:28.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:29:28.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:29:28.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:29:28.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99965.318542s, valid=True
2026-06-04T00:29:28.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:29:28.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:29:28.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:29:28.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:29:28.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:29:28.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:29:28.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:29:28.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:29:28.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:29:28.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:29:28.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:29:28.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:29:28.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:29:28.641 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:29:28.846 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:29:29.188 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:29:29.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:29:29.290 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:29:29.290 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:29:29.479 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:29:29.479 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:29:59.510 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:29:59.510 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:29:59.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:29:59.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:29:59.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:30:00.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:30:00.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:30:00.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:30:00.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:30:00.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:30:00.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:30:00.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:30:00.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:30:02.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:30:02.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:30:02.497 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:30:02.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:30:02.507 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:30:02.520 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:30:02.520 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:30:02.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:30:02.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:30:02.521 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:30:02.522 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:30:02.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:30:02.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:30:02.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:30:02.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:30:02.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:30:02.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:30:02.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:30:02.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:30:02.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:30:02.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:30:02.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:30:02.860 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:30:02.931 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:30:01
2026-06-04T00:30:02.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87454, datetime.datetime(2026, 6, 4, 0, 30, 1), datetime.datetime(2026, 6, 4, 0, 30), 'salt', 1.53, 100.08, None, 50.28, 126.27, -0.02, 821.41, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:30:02.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:30:02.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:30:02.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:30:00, diff=2.93868s, valid=True
2026-06-04T00:30:02.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:30:02.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:30:02.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:30:12, diff=-9.057544s, valid=True
2026-06-04T00:30:02.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:30:02.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:30:02.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:29:53, diff=9.951011s, valid=True
2026-06-04T00:30:02.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:30:02.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:30:02.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:30:02.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:30:02.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:30:02.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:30:02.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:30:12, diff=-9.045055s, valid=True
2026-06-04T00:30:02.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:30:02.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:30:02.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:30:02.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=99999.95579s, valid=True
2026-06-04T00:30:02.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:30:02.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:30:02.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:30:02.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:30:02.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:30:03.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:30:03.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:30:03.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:30:03.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:30:03.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:30:03.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:30:03.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:30:03.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:30:03.367 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:30:03.579 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:30:03.930 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:30:04.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:30:04.036 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:30:04.036 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:30:04.215 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:30:04.216 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:30:34.224 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:30:34.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:30:34.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:30:34.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:30:34.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:30:34.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:30:34.792 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:30:34.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:30:34.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:30:34.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:30:34.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:30:34.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:30:34.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:30:37.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:30:37.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:30:37.289 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:30:37.289 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:30:37.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:30:37.313 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:30:37.314 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:30:37.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:30:37.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:30:37.315 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:30:37.315 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:30:37.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:30:37.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:30:37.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:30:37.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:30:37.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:30:37.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:30:37.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:30:37.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:30:37.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:30:37.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:30:37.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:30:37.659 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:30:37.735 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:30:31
2026-06-04T00:30:37.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87455, datetime.datetime(2026, 6, 4, 0, 30, 31), datetime.datetime(2026, 6, 4, 0, 30, 30), 'salt', 1.67, 100.14, None, 46.29, 129.79, -0.02, 821.6, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:30:37.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:30:37.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:30:37.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:30:30, diff=7.741012s, valid=True
2026-06-04T00:30:37.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:30:37.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:30:37.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:30:12, diff=25.74384s, valid=True
2026-06-04T00:30:37.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:30:37.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:30:37.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:30:22, diff=15.750505s, valid=True
2026-06-04T00:30:37.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:30:37.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:30:37.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:30:37.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:30:37.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:30:37.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:30:37.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:30:12, diff=25.753571s, valid=True
2026-06-04T00:30:37.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:30:37.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:30:37.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:30:37.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100034.754224s, valid=True
2026-06-04T00:30:37.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:30:37.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:30:37.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:30:37.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:30:37.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:30:37.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:30:37.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:30:37.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:30:37.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:30:37.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:30:37.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:30:37.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:30:38.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:30:38.073 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:30:38.283 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:30:38.641 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:30:38.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:30:38.747 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:30:38.747 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:30:39.031 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:30:39.031 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:31:09.056 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:31:09.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:31:09.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:31:09.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:31:09.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:31:09.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:31:09.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:31:09.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:31:09.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:31:09.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:31:09.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:31:09.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:31:09.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:31:12.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:31:12.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:31:12.207 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:31:12.207 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:31:12.217 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:31:12.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:31:12.231 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:31:12.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:31:12.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:31:12.232 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:31:12.232 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:31:12.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:31:12.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:31:12.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:31:12.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:31:12.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:31:12.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T00:31:12.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:31:12.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T00:31:12.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:31:12.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:31:12.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:31:12.563 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:31:12.634 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:31:01
2026-06-04T00:31:12.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87456, datetime.datetime(2026, 6, 4, 0, 31, 1), datetime.datetime(2026, 6, 4, 0, 31, 1), 'salt', 1.67, 100.21, None, 51.69, 127.23, -0.03, 821.35, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:31:12.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:31:12.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:31:12.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:31:01, diff=11.641703s, valid=True
2026-06-04T00:31:12.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:31:12.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T00:31:12.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:30:12, diff=60.6452s, valid=True
2026-06-04T00:31:12.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:31:12.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:31:12.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:30:53, diff=19.653288s, valid=True
2026-06-04T00:31:12.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:31:12.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:31:12.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:31:12.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:31:12.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:31:12.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T00:31:12.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:30:12, diff=60.657039s, valid=True
2026-06-04T00:31:12.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:31:12.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:31:12.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:31:12.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100069.657857s, valid=True
2026-06-04T00:31:12.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:31:12.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:31:12.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:31:12.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:31:12.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:31:12.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:31:12.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:31:12.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:31:12.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:31:12.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:31:12.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:31:12.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:31:13.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:31:13.050 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:31:13.257 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:31:13.604 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:31:13.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:31:13.707 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:31:13.707 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:31:13.906 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:31:13.907 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:31:43.919 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:31:43.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:31:43.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:31:44.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:31:44.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:31:44.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:31:44.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:31:44.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:31:44.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:31:44.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:31:44.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:31:44.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:31:44.525 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:31:46.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:31:46.948 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:31:46.949 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:31:46.949 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:31:46.959 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:31:46.971 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:31:46.971 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:31:46.972 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:31:46.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:31:46.972 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:31:46.972 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:31:46.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:31:47.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:31:47.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:31:47.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:31:47.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:31:47.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T00:31:47.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:31:47.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T00:31:47.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:31:47.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:31:47.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:31:47.255 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:31:47.325 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:31:32
2026-06-04T00:31:47.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87457, datetime.datetime(2026, 6, 4, 0, 31, 32), datetime.datetime(2026, 6, 4, 0, 31, 31), 'salt', 1.63, 100.24, None, 45.37, 122.98, -0.04, 821.66, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:31:47.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:31:47.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:31:47.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:31:31, diff=16.332716s, valid=True
2026-06-04T00:31:47.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:31:47.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T00:31:47.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:30:12, diff=95.33596s, valid=True
2026-06-04T00:31:47.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:31:47.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:31:47.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:31:23, diff=24.343494s, valid=True
2026-06-04T00:31:47.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:31:47.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:31:47.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:31:47.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:31:47.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:31:47.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T00:31:47.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:30:12, diff=95.347007s, valid=True
2026-06-04T00:31:47.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:31:47.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:31:47.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:31:47.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100104.347761s, valid=True
2026-06-04T00:31:47.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:31:47.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:31:47.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:31:47.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:31:47.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:31:47.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:31:47.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:31:47.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:31:47.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:31:47.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:31:47.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:31:47.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:31:47.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:31:47.667 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:31:47.873 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:31:48.218 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:31:48.322 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:31:48.322 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:31:48.322 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:31:48.407 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:31:48.407 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:32:18.420 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:32:18.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:32:18.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:32:18.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:32:18.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:32:18.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:32:18.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:32:18.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:32:18.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:32:18.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:32:18.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:32:18.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:32:18.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:32:21.601 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:32:21.606 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:32:21.606 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:32:21.607 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:32:21.616 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:32:21.628 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:32:21.628 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:32:21.628 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:32:21.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:32:21.628 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:32:21.629 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:32:21.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:32:21.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:32:21.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:32:21.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:32:21.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:32:21.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T00:32:21.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:32:21.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T00:32:21.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:32:21.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:32:21.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:32:21.902 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:32:21.973 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:32:02
2026-06-04T00:32:21.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87458, datetime.datetime(2026, 6, 4, 0, 32, 2), datetime.datetime(2026, 6, 4, 0, 32, 1), 'salt', 1.63, 100.21, None, 44.81, 114.24, -0.03, 821.47, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T00:32:21.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:32:21.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:32:21.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:32:01, diff=20.980321s, valid=True
2026-06-04T00:32:21.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:32:21.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T00:32:21.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:30:12, diff=129.983455s, valid=True
2026-06-04T00:32:21.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:32:21.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:32:21.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:31:53, diff=28.991082s, valid=True
2026-06-04T00:32:21.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:32:21.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:32:21.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:32:21.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:32:21.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:32:21.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T00:32:21.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:30:12, diff=129.994458s, valid=True
2026-06-04T00:32:21.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:32:21.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:32:21.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:32:21.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100138.995198s, valid=True
2026-06-04T00:32:21.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:32:21.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:32:21.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:32:21.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:32:21.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:32:22.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:32:22.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:32:22.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:32:22.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:32:22.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:32:22.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:32:22.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:32:22.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:32:22.385 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:32:22.628 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:32:22.971 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:32:23.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:32:23.074 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:32:23.074 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:32:23.271 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:32:23.271 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:32:53.301 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:32:53.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:32:53.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:32:53.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:32:53.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:32:53.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:32:53.831 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:32:53.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:32:53.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:32:53.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:32:53.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:32:53.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:32:53.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:32:56.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:32:56.281 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:32:56.282 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:32:56.282 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:32:56.290 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:32:56.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:32:56.303 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:32:56.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:32:56.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:32:56.304 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:32:56.304 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:32:56.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:32:56.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:32:56.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:32:56.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:32:56.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:32:56.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T00:32:56.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:32:56.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T00:32:56.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:32:56.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:32:56.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:32:56.606 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:32:56.676 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:32:32
2026-06-04T00:32:56.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87459, datetime.datetime(2026, 6, 4, 0, 32, 32), datetime.datetime(2026, 6, 4, 0, 32, 31), 'salt', 1.67, 100.21, None, 53.38, 119.31, -0.03, 821.53, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:32:56.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:32:56.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:32:56.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:32:31, diff=25.683751s, valid=True
2026-06-04T00:32:56.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:32:56.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T00:32:56.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:30:12, diff=164.687094s, valid=True
2026-06-04T00:32:56.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:32:56.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:32:56.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:32:23, diff=33.695063s, valid=True
2026-06-04T00:32:56.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:32:56.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:32:56.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:32:56.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:32:56.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:32:56.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T00:32:56.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:30:12, diff=164.698659s, valid=True
2026-06-04T00:32:56.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:32:56.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:32:56.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:32:56.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100173.699435s, valid=True
2026-06-04T00:32:56.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:32:56.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:32:56.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:32:56.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:32:56.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:32:56.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:32:56.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:32:56.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:32:56.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:32:56.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:32:56.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:32:56.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:32:56.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:32:57.022 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:32:57.229 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:32:57.572 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:32:57.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:32:57.675 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:32:57.675 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:32:57.927 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:32:57.928 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:33:27.957 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:33:27.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:33:27.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:33:28.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:33:28.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:33:28.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:33:28.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:33:28.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:33:28.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:33:28.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:33:28.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:33:28.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:33:28.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:33:31.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:33:31.552 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:33:31.553 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:33:31.554 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:33:31.563 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:33:31.576 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:33:31.576 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:33:31.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:33:31.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:33:31.578 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:33:31.578 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:33:31.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:33:31.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:33:31.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:33:31.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:33:31.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:33:31.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:33:31.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:33:31.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:33:31.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:33:31.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:33:31.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:33:31.893 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:33:31.961 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:33:02
2026-06-04T00:33:31.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87460, datetime.datetime(2026, 6, 4, 0, 33, 2), datetime.datetime(2026, 6, 4, 0, 33, 2), 'salt', 1.67, 100.28, None, 41.39, 121.76, -0.04, 821.35, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T00:33:31.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:33:31.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:33:31.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:33:02, diff=29.969029s, valid=True
2026-06-04T00:33:31.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:33:31.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:33:31.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:30:12, diff=199.972415s, valid=True
2026-06-04T00:33:31.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:33:31.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:33:31.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:32:54, diff=37.98046s, valid=True
2026-06-04T00:33:31.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:33:31.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:33:31.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:33:31.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:33:31.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:33:31.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:33:31.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:30:12, diff=199.984135s, valid=True
2026-06-04T00:33:31.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:33:31.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:33:31.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:33:31.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100208.984947s, valid=True
2026-06-04T00:33:31.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:33:31.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:33:31.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:33:31.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:33:31.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:33:32.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:33:32.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:33:32.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:33:32.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:33:32.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:33:32.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:33:32.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:33:32.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:33:32.305 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:33:32.515 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:33:32.861 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:33:32.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:33:32.965 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:33:32.965 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:33:33.627 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:33:33.627 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:34:03.657 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:34:03.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:34:03.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:34:03.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:34:03.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:34:04.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:34:04.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:34:04.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:34:04.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:34:04.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:34:04.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:34:04.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:34:04.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:34:06.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:34:06.753 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:34:06.754 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:34:06.754 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:34:06.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:34:06.778 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:34:06.778 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:34:06.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:34:06.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:34:06.779 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:34:06.780 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:34:06.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:34:06.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:34:06.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:34:07.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:34:07.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:34:07.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:34:07.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:34:07.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:34:07.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:34:07.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:34:07.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:34:07.109 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:34:07.180 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:34:03
2026-06-04T00:34:07.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87462, datetime.datetime(2026, 6, 4, 0, 34, 3), datetime.datetime(2026, 6, 4, 0, 34, 2), 'salt', 1.63, 100.24, None, 48.8, 118.47, -0.04, 821.54, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:34:07.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:34:07.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:34:07.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:34:02, diff=5.188152s, valid=True
2026-06-04T00:34:07.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:34:07.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:34:07.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:30:12, diff=235.19164s, valid=True
2026-06-04T00:34:07.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:34:07.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:34:07.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:33:54, diff=13.199714s, valid=True
2026-06-04T00:34:07.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:34:07.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:34:07.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:34:07.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:34:07.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:34:07.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:34:07.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:30:12, diff=235.203427s, valid=True
2026-06-04T00:34:07.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:34:07.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:34:07.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:34:07.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100244.204284s, valid=True
2026-06-04T00:34:07.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:34:07.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:34:07.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:34:07.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:34:07.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:34:07.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:34:07.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:34:07.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:34:07.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:34:07.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:34:07.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:34:07.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:34:07.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:34:07.525 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:34:07.793 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:34:08.135 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:34:08.240 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:34:08.240 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:34:08.240 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:34:08.504 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:34:08.505 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:34:38.514 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:34:38.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:34:38.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:34:39.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:34:39.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:34:39.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:34:39.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:34:39.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:34:39.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:34:39.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:34:39.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:34:39.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:34:39.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:34:41.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:34:41.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:34:41.856 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:34:41.856 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:34:41.866 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:34:41.877 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:34:41.877 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:34:41.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:34:41.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:34:41.878 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:34:41.879 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:34:41.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:34:42.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:34:42.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:34:42.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:34:42.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:34:42.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:34:42.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:34:42.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:34:42.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:34:42.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:34:42.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:34:42.243 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:34:42.316 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:34:33
2026-06-04T00:34:42.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87463, datetime.datetime(2026, 6, 4, 0, 34, 33), datetime.datetime(2026, 6, 4, 0, 34, 32), 'salt', 1.7, 100.24, None, 57.55, 116.82, -0.04, 821.41, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:34:42.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:34:42.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:34:42.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:34:32, diff=10.324139s, valid=True
2026-06-04T00:34:42.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:34:42.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:34:42.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:35:12, diff=-29.672227s, valid=True
2026-06-04T00:34:42.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:34:42.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:34:42.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:34:27, diff=15.33633s, valid=True
2026-06-04T00:34:42.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:34:42.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:34:42.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:34:42.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:34:42.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:34:42.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:34:42.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:35:12, diff=-29.659767s, valid=True
2026-06-04T00:34:42.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:34:42.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:34:42.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:34:42.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100279.341092s, valid=True
2026-06-04T00:34:42.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:34:42.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:34:42.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:34:42.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:34:42.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:34:42.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:34:42.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:34:42.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:34:42.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:34:42.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:34:42.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:34:42.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:34:42.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:34:42.663 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:34:42.869 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:34:43.209 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:34:43.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:34:43.311 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:34:43.311 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:34:43.498 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:34:43.499 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:35:13.529 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:35:13.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:35:13.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:35:13.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:35:13.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:35:13.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:35:13.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:35:13.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:35:13.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:35:13.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:35:13.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:35:13.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:35:13.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:35:16.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:35:16.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:35:16.447 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:35:16.447 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:35:16.457 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:35:16.470 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:35:16.470 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:35:16.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:35:16.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:35:16.471 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:35:16.471 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:35:16.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:35:16.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:35:16.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:35:16.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:35:16.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:35:16.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:35:16.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:35:16.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:35:16.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:35:16.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:35:16.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:35:16.805 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:35:16.877 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:35:04
2026-06-04T00:35:16.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87464, datetime.datetime(2026, 6, 4, 0, 35, 4), datetime.datetime(2026, 6, 4, 0, 35, 3), 'salt', 1.63, 100.24, None, 61.25, 121.62, -0.04, 821.23, 'DRY', 0, None, 0, 2, 2, 2)]
2026-06-04T00:35:16.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:35:16.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:35:16.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:35:03, diff=13.884796s, valid=True
2026-06-04T00:35:16.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:35:16.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:35:16.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:35:12, diff=4.888281s, valid=True
2026-06-04T00:35:16.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:35:16.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:35:16.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:34:55, diff=21.896465s, valid=True
2026-06-04T00:35:16.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:35:16.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:35:16.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:35:16.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:35:16.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:35:16.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:35:16.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:35:12, diff=4.900218s, valid=True
2026-06-04T00:35:16.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:35:16.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:35:16.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:35:16.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100313.901035s, valid=True
2026-06-04T00:35:16.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:35:16.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:35:16.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:35:16.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:35:16.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:35:16.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:35:16.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:35:16.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:35:16.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:35:17.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:35:17.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:35:17.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:35:17.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:35:17.302 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:35:17.506 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:35:17.847 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:35:17.948 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:35:17.948 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:35:17.948 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:35:18.208 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:35:18.208 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:35:48.236 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:35:48.236 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:35:48.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:35:48.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:35:48.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:35:48.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:35:48.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:35:48.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:35:48.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:35:48.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:35:48.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:35:48.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:35:48.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:35:51.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:35:51.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:35:51.377 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:35:51.377 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:35:51.386 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:35:51.398 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:35:51.398 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:35:51.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:35:51.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:35:51.399 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:35:51.399 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:35:51.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:35:51.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:35:51.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:35:51.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:35:51.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:35:51.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:35:51.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:35:51.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:35:51.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:35:51.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:35:51.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:35:51.679 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:35:51.753 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:35:34
2026-06-04T00:35:51.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87465, datetime.datetime(2026, 6, 4, 0, 35, 34), datetime.datetime(2026, 6, 4, 0, 35, 33), 'salt', 1.6, 100.14, None, 54.19, 119.45, -0.02, 821.66, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:35:51.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:35:51.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:35:51.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:35:33, diff=18.760776s, valid=True
2026-06-04T00:35:51.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:35:51.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:35:51.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:36:12, diff=-20.235963s, valid=True
2026-06-04T00:35:51.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:35:51.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:35:51.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:35:25, diff=26.771609s, valid=True
2026-06-04T00:35:51.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:35:51.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:35:51.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:35:51.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:35:51.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:35:51.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:35:51.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:36:12, diff=-20.224938s, valid=True
2026-06-04T00:35:51.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:35:51.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:35:51.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:35:51.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100348.775841s, valid=True
2026-06-04T00:35:51.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:35:51.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:35:51.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:35:51.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:35:51.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:35:51.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:35:51.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:35:51.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:35:51.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:35:51.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:35:51.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:35:52.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:35:52.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:35:52.094 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:35:52.298 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:35:52.638 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:35:52.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:35:52.742 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:35:52.742 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:35:52.990 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:35:52.990 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:36:23.020 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:36:23.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:36:23.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:36:23.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:36:23.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:36:23.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:36:23.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:36:23.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:36:23.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:36:23.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:36:23.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:36:23.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:36:23.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:36:25.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:36:25.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:36:25.778 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:36:25.778 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:36:25.788 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:36:25.801 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:36:25.801 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:36:25.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:36:25.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:36:25.802 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:36:25.802 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:36:25.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:36:25.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:36:25.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:36:26.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:36:26.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:36:26.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:36:26.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:36:26.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:36:26.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:36:26.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:36:26.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:36:26.133 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:36:26.205 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:36:04
2026-06-04T00:36:26.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87466, datetime.datetime(2026, 6, 4, 0, 36, 4), datetime.datetime(2026, 6, 4, 0, 36, 3), 'salt', 1.5, 100.14, None, 53.28, 120.51, -0.02, 821.35, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:36:26.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:36:26.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:36:26.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:36:03, diff=23.213184s, valid=True
2026-06-04T00:36:26.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:36:26.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:36:26.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:36:12, diff=14.216665s, valid=True
2026-06-04T00:36:26.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:36:26.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:36:26.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:35:58, diff=28.224831s, valid=True
2026-06-04T00:36:26.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:36:26.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:36:26.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:36:26.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:36:26.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:36:26.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:36:26.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:36:12, diff=14.228566s, valid=True
2026-06-04T00:36:26.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:36:26.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:36:26.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:36:26.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100383.229385s, valid=True
2026-06-04T00:36:26.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:36:26.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:36:26.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:36:26.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:36:26.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:36:26.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:36:26.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:36:26.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:36:26.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:36:26.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:36:26.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:36:26.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:36:26.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:36:26.619 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:36:26.824 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:36:27.167 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:36:27.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:36:27.269 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:36:27.269 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:36:27.419 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:36:27.419 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:36:57.420 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:36:57.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:36:57.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:36:57.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:36:57.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:36:58.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:36:58.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:36:58.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:36:58.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:36:58.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:36:58.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:36:58.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:36:58.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:37:00.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:37:00.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:37:00.671 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:37:00.671 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:37:00.682 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:37:00.694 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:37:00.695 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:37:00.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:37:00.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:37:00.696 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:37:00.696 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:37:00.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:37:00.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:37:00.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:37:00.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:37:00.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:37:00.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:37:00.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:37:01.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:37:01.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:37:01.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:37:01.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:37:01.041 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:37:01.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:36:35
2026-06-04T00:37:01.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87467, datetime.datetime(2026, 6, 4, 0, 36, 35), datetime.datetime(2026, 6, 4, 0, 36, 34), 'salt', 1.63, 100.24, None, 53.28, 119.22, -0.04, 821.35, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:37:01.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:37:01.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:37:01.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:36:34, diff=27.123005s, valid=True
2026-06-04T00:37:01.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:37:01.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:37:01.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:37:12, diff=-10.87407s, valid=True
2026-06-04T00:37:01.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:37:01.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:37:01.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:36:25, diff=36.132748s, valid=True
2026-06-04T00:37:01.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:37:01.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:37:01.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:37:01.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:37:01.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:37:01.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:37:01.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:37:12, diff=-10.864175s, valid=True
2026-06-04T00:37:01.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:37:01.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:37:01.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:37:01.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100418.13648s, valid=True
2026-06-04T00:37:01.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:37:01.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:37:01.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:37:01.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:37:01.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:37:01.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:37:01.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:37:01.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:37:01.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:37:01.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:37:01.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:37:01.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:37:01.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:37:01.450 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:37:01.656 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:37:02.000 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:37:02.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:37:02.103 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:37:02.103 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:37:02.190 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:37:02.190 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:37:32.193 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:37:32.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:37:32.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:37:32.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:37:32.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:37:32.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:37:32.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:37:32.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:37:32.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:37:32.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:37:32.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:37:32.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:37:32.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:37:35.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:37:35.211 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:37:35.212 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:37:35.212 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:37:35.222 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:37:35.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:37:35.236 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:37:35.236 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:37:35.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:37:35.237 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:37:35.237 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:37:35.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:37:35.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-04T00:37:35.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:37:35.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-04T00:37:35.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:37:35.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:37:35.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:37:35.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:37:35.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:37:35.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:37:35.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:37:35.589 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:37:35.659 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:37:05
2026-06-04T00:37:35.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87468, datetime.datetime(2026, 6, 4, 0, 37, 5), datetime.datetime(2026, 6, 4, 0, 37, 4), 'salt', 1.6, 100.21, None, 49.75, 121.99, -0.03, 821.47, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:37:35.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:37:35.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-04T00:37:35.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:37:04, diff=31.666608s, valid=True
2026-06-04T00:37:35.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:37:35.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:37:35.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:37:12, diff=23.670131s, valid=True
2026-06-04T00:37:35.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:37:35.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-04T00:37:35.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:36:56, diff=39.678129s, valid=True
2026-06-04T00:37:35.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:37:35.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:37:35.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:37:35.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:37:35.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:37:35.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:37:35.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:37:12, diff=23.681774s, valid=True
2026-06-04T00:37:35.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:37:35.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:37:35.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:37:35.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100452.682563s, valid=True
2026-06-04T00:37:35.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:37:35.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:37:35.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:37:35.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:37:35.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:37:35.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:37:35.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:37:35.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:37:35.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:37:35.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:37:35.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:37:35.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:37:36.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:37:36.069 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:37:36.267 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:37:36.600 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:37:36.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:37:36.698 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:37:36.699 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:37:36.891 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:37:36.891 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:38:06.921 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:38:06.921 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:38:06.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:38:07.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:38:07.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:38:07.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:38:07.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:38:07.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:38:07.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:38:07.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:38:07.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:38:07.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:38:07.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:38:09.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:38:09.969 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:38:09.970 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:38:09.970 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:38:09.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:38:09.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:38:09.991 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:38:09.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:38:09.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:38:09.992 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:38:09.992 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:38:09.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:38:10.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:38:10.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:38:10.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:38:10.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:38:10.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:38:10.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:38:10.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:38:10.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:38:10.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:38:10.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:38:10.306 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:38:10.401 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:38:06
2026-06-04T00:38:10.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87470, datetime.datetime(2026, 6, 4, 0, 38, 6), datetime.datetime(2026, 6, 4, 0, 38, 5), 'salt', 1.6, 100.21, None, 47.74, 118.47, -0.03, 821.29, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:38:10.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:38:10.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:38:10.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:38:05, diff=5.409139s, valid=True
2026-06-04T00:38:10.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:38:10.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:38:10.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:38:12, diff=-1.587391s, valid=True
2026-06-04T00:38:10.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:38:10.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:38:10.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:37:56, diff=14.420724s, valid=True
2026-06-04T00:38:10.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:38:10.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:38:10.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:38:10.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:38:10.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:38:10.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:38:10.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:38:12, diff=-1.575554s, valid=True
2026-06-04T00:38:10.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:38:10.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:38:10.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:38:10.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100487.425325s, valid=True
2026-06-04T00:38:10.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:38:10.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:38:10.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:38:10.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:38:10.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:38:10.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:38:10.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:38:10.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:38:10.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:38:10.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:38:10.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:38:10.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:38:10.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:38:10.794 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:38:10.997 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:38:11.333 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:38:11.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:38:11.438 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:38:11.438 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:38:11.521 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:38:11.521 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:38:41.532 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:38:41.532 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:38:41.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:38:41.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:38:41.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:38:42.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:38:42.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:38:42.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:38:42.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:38:42.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:38:42.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:38:42.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:38:42.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:38:44.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:38:44.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:38:44.583 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:38:44.583 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:38:44.593 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:38:44.606 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:38:44.607 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:38:44.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:38:44.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:38:44.608 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:38:44.608 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:38:44.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:38:44.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:38:44.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:38:44.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:38:44.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:38:44.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:38:44.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:38:44.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:38:44.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:38:44.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:38:44.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:38:44.941 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:38:45.016 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:38:36
2026-06-04T00:38:45.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87471, datetime.datetime(2026, 6, 4, 0, 38, 36), datetime.datetime(2026, 6, 4, 0, 38, 35), 'salt', 1.7, 100.34, None, 52.82, 129.53, -0.05, 821.41, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:38:45.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:38:45.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:38:45.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:38:35, diff=10.02347s, valid=True
2026-06-04T00:38:45.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:38:45.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:38:45.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:39:12, diff=-26.973112s, valid=True
2026-06-04T00:38:45.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:38:45.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:38:45.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:38:26, diff=19.034723s, valid=True
2026-06-04T00:38:45.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:38:45.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:38:45.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:38:45.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:38:45.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:38:45.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:38:45.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:39:12, diff=-26.961715s, valid=True
2026-06-04T00:38:45.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:38:45.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:38:45.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:38:45.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100522.039061s, valid=True
2026-06-04T00:38:45.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:38:45.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:38:45.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:38:45.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:38:45.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:38:45.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:38:45.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:38:45.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:38:45.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:38:45.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:38:45.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:38:45.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:38:45.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:38:45.359 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:38:45.555 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:38:45.888 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:38:45.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:38:45.990 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:38:45.990 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:38:46.237 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:38:46.237 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:39:16.241 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:39:16.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:39:16.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:39:16.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:39:16.698 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:39:16.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:39:16.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:39:16.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:39:16.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:39:16.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:39:16.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:39:16.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:39:16.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:39:19.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:39:19.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:39:19.386 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:39:19.386 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:39:19.398 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:39:19.411 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:39:19.411 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:39:19.412 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:39:19.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:39:19.412 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:39:19.413 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:39:19.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:39:19.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:39:19.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:39:19.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:39:19.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:39:19.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:39:19.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:39:19.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:39:19.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:39:19.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:39:19.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:39:19.742 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:39:19.815 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:39:06
2026-06-04T00:39:19.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87472, datetime.datetime(2026, 6, 4, 0, 39, 6), datetime.datetime(2026, 6, 4, 0, 39, 6), 'salt', 1.67, 100.21, None, 51.9, 118.73, -0.03, 821.53, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:39:19.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:39:19.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:39:19.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:39:06, diff=13.823032s, valid=True
2026-06-04T00:39:19.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:39:19.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:39:19.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:39:12, diff=7.826415s, valid=True
2026-06-04T00:39:19.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:39:19.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:39:19.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:39:00, diff=19.833393s, valid=True
2026-06-04T00:39:19.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:39:19.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:39:19.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:39:19.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:39:19.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:39:19.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:39:19.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:39:12, diff=7.836686s, valid=True
2026-06-04T00:39:19.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:39:19.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:39:19.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:39:19.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100556.837374s, valid=True
2026-06-04T00:39:19.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:39:19.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:39:19.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:39:19.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:39:19.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:39:19.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:39:19.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:39:19.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:39:19.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:39:19.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:39:20.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:39:20.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:39:20.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:39:20.169 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:39:20.367 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:39:20.761 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:39:20.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:39:20.861 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:39:20.861 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:39:21.079 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:39:21.079 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:39:51.096 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:39:51.097 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:39:51.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:39:51.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:39:51.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:39:51.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:39:51.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:39:51.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:39:51.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:39:51.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:39:51.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:39:51.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:39:51.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:39:53.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:39:53.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:39:53.969 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:39:53.969 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:39:53.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:39:53.992 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:39:53.993 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:39:53.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:39:53.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:39:53.994 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:39:53.994 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:39:53.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:39:54.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:39:54.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:39:54.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:39:54.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:39:54.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:39:54.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:39:54.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:39:54.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:39:54.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:39:54.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:39:54.291 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:39:54.370 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:39:37
2026-06-04T00:39:54.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87473, datetime.datetime(2026, 6, 4, 0, 39, 37), datetime.datetime(2026, 6, 4, 0, 39, 36), 'salt', 1.6, 100.21, None, 47.56, 119.24, -0.03, 821.41, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:39:54.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:39:54.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:39:54.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:39:36, diff=18.377344s, valid=True
2026-06-04T00:39:54.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:39:54.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:39:54.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:40:12, diff=-17.619392s, valid=True
2026-06-04T00:39:54.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:39:54.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:39:54.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:39:27, diff=27.388378s, valid=True
2026-06-04T00:39:54.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:39:54.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:39:54.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:39:54.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:39:54.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:39:54.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:39:54.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:40:12, diff=-17.608089s, valid=True
2026-06-04T00:39:54.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:39:54.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:39:54.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:39:54.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100591.392684s, valid=True
2026-06-04T00:39:54.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:39:54.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:39:54.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:39:54.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:39:54.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:39:54.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:39:54.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:39:54.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:39:54.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:39:54.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:39:54.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:39:54.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:39:54.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:39:54.713 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:39:54.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:39:55.245 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:39:55.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:39:55.345 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:39:55.346 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:39:55.578 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:39:55.579 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:40:25.607 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:40:25.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:40:25.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:40:26.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:40:26.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:40:26.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:40:26.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:40:26.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:40:26.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:40:26.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:40:26.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:40:26.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:40:26.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:40:29.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:40:29.013 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:40:29.014 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:40:29.014 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:40:29.026 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:40:29.038 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:40:29.039 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:40:29.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:40:29.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:40:29.040 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:40:29.040 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:40:29.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:40:29.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:40:29.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:40:29.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:40:29.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:40:29.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:40:29.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:40:29.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:40:29.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:40:29.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:40:29.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:40:29.382 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:40:29.457 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:40:07
2026-06-04T00:40:29.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87474, datetime.datetime(2026, 6, 4, 0, 40, 7), datetime.datetime(2026, 6, 4, 0, 40, 6), 'salt', 1.6, 100.21, None, 62.03, 119.92, -0.03, 821.05, 'DRY', 0, None, 0, 2, 2, 2)]
2026-06-04T00:40:29.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:40:29.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:40:29.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:40:06, diff=23.465104s, valid=True
2026-06-04T00:40:29.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:40:29.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:40:29.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:40:12, diff=17.468699s, valid=True
2026-06-04T00:40:29.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:40:29.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:40:29.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:39:57, diff=32.47682s, valid=True
2026-06-04T00:40:29.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:40:29.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:40:29.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:40:29.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:40:29.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:40:29.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:40:29.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:40:12, diff=17.480584s, valid=True
2026-06-04T00:40:29.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:40:29.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:40:29.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:40:29.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100626.481399s, valid=True
2026-06-04T00:40:29.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:40:29.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:40:29.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:40:29.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:40:29.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:40:29.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:40:29.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:40:29.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:40:29.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:40:29.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:40:29.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:40:29.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:40:29.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:40:29.801 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:40:30.098 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:40:30.432 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:40:30.532 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:40:30.532 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:40:30.532 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:40:30.787 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:40:30.787 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:41:00.817 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:41:00.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:41:00.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:41:01.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:41:01.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:41:01.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:41:01.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:41:01.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:41:01.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:41:01.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:41:01.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:41:01.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:41:01.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:41:03.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:41:03.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:41:03.744 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:41:03.744 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:41:03.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:41:03.768 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:41:03.768 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:41:03.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:41:03.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:41:03.769 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:41:03.770 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:41:03.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:41:03.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:41:03.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:41:04.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:41:04.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:41:04.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:41:04.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:41:04.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:41:04.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:41:04.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:41:04.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:41:04.118 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:41:04.192 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:40:37
2026-06-04T00:41:04.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87475, datetime.datetime(2026, 6, 4, 0, 40, 37), datetime.datetime(2026, 6, 4, 0, 40, 36), 'salt', 1.6, 100.21, None, 42.69, 130.5, -0.03, 821.41, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T00:41:04.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:41:04.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:41:04.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:40:36, diff=28.199907s, valid=True
2026-06-04T00:41:04.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:41:04.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:41:04.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:41:12, diff=-7.796157s, valid=True
2026-06-04T00:41:04.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:41:04.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:41:04.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:40:27, diff=37.212352s, valid=True
2026-06-04T00:41:04.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:41:04.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:41:04.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:41:04.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:41:04.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:41:04.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:41:04.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:41:12, diff=-7.783811s, valid=True
2026-06-04T00:41:04.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:41:04.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:41:04.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:41:04.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100661.217017s, valid=True
2026-06-04T00:41:04.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:41:04.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:41:04.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:41:04.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:41:04.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:41:04.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:41:04.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:41:04.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:41:04.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:41:04.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:41:04.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:41:04.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:41:04.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:41:04.539 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:41:04.758 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:41:05.094 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:41:05.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:41:05.195 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:41:05.195 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:41:05.348 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:41:05.348 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:41:35.350 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:41:35.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:41:35.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:41:35.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:41:35.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:41:36.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:41:36.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:41:36.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:41:36.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:41:36.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:41:36.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:41:36.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:41:36.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:41:38.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:41:38.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:41:38.939 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:41:38.939 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:41:38.951 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:41:38.973 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:41:38.973 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:41:38.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:41:38.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:41:38.974 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:41:38.975 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:41:38.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:41:39.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:41:39.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:41:39.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:41:39.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:41:39.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:41:39.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:41:39.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:41:39.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:41:39.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:41:39.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:41:39.324 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:41:39.397 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:41:37
2026-06-04T00:41:39.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87477, datetime.datetime(2026, 6, 4, 0, 41, 37), datetime.datetime(2026, 6, 4, 0, 41, 37), 'salt', 1.53, 100.24, None, 47.7, 114.85, -0.04, 821.29, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:41:39.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:41:39.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:41:39.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:41:37, diff=2.405075s, valid=True
2026-06-04T00:41:39.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:41:39.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:41:39.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:42:12, diff=-32.591276s, valid=True
2026-06-04T00:41:39.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:41:39.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:41:39.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:41:28, diff=11.416966s, valid=True
2026-06-04T00:41:39.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:41:39.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:41:39.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:41:39.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:41:39.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:41:39.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:41:39.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:42:12, diff=-32.579314s, valid=True
2026-06-04T00:41:39.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:41:39.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:41:39.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:41:39.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100696.421489s, valid=True
2026-06-04T00:41:39.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:41:39.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:41:39.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:41:39.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:41:39.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:41:39.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:41:39.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:41:39.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:41:39.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:41:39.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:41:39.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:41:39.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:41:39.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:41:39.812 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:41:40.034 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:41:40.376 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:41:40.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:41:40.477 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:41:40.477 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:41:40.625 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:41:40.625 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:42:10.629 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:42:10.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:42:10.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:42:10.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:42:10.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:42:11.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:42:11.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:42:11.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:42:11.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:42:11.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:42:11.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:42:11.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:42:11.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:42:13.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:42:13.476 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:42:13.477 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:42:13.477 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:42:13.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:42:13.501 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:42:13.501 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:42:13.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:42:13.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:42:13.502 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:42:13.503 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:42:13.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:42:13.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:42:13.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:42:13.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:42:13.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:42:13.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:42:13.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:42:13.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:42:13.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:42:13.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:42:13.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:42:13.848 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:42:13.927 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:42:08
2026-06-04T00:42:13.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87478, datetime.datetime(2026, 6, 4, 0, 42, 8), datetime.datetime(2026, 6, 4, 0, 42, 7), 'salt', 1.67, 100.28, None, 53.95, 126.55, -0.04, 821.41, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:42:13.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:42:13.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:42:13.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:42:07, diff=6.934877s, valid=True
2026-06-04T00:42:13.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:42:13.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:42:13.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:42:12, diff=1.938462s, valid=True
2026-06-04T00:42:13.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:42:13.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:42:13.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:41:58, diff=15.947025s, valid=True
2026-06-04T00:42:13.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:42:13.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:42:13.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:42:13.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:42:13.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:42:13.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:42:13.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:42:12, diff=1.95089s, valid=True
2026-06-04T00:42:13.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:42:13.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:42:13.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:42:13.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100730.951727s, valid=True
2026-06-04T00:42:13.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:42:13.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:42:13.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:42:13.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:42:13.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:42:14.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:42:14.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:42:14.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:42:14.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:42:14.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:42:14.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:42:14.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:42:14.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:42:14.273 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:42:14.480 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:42:14.813 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:42:14.913 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:42:14.913 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:42:14.913 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:42:15.067 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:42:15.067 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:42:45.093 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:42:45.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:42:45.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:42:45.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:42:45.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:42:45.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:42:45.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:42:45.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:42:45.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:42:45.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:42:45.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:42:45.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:42:45.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:42:48.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:42:48.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:42:48.313 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:42:48.313 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:42:48.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:42:48.336 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:42:48.337 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:42:48.337 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:42:48.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:42:48.338 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:42:48.338 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:42:48.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:42:48.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:42:48.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:42:48.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:42:48.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:42:48.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:42:48.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:42:48.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:42:48.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:42:48.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:42:48.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:42:48.688 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:42:48.760 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:42:38
2026-06-04T00:42:48.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87479, datetime.datetime(2026, 6, 4, 0, 42, 38), datetime.datetime(2026, 6, 4, 0, 42, 37), 'salt', 1.57, 100.28, None, 43.47, 108.53, -0.04, 821.29, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T00:42:48.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:42:48.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:42:48.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:42:37, diff=11.767902s, valid=True
2026-06-04T00:42:48.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:42:48.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:42:48.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:43:12, diff=-23.228751s, valid=True
2026-06-04T00:42:48.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:42:48.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:42:48.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:42:28, diff=20.779159s, valid=True
2026-06-04T00:42:48.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:42:48.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:42:48.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:42:48.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:42:48.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:42:48.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:42:48.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:43:12, diff=-23.217247s, valid=True
2026-06-04T00:42:48.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:42:48.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:42:48.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:42:48.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100765.783526s, valid=True
2026-06-04T00:42:48.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:42:48.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:42:48.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:42:48.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:42:48.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:42:48.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:42:48.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:42:48.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:42:48.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:42:48.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:42:49.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:42:49.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:42:49.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:42:49.169 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:42:49.366 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:42:49.702 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:42:49.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:42:49.803 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:42:49.803 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:42:50.051 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:42:50.051 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:43:20.080 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:43:20.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:43:20.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:43:20.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:43:20.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:43:20.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:43:20.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:43:20.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:43:20.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:43:20.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:43:20.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:43:20.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:43:20.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:43:23.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:43:23.079 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:43:23.080 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:43:23.080 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:43:23.090 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:43:23.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:43:23.104 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:43:23.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:43:23.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:43:23.105 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:43:23.105 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:43:23.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:43:23.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:43:23.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:43:23.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:43:23.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:43:23.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:43:23.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:43:23.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:43:23.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:43:23.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:43:23.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:43:23.447 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:43:23.519 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:43:08
2026-06-04T00:43:23.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87480, datetime.datetime(2026, 6, 4, 0, 43, 8), datetime.datetime(2026, 6, 4, 0, 43, 8), 'salt', 1.57, 100.18, None, 56.87, 126.97, -0.02, 821.41, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:43:23.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:43:23.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:43:23.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:43:08, diff=15.527117s, valid=True
2026-06-04T00:43:23.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:43:23.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:43:23.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:43:12, diff=11.530582s, valid=True
2026-06-04T00:43:23.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:43:23.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:43:23.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:42:58, diff=25.538853s, valid=True
2026-06-04T00:43:23.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:43:23.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:43:23.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:43:23.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:43:23.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:43:23.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:43:23.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:43:12, diff=11.542527s, valid=True
2026-06-04T00:43:23.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:43:23.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:43:23.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:43:23.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100800.54334s, valid=True
2026-06-04T00:43:23.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:43:23.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:43:23.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:43:23.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:43:23.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:43:23.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:43:23.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:43:23.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:43:23.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:43:23.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:43:23.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:43:23.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:43:23.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:43:23.863 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:43:24.066 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:43:24.405 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:43:24.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:43:24.511 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:43:24.511 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:43:24.765 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:43:24.765 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:43:54.785 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:43:54.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:43:54.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:43:55.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:43:55.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:43:55.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:43:55.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:43:55.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:43:55.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:43:55.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:43:55.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:43:55.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:43:55.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:43:58.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:43:58.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:43:58.017 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:43:58.017 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:43:58.029 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:43:58.041 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:43:58.042 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:43:58.042 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:43:58.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:43:58.043 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:43:58.043 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:43:58.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:43:58.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:43:58.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:43:58.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:43:58.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:43:58.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:43:58.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:43:58.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:43:58.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:43:58.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:43:58.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:43:58.375 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:43:58.448 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:43:40
2026-06-04T00:43:58.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87481, datetime.datetime(2026, 6, 4, 0, 43, 40), datetime.datetime(2026, 6, 4, 0, 43, 38), 'salt', 1.63, 100.31, None, 52.61, 129.95, -0.05, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:43:58.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:43:58.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:43:58.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:43:38, diff=20.455887s, valid=True
2026-06-04T00:43:58.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:43:58.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:43:58.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:44:12, diff=-13.540597s, valid=True
2026-06-04T00:43:58.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:43:58.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:43:58.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:43:34, diff=24.467755s, valid=True
2026-06-04T00:43:58.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:43:58.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:43:58.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:43:58.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:43:58.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:43:58.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:43:58.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:44:12, diff=-13.528521s, valid=True
2026-06-04T00:43:58.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:43:58.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:43:58.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:43:58.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100835.472375s, valid=True
2026-06-04T00:43:58.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:43:58.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:43:58.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:43:58.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:43:58.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:43:58.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:43:58.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:43:58.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:43:58.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:43:58.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:43:58.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:43:58.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:43:58.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:43:58.858 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:43:59.060 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:43:59.390 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:43:59.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:43:59.488 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:43:59.488 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:44:00.365 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:44:00.365 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:44:30.396 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:44:30.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:44:30.396 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:44:30.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:44:30.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:44:30.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:44:30.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:44:30.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:44:30.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:44:30.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:44:30.993 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:44:31.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:44:31.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:44:33.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:44:33.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:44:33.407 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:44:33.408 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:44:33.418 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:44:33.431 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:44:33.431 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:44:33.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:44:33.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:44:33.432 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:44:33.433 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:44:33.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:44:33.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:44:33.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:44:33.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:44:33.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:44:33.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:44:33.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:44:33.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:44:33.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:44:33.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:44:33.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:44:33.762 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:44:33.837 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:44:10
2026-06-04T00:44:33.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87482, datetime.datetime(2026, 6, 4, 0, 44, 10), datetime.datetime(2026, 6, 4, 0, 44, 9), 'salt', 1.57, 100.21, None, 50.14, 113.63, -0.03, 821.35, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:44:33.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:44:33.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:44:33.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:44:09, diff=24.844135s, valid=True
2026-06-04T00:44:33.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:44:33.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:44:33.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:44:12, diff=21.847352s, valid=True
2026-06-04T00:44:33.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:44:33.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:44:33.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:44:09, diff=24.855062s, valid=True
2026-06-04T00:44:33.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:44:33.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:44:33.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:44:33.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:44:33.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:44:33.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:44:33.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:44:12, diff=21.858553s, valid=True
2026-06-04T00:44:33.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:44:33.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:44:33.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:44:33.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100870.859312s, valid=True
2026-06-04T00:44:33.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:44:33.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:44:33.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:44:33.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:44:33.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:44:33.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:44:33.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:44:33.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:44:33.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:44:33.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:44:34.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:44:34.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:44:34.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:44:34.175 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:44:34.371 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:44:34.708 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:44:34.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:44:34.809 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:44:34.809 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:44:34.901 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:44:34.901 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:45:04.910 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:45:04.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:45:04.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:45:05.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:45:05.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:45:05.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:45:05.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:45:05.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:45:05.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:45:05.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:45:05.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:45:05.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:45:05.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:45:07.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:45:07.731 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:45:07.732 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:45:07.732 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:45:07.744 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:45:07.757 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:45:07.757 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:45:07.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:45:07.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:45:07.759 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:45:07.759 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:45:07.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:45:07.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:45:07.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:45:07.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:45:07.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:45:08.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:45:08.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:45:08.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:45:08.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:45:08.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:45:08.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:45:08.086 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:45:08.156 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:44:40
2026-06-04T00:45:08.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87483, datetime.datetime(2026, 6, 4, 0, 44, 40), datetime.datetime(2026, 6, 4, 0, 44, 40), 'salt', 1.6, 100.28, None, 52.04, 111.05, -0.04, 821.11, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:45:08.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:45:08.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:45:08.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:44:40, diff=28.164404s, valid=True
2026-06-04T00:45:08.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:45:08.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:45:08.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:45:12, diff=-3.83206s, valid=True
2026-06-04T00:45:08.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:45:08.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:45:08.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:44:40, diff=28.176156s, valid=True
2026-06-04T00:45:08.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:45:08.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:45:08.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:45:08.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:45:08.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:45:08.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:45:08.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:45:12, diff=-3.82009s, valid=True
2026-06-04T00:45:08.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:45:08.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:45:08.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:45:08.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100905.18076s, valid=True
2026-06-04T00:45:08.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:45:08.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:45:08.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:45:08.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:45:08.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:45:08.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:45:08.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:45:08.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:45:08.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:45:08.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:45:08.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:45:08.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:45:08.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:45:08.502 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:45:08.722 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:45:09.058 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:45:09.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:45:09.159 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:45:09.159 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:45:09.362 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:45:09.362 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:45:39.392 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:45:39.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:45:39.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:45:39.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:45:39.698 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:45:39.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:45:39.940 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:45:39.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:45:39.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:45:39.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:45:39.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:45:39.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:45:39.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:45:42.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:45:42.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:45:42.697 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:45:42.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:45:42.708 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:45:42.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:45:42.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:45:42.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:45:42.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:45:42.722 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:45:42.722 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:45:42.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:45:42.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:45:42.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:45:42.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:45:42.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:45:43.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:45:43.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:45:43.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:45:43.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:45:43.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:45:43.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:45:43.070 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:45:43.141 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:45:41
2026-06-04T00:45:43.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87485, datetime.datetime(2026, 6, 4, 0, 45, 41), datetime.datetime(2026, 6, 4, 0, 45, 40), 'salt', 1.63, 100.24, None, 47.91, 99.72, -0.04, 821.29, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:45:43.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:45:43.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:45:43.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:45:40, diff=3.148574s, valid=True
2026-06-04T00:45:43.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:45:43.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:45:43.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:46:12, diff=-28.847907s, valid=True
2026-06-04T00:45:43.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:45:43.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:45:43.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:45:31, diff=12.160199s, valid=True
2026-06-04T00:45:43.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:45:43.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:45:43.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:45:43.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:45:43.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:45:43.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:45:43.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:46:12, diff=-28.836084s, valid=True
2026-06-04T00:45:43.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:45:43.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:45:43.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:45:43.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100940.164729s, valid=True
2026-06-04T00:45:43.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:45:43.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:45:43.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:45:43.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:45:43.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:45:43.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:45:43.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:45:43.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:45:43.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:45:43.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:45:43.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:45:43.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:45:43.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:45:43.486 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:45:43.682 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:45:44.073 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:45:44.172 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:45:44.172 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:45:44.172 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:45:44.331 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:45:44.332 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:46:14.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:46:14.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:46:14.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:46:14.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:46:14.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:46:14.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:46:14.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:46:14.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:46:14.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:46:14.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:46:14.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:46:14.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:46:14.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:46:17.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:46:17.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:46:17.203 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:46:17.203 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:46:17.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:46:17.226 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:46:17.227 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:46:17.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:46:17.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:46:17.228 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:46:17.228 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:46:17.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:46:17.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:46:17.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:46:17.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:46:17.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:46:17.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:46:17.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:46:17.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:46:17.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:46:17.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:46:17.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:46:17.566 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:46:17.636 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:46:11
2026-06-04T00:46:17.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87486, datetime.datetime(2026, 6, 4, 0, 46, 11), datetime.datetime(2026, 6, 4, 0, 46, 10), 'salt', 1.57, 100.24, None, 53.1, 113.7, -0.03, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:46:17.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:46:17.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:46:17.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:46:10, diff=7.643554s, valid=True
2026-06-04T00:46:17.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:46:17.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:46:17.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:46:12, diff=5.64707s, valid=True
2026-06-04T00:46:17.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:46:17.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:46:17.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:46:01, diff=16.655248s, valid=True
2026-06-04T00:46:17.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:46:17.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:46:17.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:46:17.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:46:17.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:46:17.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:46:17.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:46:12, diff=5.658951s, valid=True
2026-06-04T00:46:17.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:46:17.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:46:17.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:46:17.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=100974.659769s, valid=True
2026-06-04T00:46:17.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:46:17.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:46:17.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:46:17.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:46:17.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:46:17.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:46:17.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:46:17.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:46:17.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:46:17.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:46:17.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:46:17.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:46:17.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:46:17.984 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:46:18.184 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:46:18.521 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:46:18.623 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:46:18.623 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:46:18.623 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:46:18.712 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:46:18.712 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:46:48.732 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:46:48.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:46:48.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:46:49.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:46:49.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:46:49.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:46:49.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:46:49.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:46:49.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:46:49.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:46:49.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:46:49.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:46:49.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:46:51.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:46:51.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:46:51.959 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:46:51.959 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:46:51.969 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:46:51.981 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:46:51.982 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:46:51.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:46:51.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:46:51.983 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:46:51.983 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:46:51.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:46:52.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:46:52.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:46:52.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:46:52.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:46:52.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:46:52.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:46:52.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:46:52.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:46:52.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:46:52.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:46:52.324 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:46:52.399 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:46:41
2026-06-04T00:46:52.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87487, datetime.datetime(2026, 6, 4, 0, 46, 41), datetime.datetime(2026, 6, 4, 0, 46, 41), 'salt', 1.6, 100.28, None, 52.82, 118.47, -0.04, 821.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:46:52.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:46:52.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:46:52.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:46:41, diff=11.406634s, valid=True
2026-06-04T00:46:52.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:46:52.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:46:52.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:47:12, diff=-19.589877s, valid=True
2026-06-04T00:46:52.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:46:52.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:46:52.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:46:31, diff=21.41884s, valid=True
2026-06-04T00:46:52.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:46:52.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:46:52.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:46:52.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:46:52.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:46:52.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:46:52.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:47:12, diff=-19.577356s, valid=True
2026-06-04T00:46:52.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:46:52.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:46:52.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:46:52.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101009.423466s, valid=True
2026-06-04T00:46:52.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:46:52.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:46:52.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:46:52.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:46:52.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:46:52.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:46:52.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:46:52.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:46:52.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:46:52.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:46:52.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:46:52.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:46:52.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:46:52.741 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:46:53.011 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:46:53.346 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:46:53.448 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:46:53.448 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:46:53.448 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:46:53.602 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:46:53.602 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:47:23.632 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:47:23.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:47:23.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:47:23.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:47:23.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:47:24.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:47:24.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:47:24.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:47:24.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:47:24.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:47:24.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:47:24.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:47:24.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:47:26.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:47:26.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:47:26.543 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:47:26.543 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:47:26.554 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:47:26.567 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:47:26.567 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:47:26.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:47:26.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:47:26.568 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:47:26.569 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:47:26.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:47:26.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:47:26.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:47:26.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:47:26.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:47:26.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:47:26.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:47:26.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:47:26.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:47:26.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:47:26.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:47:26.906 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:47:26.994 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:47:12
2026-06-04T00:47:26.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87488, datetime.datetime(2026, 6, 4, 0, 47, 12), datetime.datetime(2026, 6, 4, 0, 47, 11), 'salt', 1.63, 100.28, None, 53.63, 113.14, -0.04, 821.29, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:47:26.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:47:26.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:47:27.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:47:11, diff=16.001814s, valid=True
2026-06-04T00:47:27.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:47:27.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:47:27.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:47:12, diff=15.005454s, valid=True
2026-06-04T00:47:27.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:47:27.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:47:27.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:47:01, diff=26.013766s, valid=True
2026-06-04T00:47:27.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:47:27.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:47:27.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:47:27.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:47:27.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:47:27.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:47:27.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:47:12, diff=15.017584s, valid=True
2026-06-04T00:47:27.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:47:27.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:47:27.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:47:27.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101044.018418s, valid=True
2026-06-04T00:47:27.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:47:27.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:47:27.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:47:27.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:47:27.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:47:27.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:47:27.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:47:27.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:47:27.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:47:27.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:47:27.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:47:27.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:47:27.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:47:27.340 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:47:27.537 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:47:27.870 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:47:27.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:47:27.970 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:47:27.970 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:47:28.166 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:47:28.166 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:47:58.197 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:47:58.197 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:47:58.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:47:58.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:47:58.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:47:58.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:47:58.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:47:58.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:47:58.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:47:58.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:47:58.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:47:58.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:47:58.792 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:48:01.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:48:01.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:48:01.218 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:48:01.218 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:48:01.225 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:48:01.237 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:48:01.237 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:48:01.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:48:01.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:48:01.238 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:48:01.238 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:48:01.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:48:01.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:48:01.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:48:01.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:48:01.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:48:01.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:48:01.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:48:01.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:48:01.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:48:01.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:48:01.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:48:01.529 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:48:01.599 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:47:42
2026-06-04T00:48:01.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87489, datetime.datetime(2026, 6, 4, 0, 47, 42), datetime.datetime(2026, 6, 4, 0, 47, 41), 'salt', 1.6, 100.24, None, 57.93, 116.17, -0.04, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:48:01.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:48:01.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:48:01.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:47:41, diff=20.606105s, valid=True
2026-06-04T00:48:01.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:48:01.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:48:01.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:48:12, diff=-10.390606s, valid=True
2026-06-04T00:48:01.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:48:01.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:48:01.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:47:32, diff=29.617055s, valid=True
2026-06-04T00:48:01.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:48:01.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:48:01.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:48:01.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:48:01.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:48:01.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:48:01.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:48:12, diff=-10.379398s, valid=True
2026-06-04T00:48:01.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:48:01.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:48:01.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:48:01.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101078.621355s, valid=True
2026-06-04T00:48:01.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:48:01.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:48:01.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:48:01.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:48:01.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:48:01.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:48:01.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:48:01.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:48:01.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:48:01.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:48:01.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:48:01.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:48:01.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:48:02.009 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:48:02.207 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:48:02.541 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:48:02.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:48:02.642 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:48:02.642 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:48:02.843 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:48:02.843 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:48:32.862 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:48:32.862 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:48:32.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:48:33.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:48:33.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:48:33.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:48:33.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:48:33.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:48:33.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:48:33.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:48:33.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:48:33.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:48:33.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:48:35.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:48:35.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:48:35.633 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:48:35.633 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:48:35.643 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:48:35.656 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:48:35.656 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:48:35.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:48:35.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:48:35.657 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:48:35.658 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:48:35.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:48:35.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:48:35.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:48:35.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:48:35.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:48:35.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:48:35.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:48:35.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:48:35.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:48:35.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:48:35.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:48:35.965 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:48:36.033 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:48:12
2026-06-04T00:48:36.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87490, datetime.datetime(2026, 6, 4, 0, 48, 12), datetime.datetime(2026, 6, 4, 0, 48, 11), 'salt', 1.63, 100.28, None, 43.5, 117.79, -0.04, 821.29, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T00:48:36.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:48:36.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:48:36.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:48:11, diff=25.040754s, valid=True
2026-06-04T00:48:36.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:48:36.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:48:36.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:48:12, diff=24.044006s, valid=True
2026-06-04T00:48:36.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:48:36.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:48:36.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:48:12, diff=24.051602s, valid=True
2026-06-04T00:48:36.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:48:36.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:48:36.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:48:36.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:48:36.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:48:36.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:48:36.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:48:12, diff=24.055116s, valid=True
2026-06-04T00:48:36.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:48:36.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:48:36.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:48:36.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101113.055887s, valid=True
2026-06-04T00:48:36.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:48:36.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:48:36.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:48:36.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:48:36.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:48:36.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:48:36.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:48:36.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:48:36.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:48:36.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:48:36.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:48:36.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:48:36.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:48:36.378 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:48:36.574 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:48:36.909 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:48:37.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:48:37.009 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:48:37.009 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:48:37.163 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:48:37.163 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:49:07.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:49:07.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:49:07.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:49:07.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:49:07.461 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:49:07.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:49:07.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:49:07.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:49:07.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:49:07.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:49:07.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:49:07.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:49:07.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:49:10.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:49:10.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:49:10.139 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:49:10.139 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:49:10.148 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:49:10.160 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:49:10.161 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:49:10.161 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:49:10.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:49:10.161 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:49:10.161 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:49:10.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:49:10.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:49:10.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:49:10.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:49:10.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:49:10.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:49:10.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:49:10.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:49:10.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:49:10.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:49:10.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:49:10.466 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:49:10.537 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:48:42
2026-06-04T00:49:10.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87491, datetime.datetime(2026, 6, 4, 0, 48, 42), datetime.datetime(2026, 6, 4, 0, 48, 42), 'salt', 1.63, 100.34, None, 54.79, 112.46, -0.05, 821.47, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:49:10.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:49:10.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:49:10.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:48:42, diff=28.544603s, valid=True
2026-06-04T00:49:10.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:49:10.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:49:10.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:49:12, diff=-1.451991s, valid=True
2026-06-04T00:49:10.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:49:10.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:49:10.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:48:42, diff=28.555776s, valid=True
2026-06-04T00:49:10.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:49:10.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:49:10.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:49:10.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:49:10.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:49:10.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:49:10.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:49:12, diff=-1.440652s, valid=True
2026-06-04T00:49:10.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:49:10.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:49:10.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:49:10.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101147.560129s, valid=True
2026-06-04T00:49:10.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:49:10.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:49:10.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:49:10.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:49:10.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:49:10.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:49:10.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:49:10.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:49:10.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:49:10.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:49:10.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:49:10.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:49:10.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:49:10.947 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:49:11.144 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:49:11.480 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:49:11.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:49:11.582 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:49:11.583 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:49:12.687 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:49:12.687 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:49:42.716 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:49:42.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:49:42.717 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:49:43.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:49:43.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:49:43.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:49:43.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:49:43.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:49:43.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:49:43.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:49:43.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:49:43.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:49:43.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:49:46.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:49:46.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:49:46.015 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:49:46.016 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:49:46.027 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:49:46.041 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:49:46.041 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:49:46.042 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:49:46.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:49:46.042 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:49:46.043 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:49:46.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:49:46.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:49:46.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:49:46.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:49:46.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:49:46.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:49:46.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:49:46.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:49:46.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:49:46.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:49:46.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:49:46.377 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:49:46.484 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:49:43
2026-06-04T00:49:46.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87493, datetime.datetime(2026, 6, 4, 0, 49, 43), datetime.datetime(2026, 6, 4, 0, 49, 42), 'salt', 1.6, 100.24, None, 51.12, 121.45, -0.04, 821.41, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:49:46.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:49:46.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:49:46.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:49:42, diff=4.491715s, valid=True
2026-06-04T00:49:46.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:49:46.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:49:46.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:50:12, diff=-25.504801s, valid=True
2026-06-04T00:49:46.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:49:46.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:49:46.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:49:33, diff=13.503314s, valid=True
2026-06-04T00:49:46.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:49:46.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:49:46.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:49:46.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:49:46.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:49:46.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:49:46.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:50:12, diff=-25.492944s, valid=True
2026-06-04T00:49:46.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:49:46.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:49:46.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:49:46.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101183.507883s, valid=True
2026-06-04T00:49:46.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:49:46.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:49:46.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:49:46.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:49:46.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:49:46.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:49:46.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:49:46.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:49:46.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:49:46.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:49:46.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:49:46.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:49:46.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:49:46.829 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:49:47.028 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:49:47.361 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:49:47.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:49:47.462 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:49:47.462 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:49:47.552 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:49:47.552 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:50:17.583 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:50:17.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:50:17.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:50:18.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:50:18.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:50:18.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:50:18.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:50:18.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:50:18.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:50:18.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:50:18.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:50:18.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:50:18.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:50:20.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:50:20.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:50:20.862 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:50:20.862 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:50:20.872 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:50:20.885 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:50:20.886 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:50:20.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:50:20.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:50:20.887 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:50:20.887 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:50:20.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:50:21.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:50:21.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:50:21.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:50:21.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:50:21.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:50:21.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:50:21.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:50:21.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:50:21.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:50:21.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:50:21.220 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:50:21.294 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:50:13
2026-06-04T00:50:21.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87494, datetime.datetime(2026, 6, 4, 0, 50, 13), datetime.datetime(2026, 6, 4, 0, 50, 12), 'salt', 1.63, 100.21, None, 43.82, 124.72, -0.03, 821.35, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T00:50:21.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:50:21.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:50:21.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:50:12, diff=9.301726s, valid=True
2026-06-04T00:50:21.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:50:21.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:50:21.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:50:12, diff=9.305263s, valid=True
2026-06-04T00:50:21.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:50:21.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:50:21.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:50:13, diff=8.313556s, valid=True
2026-06-04T00:50:21.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:50:21.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:50:21.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:50:21.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:50:21.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:50:21.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:50:21.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:50:12, diff=9.317294s, valid=True
2026-06-04T00:50:21.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:50:21.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:50:21.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:50:21.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101218.318097s, valid=True
2026-06-04T00:50:21.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:50:21.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:50:21.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:50:21.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:50:21.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:50:21.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:50:21.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:50:21.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:50:21.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:50:21.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:50:21.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:50:21.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:50:21.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:50:21.706 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:50:21.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:50:22.252 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:50:22.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:50:22.355 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:50:22.355 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:50:22.508 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:50:22.508 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:50:52.527 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:50:52.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:50:52.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:50:52.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:50:52.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:50:52.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:50:52.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:50:52.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:50:52.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:50:52.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:50:52.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:50:52.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:50:52.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:50:55.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:50:55.535 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:50:55.536 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:50:55.536 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:50:55.546 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:50:55.559 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:50:55.560 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:50:55.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:50:55.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:50:55.561 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:50:55.561 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:50:55.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:50:55.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:50:55.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:50:55.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:50:55.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:50:55.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:50:55.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:50:55.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:50:55.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:50:55.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:50:55.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:50:55.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:50:55.955 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:50:43
2026-06-04T00:50:55.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87495, datetime.datetime(2026, 6, 4, 0, 50, 43), datetime.datetime(2026, 6, 4, 0, 50, 43), 'salt', 1.63, 100.21, None, 48.62, 121.15, -0.03, 821.29, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:50:55.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:50:55.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:50:55.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:50:43, diff=12.962587s, valid=True
2026-06-04T00:50:55.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:50:55.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:50:55.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:51:12, diff=-16.034012s, valid=True
2026-06-04T00:50:55.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:50:55.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:50:55.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:50:43, diff=12.974012s, valid=True
2026-06-04T00:50:55.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:50:55.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:50:55.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:50:55.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:50:55.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:50:55.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:50:55.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:51:12, diff=-16.022347s, valid=True
2026-06-04T00:50:55.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:50:55.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:50:55.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:50:55.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101252.978423s, valid=True
2026-06-04T00:50:55.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:50:55.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:50:55.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:50:55.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:50:55.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:50:56.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:50:56.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:50:56.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:50:56.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:50:56.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:50:56.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:50:56.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:50:56.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:50:56.299 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:50:56.522 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:50:56.866 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:50:56.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:50:56.968 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:50:56.969 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:50:57.124 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:50:57.124 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:51:27.154 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:51:27.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:51:27.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:51:27.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:51:27.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:51:27.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:51:27.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:51:27.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:51:27.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:51:27.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:51:27.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:51:27.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:51:27.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:51:30.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:51:30.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:51:30.307 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:51:30.307 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:51:30.316 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:51:30.328 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:51:30.328 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:51:30.329 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:51:30.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:51:30.329 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:51:30.329 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:51:30.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:51:30.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:51:30.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:51:30.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:51:30.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:51:30.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:51:30.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:51:30.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:51:30.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:51:30.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:51:30.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:51:30.623 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:51:30.692 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:51:14
2026-06-04T00:51:30.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87496, datetime.datetime(2026, 6, 4, 0, 51, 14), datetime.datetime(2026, 6, 4, 0, 51, 13), 'salt', 1.67, 100.28, None, 50.14, 117.58, -0.04, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:51:30.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:51:30.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:51:30.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:51:13, diff=17.699775s, valid=True
2026-06-04T00:51:30.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:51:30.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:51:30.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:51:12, diff=18.703163s, valid=True
2026-06-04T00:51:30.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:51:30.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:51:30.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:51:14, diff=16.711015s, valid=True
2026-06-04T00:51:30.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:51:30.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:51:30.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:51:30.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:51:30.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:51:30.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:51:30.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:51:12, diff=18.714604s, valid=True
2026-06-04T00:51:30.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:51:30.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:51:30.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:51:30.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101287.715386s, valid=True
2026-06-04T00:51:30.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:51:30.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:51:30.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:51:30.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:51:30.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:51:30.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:51:30.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:51:30.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:51:30.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:51:30.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:51:30.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:51:30.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:51:30.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:51:31.034 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:51:31.243 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:51:31.587 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:51:31.690 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:51:31.690 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:51:31.690 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:51:31.844 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:51:31.844 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:52:01.865 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:52:01.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:52:01.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:52:02.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:52:02.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:52:02.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:52:02.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:52:02.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:52:02.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:52:02.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:52:02.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:52:02.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:52:02.458 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:52:04.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:52:04.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:52:04.761 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:52:04.761 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:52:04.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:52:04.784 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:52:04.785 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:52:04.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:52:04.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:52:04.785 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:52:04.785 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:52:04.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:52:04.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:52:04.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:52:04.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:52:04.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:52:05.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:52:05.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:52:05.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:52:05.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:52:05.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:52:05.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:52:05.081 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:52:05.152 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:51:44
2026-06-04T00:52:05.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87497, datetime.datetime(2026, 6, 4, 0, 51, 44), datetime.datetime(2026, 6, 4, 0, 51, 43), 'salt', 1.7, 100.71, None, 53.24, 122.35, -0.1, 821.29, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:52:05.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:52:05.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:52:05.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:51:43, diff=22.15917s, valid=True
2026-06-04T00:52:05.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:52:05.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:52:05.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:52:12, diff=-6.837483s, valid=True
2026-06-04T00:52:05.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:52:05.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:52:05.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:51:34, diff=31.170459s, valid=True
2026-06-04T00:52:05.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:52:05.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:52:05.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:52:05.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:52:05.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:52:05.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:52:05.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:52:12, diff=-6.825904s, valid=True
2026-06-04T00:52:05.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:52:05.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:52:05.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:52:05.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101322.174888s, valid=True
2026-06-04T00:52:05.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:52:05.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:52:05.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:52:05.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:52:05.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:52:05.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:52:05.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:52:05.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:52:05.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:52:05.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:52:05.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:52:05.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:52:05.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:52:05.497 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:52:05.703 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:52:06.047 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:52:06.209 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:52:06.209 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:52:06.209 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:52:06.404 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:52:06.405 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:52:36.435 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:52:36.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:52:36.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:52:36.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:52:36.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:52:37.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:52:37.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:52:37.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:52:37.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:52:37.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:52:37.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:52:37.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:52:37.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:52:39.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:52:39.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:52:39.665 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:52:39.665 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:52:39.676 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:52:39.689 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:52:39.689 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:52:39.690 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:52:39.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:52:39.690 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:52:39.690 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:52:39.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:52:39.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:52:39.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:52:39.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:52:39.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:52:39.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:52:39.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:52:40.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:52:40.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:52:40.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:52:40.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:52:40.033 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:52:40.104 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:52:14
2026-06-04T00:52:40.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87498, datetime.datetime(2026, 6, 4, 0, 52, 14), datetime.datetime(2026, 6, 4, 0, 52, 13), 'salt', 1.63, 100.34, None, 41.99, 116.33, -0.05, 821.53, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T00:52:40.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:52:40.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:52:40.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:52:13, diff=27.112742s, valid=True
2026-06-04T00:52:40.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:52:40.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:52:40.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:52:12, diff=28.116088s, valid=True
2026-06-04T00:52:40.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:52:40.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:52:40.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:52:14, diff=26.12371s, valid=True
2026-06-04T00:52:40.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:52:40.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:52:40.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:52:40.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:52:40.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:52:40.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:52:40.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:52:12, diff=28.127119s, valid=True
2026-06-04T00:52:40.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:52:40.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:52:40.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:52:40.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101357.127913s, valid=True
2026-06-04T00:52:40.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:52:40.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:52:40.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:52:40.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:52:40.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:52:40.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:52:40.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:52:40.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:52:40.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:52:40.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:52:40.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:52:40.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:52:40.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:52:40.450 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:52:40.659 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:52:41.004 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:52:41.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:52:41.108 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:52:41.108 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:52:41.267 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:52:41.267 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:53:11.285 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:53:11.285 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:53:11.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:53:11.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:53:11.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:53:11.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:53:11.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:53:11.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:53:11.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:53:11.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:53:11.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:53:11.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:53:11.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:53:14.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:53:14.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:53:14.275 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:53:14.275 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:53:14.286 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:53:14.299 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:53:14.299 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:53:14.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:53:14.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:53:14.300 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:53:14.301 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:53:14.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:53:14.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-04T00:53:14.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:53:14.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-04T00:53:14.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:53:14.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:53:14.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:53:14.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:53:14.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:53:14.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:53:14.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:53:14.636 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:53:14.709 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:52:44
2026-06-04T00:53:14.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87499, datetime.datetime(2026, 6, 4, 0, 52, 44), datetime.datetime(2026, 6, 4, 0, 52, 44), 'salt', 1.67, 100.28, None, 39.76, 118.99, -0.04, 821.29, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T00:53:14.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:53:14.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-04T00:53:14.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:52:44, diff=30.716539s, valid=True
2026-06-04T00:53:14.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:53:14.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:53:14.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:53:12, diff=2.720097s, valid=True
2026-06-04T00:53:14.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:53:14.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-04T00:53:14.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:52:44, diff=30.728341s, valid=True
2026-06-04T00:53:14.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:53:14.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:53:14.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:53:14.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:53:14.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:53:14.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:53:14.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:53:12, diff=2.732106s, valid=True
2026-06-04T00:53:14.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:53:14.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:53:14.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:53:14.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101391.732913s, valid=True
2026-06-04T00:53:14.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:53:14.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:53:14.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:53:14.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:53:14.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:53:14.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:53:14.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:53:14.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:53:14.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:53:14.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:53:14.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:53:14.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:53:15.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:53:15.052 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:53:15.330 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:53:15.672 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:53:15.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:53:15.774 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:53:15.774 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:53:16.002 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:53:16.002 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:53:46.033 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:53:46.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:53:46.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:53:46.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:53:46.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:53:46.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:53:46.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:53:46.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:53:46.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:53:46.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:53:46.795 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:53:46.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:53:46.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:53:49.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:53:49.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:53:49.414 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:53:49.414 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:53:49.425 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:53:49.438 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:53:49.439 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:53:49.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:53:49.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:53:49.440 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:53:49.440 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:53:49.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:53:49.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:53:49.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:53:49.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:53:49.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:53:49.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:53:49.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:53:49.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:53:49.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:53:49.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:53:49.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:53:49.781 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:53:49.856 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:53:45
2026-06-04T00:53:49.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87501, datetime.datetime(2026, 6, 4, 0, 53, 45), datetime.datetime(2026, 6, 4, 0, 53, 44), 'salt', 1.53, 100.21, None, 62.84, 118.16, -0.03, 821.11, 'DRY', 0, None, 0, 2, 2, 2)]
2026-06-04T00:53:49.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:53:49.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:53:49.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:53:44, diff=5.862936s, valid=True
2026-06-04T00:53:49.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:53:49.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:53:49.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:54:12, diff=-22.13417s, valid=True
2026-06-04T00:53:49.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:53:49.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:53:49.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:53:45, diff=4.872587s, valid=True
2026-06-04T00:53:49.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:53:49.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:53:49.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:53:49.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:53:49.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:53:49.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:53:49.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:54:12, diff=-22.123246s, valid=True
2026-06-04T00:53:49.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:53:49.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:53:49.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:53:49.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101426.877459s, valid=True
2026-06-04T00:53:49.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:53:49.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:53:49.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:53:49.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:53:49.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:53:49.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:53:49.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:53:49.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:53:49.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:53:50.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:53:50.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:53:50.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:53:50.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:53:50.206 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:53:50.413 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:53:50.754 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:53:50.856 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:53:50.856 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:53:50.856 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:53:50.943 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:53:50.943 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:54:20.973 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:54:20.973 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:54:20.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:54:21.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:54:21.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:54:21.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:54:21.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:54:21.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:54:21.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:54:21.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:54:21.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:54:21.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:54:21.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:54:23.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:54:23.881 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:54:23.881 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:54:23.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:54:23.892 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:54:23.905 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:54:23.905 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:54:23.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:54:23.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:54:23.906 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:54:23.907 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:54:23.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:54:24.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:54:24.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:54:24.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:54:24.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:54:24.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:54:24.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:54:24.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:54:24.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:54:24.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:54:24.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:54:24.248 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:54:24.328 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:54:15
2026-06-04T00:54:24.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87502, datetime.datetime(2026, 6, 4, 0, 54, 15), datetime.datetime(2026, 6, 4, 0, 54, 14), 'salt', 1.57, 100.28, None, 53.88, 121.95, -0.04, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:54:24.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:54:24.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:54:24.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:54:14, diff=10.336142s, valid=True
2026-06-04T00:54:24.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:54:24.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:54:24.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:54:12, diff=12.339648s, valid=True
2026-06-04T00:54:24.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:54:24.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:54:24.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:54:15, diff=9.347997s, valid=True
2026-06-04T00:54:24.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:54:24.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:54:24.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:54:24.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:54:24.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:54:24.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:54:24.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:54:12, diff=12.351749s, valid=True
2026-06-04T00:54:24.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:54:24.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:54:24.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:54:24.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101461.352577s, valid=True
2026-06-04T00:54:24.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:54:24.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:54:24.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:54:24.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:54:24.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:54:24.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:54:24.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:54:24.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:54:24.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:54:24.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:54:24.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:54:24.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:54:24.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:54:24.754 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:54:24.960 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:54:25.304 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:54:25.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:54:25.406 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:54:25.407 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:54:25.599 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:54:25.599 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:54:55.629 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:54:55.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:54:55.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:54:55.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:54:55.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:54:56.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:54:56.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:54:56.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:54:56.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:54:56.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:54:56.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:54:56.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:54:56.212 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:54:58.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:54:58.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:54:58.618 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:54:58.618 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:54:58.628 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:54:58.640 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:54:58.640 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:54:58.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:54:58.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:54:58.642 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:54:58.642 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:54:58.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:54:58.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:54:58.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:54:58.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:54:58.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:54:58.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:54:58.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:54:58.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:54:58.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:54:58.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:54:58.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:54:58.969 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:54:59.042 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:54:46
2026-06-04T00:54:59.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87503, datetime.datetime(2026, 6, 4, 0, 54, 46), datetime.datetime(2026, 6, 4, 0, 54, 45), 'salt', 1.6, 100.24, None, 52.82, 122.46, -0.04, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:54:59.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:54:59.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:54:59.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:54:45, diff=14.050112s, valid=True
2026-06-04T00:54:59.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:54:59.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:54:59.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:55:12, diff=-12.946401s, valid=True
2026-06-04T00:54:59.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:54:59.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:54:59.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:54:45, diff=14.061771s, valid=True
2026-06-04T00:54:59.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:54:59.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:54:59.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:54:59.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:54:59.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:54:59.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:54:59.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:55:12, diff=-12.934526s, valid=True
2026-06-04T00:54:59.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:54:59.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:54:59.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:54:59.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101496.066296s, valid=True
2026-06-04T00:54:59.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:54:59.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:54:59.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:54:59.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:54:59.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:54:59.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:54:59.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:54:59.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:54:59.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:54:59.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:54:59.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:54:59.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:54:59.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:54:59.386 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:54:59.591 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:54:59.941 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:55:00.050 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:55:00.050 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:55:00.050 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:55:00.294 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:55:00.294 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:55:30.306 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:55:30.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:55:30.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:55:30.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:55:30.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:55:30.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:55:30.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:55:30.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:55:30.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:55:30.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:55:30.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:55:30.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:55:30.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:55:33.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:55:33.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:55:33.482 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:55:33.482 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:55:33.491 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:55:33.504 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:55:33.505 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:55:33.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:55:33.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:55:33.506 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:55:33.506 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:55:33.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:55:33.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:55:33.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:55:33.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:55:33.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:55:33.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:55:33.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:55:33.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T00:55:33.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:55:33.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:55:33.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:55:33.848 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:55:33.921 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:55:16
2026-06-04T00:55:33.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87504, datetime.datetime(2026, 6, 4, 0, 55, 16), datetime.datetime(2026, 6, 4, 0, 55, 16), 'salt', 1.6, 100.68, None, 47.6, 122.32, -0.1, 821.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:55:33.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:55:33.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:55:33.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:55:16, diff=17.928908s, valid=True
2026-06-04T00:55:33.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:55:33.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:55:33.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:55:12, diff=21.932263s, valid=True
2026-06-04T00:55:33.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:55:33.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:55:33.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:55:15, diff=18.940208s, valid=True
2026-06-04T00:55:33.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:55:33.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:55:33.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:55:33.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:55:33.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:55:33.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T00:55:33.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:55:12, diff=21.943833s, valid=True
2026-06-04T00:55:33.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:55:33.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:55:33.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:55:33.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101530.94471s, valid=True
2026-06-04T00:55:33.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:55:33.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:55:33.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:55:33.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:55:33.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:55:34.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:55:34.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:55:34.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:55:34.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:55:34.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:55:34.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:55:34.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:55:34.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:55:34.351 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:55:34.565 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:55:34.910 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:55:35.013 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:55:35.013 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:55:35.013 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:55:35.101 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:55:35.101 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:56:05.131 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:56:05.132 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:56:05.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:56:05.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:56:05.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:56:05.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:56:05.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:56:05.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:56:05.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:56:05.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:56:05.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:56:05.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:56:05.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:56:08.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:56:08.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:56:08.773 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:56:08.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:56:08.784 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:56:08.796 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:56:08.797 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:56:08.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:56:08.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:56:08.798 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:56:08.798 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:56:08.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:56:08.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:56:08.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:56:09.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:56:09.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:56:09.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:56:09.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:56:09.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:56:09.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:56:09.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:56:09.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:56:09.131 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:56:09.213 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:55:47
2026-06-04T00:56:09.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87505, datetime.datetime(2026, 6, 4, 0, 55, 47), datetime.datetime(2026, 6, 4, 0, 55, 46), 'salt', 1.67, 100.38, None, 51.58, 115.74, -0.05, 821.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:56:09.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:56:09.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:56:09.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:55:46, diff=23.220898s, valid=True
2026-06-04T00:56:09.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:56:09.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:56:09.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:56:12, diff=-2.775623s, valid=True
2026-06-04T00:56:09.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:56:09.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:56:09.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:55:46, diff=23.232589s, valid=True
2026-06-04T00:56:09.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:56:09.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:56:09.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:56:09.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:56:09.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:56:09.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:56:09.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:56:12, diff=-2.763701s, valid=True
2026-06-04T00:56:09.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:56:09.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:56:09.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:56:09.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101566.237111s, valid=True
2026-06-04T00:56:09.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:56:09.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:56:09.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:56:09.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:56:09.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:56:09.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:56:09.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:56:09.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:56:09.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:56:09.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:56:09.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:56:09.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:56:09.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:56:09.557 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:56:09.763 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:56:10.121 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:56:10.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:56:10.227 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:56:10.227 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:56:10.309 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:56:10.310 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:56:40.340 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:56:40.340 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:56:40.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:56:40.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:56:40.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:56:40.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:56:40.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:56:40.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:56:40.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:56:40.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:56:40.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:56:40.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:56:40.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:56:43.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:56:43.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:56:43.253 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:56:43.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:56:43.264 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:56:43.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:56:43.277 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:56:43.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:56:43.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:56:43.278 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:56:43.278 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:56:43.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:56:43.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:56:43.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:56:43.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:56:43.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:56:43.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:56:43.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:56:43.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T00:56:43.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:56:43.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:56:43.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:56:43.611 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:56:43.680 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:56:17
2026-06-04T00:56:43.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87506, datetime.datetime(2026, 6, 4, 0, 56, 17), datetime.datetime(2026, 6, 4, 0, 56, 16), 'salt', 1.7, 100.31, None, 51.37, 124.41, -0.04, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:56:43.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:56:43.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:56:43.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:56:16, diff=27.687542s, valid=True
2026-06-04T00:56:43.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:56:43.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:56:43.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:56:12, diff=31.691035s, valid=True
2026-06-04T00:56:43.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:56:43.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:56:43.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:56:16, diff=27.699116s, valid=True
2026-06-04T00:56:43.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:56:43.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:56:43.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:56:43.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:56:43.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:56:43.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T00:56:43.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:56:12, diff=31.702832s, valid=True
2026-06-04T00:56:43.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:56:43.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:56:43.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:56:43.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101600.703635s, valid=True
2026-06-04T00:56:43.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:56:43.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:56:43.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:56:43.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:56:43.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:56:43.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:56:43.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:56:43.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:56:43.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:56:43.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:56:43.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:56:44.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:56:44.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:56:44.091 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:56:44.301 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:56:44.646 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:56:44.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:56:44.752 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:56:44.752 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:56:44.941 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:56:44.941 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:57:14.959 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:57:14.960 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:57:14.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:57:15.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:57:15.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:57:15.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:57:15.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:57:15.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:57:15.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:57:15.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:57:15.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:57:15.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:57:15.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:57:17.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:57:17.961 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:57:17.962 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:57:17.963 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:57:17.973 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:57:17.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:57:17.986 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:57:17.987 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:57:17.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:57:17.988 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:57:17.988 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:57:17.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:57:18.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:57:18.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:57:18.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:57:18.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:57:18.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T00:57:18.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:57:18.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T00:57:18.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:57:18.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:57:18.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:57:18.323 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:57:18.395 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:57:17
2026-06-04T00:57:18.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87508, datetime.datetime(2026, 6, 4, 0, 57, 17), datetime.datetime(2026, 6, 4, 0, 57, 17), 'salt', 1.5, 100.24, None, 58.36, 122.18, -0.04, 821.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:57:18.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:57:18.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:57:18.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:57:17, diff=1.40259s, valid=True
2026-06-04T00:57:18.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:57:18.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T00:57:18.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:57:12, diff=6.405971s, valid=True
2026-06-04T00:57:18.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:57:18.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:57:18.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:57:17, diff=1.413846s, valid=True
2026-06-04T00:57:18.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:57:18.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:57:18.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:57:18.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:57:18.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:57:18.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T00:57:18.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:57:12, diff=6.417448s, valid=True
2026-06-04T00:57:18.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:57:18.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:57:18.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:57:18.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101635.418233s, valid=True
2026-06-04T00:57:18.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:57:18.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:57:18.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:57:18.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:57:18.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:57:18.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:57:18.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:57:18.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:57:18.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:57:18.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:57:18.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:57:18.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:57:18.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:57:18.746 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:57:18.951 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:57:19.294 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:57:19.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:57:19.396 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:57:19.396 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:57:19.556 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:57:19.556 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:57:49.560 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:57:49.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:57:49.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:57:49.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:57:49.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:57:50.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:57:50.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:57:50.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:57:50.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:57:50.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:57:50.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:57:50.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:57:50.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:57:52.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:57:52.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:57:52.639 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:57:52.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:57:52.650 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:57:52.662 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:57:52.663 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:57:52.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:57:52.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:57:52.664 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:57:52.664 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:57:52.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:57:52.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:57:52.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:57:52.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:57:52.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:57:52.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T00:57:52.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:57:53.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T00:57:53.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:57:53.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:57:53.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:57:53.013 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:57:53.085 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:57:48
2026-06-04T00:57:53.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87509, datetime.datetime(2026, 6, 4, 0, 57, 48), datetime.datetime(2026, 6, 4, 0, 57, 47), 'salt', 1.5, 100.21, None, 48.37, 127.75, -0.03, 821.29, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:57:53.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:57:53.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:57:53.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:57:47, diff=6.09145s, valid=True
2026-06-04T00:57:53.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:57:53.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T00:57:53.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:58:12, diff=-18.905651s, valid=True
2026-06-04T00:57:53.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:57:53.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:57:53.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:57:47, diff=6.101125s, valid=True
2026-06-04T00:57:53.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:57:53.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:57:53.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:57:53.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:57:53.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:57:53.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T00:57:53.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:58:12, diff=-18.895852s, valid=True
2026-06-04T00:57:53.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:57:53.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:57:53.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:57:53.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101670.104816s, valid=True
2026-06-04T00:57:53.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:57:53.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:57:53.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:57:53.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:57:53.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:57:53.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:57:53.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:57:53.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:57:53.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:57:53.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:57:53.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:57:53.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:57:53.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:57:53.419 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:57:53.624 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:57:53.965 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:57:54.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:57:54.067 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:57:54.067 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:57:54.348 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:57:54.348 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:58:24.362 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:58:24.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:58:24.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:58:24.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:58:24.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:58:24.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:58:24.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:58:24.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:58:24.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:58:24.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:58:24.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:58:24.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:58:24.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:58:27.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:58:27.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:58:27.319 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:58:27.319 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:58:27.330 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:58:27.343 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:58:27.344 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:58:27.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:58:27.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:58:27.345 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:58:27.345 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:58:27.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:58:27.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:58:27.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:58:27.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:58:27.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:58:27.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T00:58:27.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:58:27.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T00:58:27.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:58:27.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:58:27.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:58:27.675 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:58:27.745 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:58:18
2026-06-04T00:58:27.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87510, datetime.datetime(2026, 6, 4, 0, 58, 18), datetime.datetime(2026, 6, 4, 0, 58, 17), 'salt', 1.6, 100.31, None, 57.93, 119.74, -0.04, 821.11, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:58:27.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:58:27.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:58:27.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:58:17, diff=10.7528s, valid=True
2026-06-04T00:58:27.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:58:27.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T00:58:27.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:58:12, diff=15.756156s, valid=True
2026-06-04T00:58:27.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:58:27.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:58:27.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:58:17, diff=10.764132s, valid=True
2026-06-04T00:58:27.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:58:27.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:58:27.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:58:27.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:58:27.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:58:27.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T00:58:27.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:58:12, diff=15.767758s, valid=True
2026-06-04T00:58:27.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:58:27.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:58:27.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:58:27.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101704.768527s, valid=True
2026-06-04T00:58:27.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:58:27.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:58:27.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:58:27.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:58:27.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:58:27.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:58:27.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:58:27.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:58:27.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:58:27.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:58:27.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:58:27.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:58:28.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:58:28.088 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:58:28.370 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:58:28.710 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:58:28.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:58:28.814 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:58:28.814 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:58:28.971 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:58:28.971 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:58:58.990 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:58:58.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:58:58.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:58:59.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:58:59.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:58:59.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:58:59.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:58:59.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:58:59.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:58:59.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:58:59.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:58:59.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:58:59.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:59:02.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:59:02.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:59:02.010 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:59:02.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:59:02.017 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:59:02.029 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:59:02.029 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:59:02.029 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:59:02.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:59:02.030 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:59:02.030 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:59:02.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:59:02.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:59:02.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:59:02.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:59:02.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:59:02.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:59:02.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:59:02.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:59:02.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:59:02.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:59:02.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:59:02.373 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:59:02.445 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:58:48
2026-06-04T00:59:02.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87511, datetime.datetime(2026, 6, 4, 0, 58, 48), datetime.datetime(2026, 6, 4, 0, 58, 47), 'salt', 1.57, 100.31, None, 55.39, 121.57, -0.04, 821.29, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:59:02.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:59:02.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:59:02.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:58:47, diff=15.453165s, valid=True
2026-06-04T00:59:02.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:59:02.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:59:02.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:59:12, diff=-9.543163s, valid=True
2026-06-04T00:59:02.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:59:02.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:59:02.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:58:48, diff=14.465007s, valid=True
2026-06-04T00:59:02.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:59:02.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:59:02.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:59:02.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:59:02.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:59:02.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:59:02.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:59:12, diff=-9.531267s, valid=True
2026-06-04T00:59:02.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:59:02.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:59:02.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:59:02.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101739.469534s, valid=True
2026-06-04T00:59:02.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:59:02.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:59:02.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:59:02.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:59:02.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:59:02.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:59:02.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:59:02.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:59:02.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:59:02.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:59:02.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:59:02.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:59:02.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:59:02.790 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:59:02.995 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:59:03.336 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:59:03.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:59:03.438 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:59:03.438 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:59:03.683 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:59:03.683 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T00:59:33.714 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T00:59:33.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T00:59:33.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T00:59:33.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T00:59:33.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T00:59:34.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T00:59:34.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T00:59:34.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T00:59:34.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T00:59:34.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T00:59:34.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T00:59:34.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T00:59:34.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T00:59:36.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T00:59:36.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T00:59:36.751 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T00:59:36.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T00:59:36.761 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T00:59:36.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T00:59:36.774 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T00:59:36.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T00:59:36.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T00:59:36.775 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T00:59:36.775 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T00:59:36.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T00:59:36.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T00:59:36.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T00:59:37.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T00:59:37.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:59:37.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:59:37.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T00:59:37.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T00:59:37.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T00:59:37.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T00:59:37.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T00:59:37.113 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T00:59:37.184 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:59:19
2026-06-04T00:59:37.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87512, datetime.datetime(2026, 6, 4, 0, 59, 19), datetime.datetime(2026, 6, 4, 0, 59, 18), 'salt', 1.63, 100.34, None, 51.97, 125.73, -0.05, 821.11, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T00:59:37.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T00:59:37.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T00:59:37.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:59:18, diff=19.191513s, valid=True
2026-06-04T00:59:37.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T00:59:37.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:59:37.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:59:12, diff=25.195008s, valid=True
2026-06-04T00:59:37.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T00:59:37.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T00:59:37.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:59:18, diff=19.203139s, valid=True
2026-06-04T00:59:37.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T00:59:37.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:59:37.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T00:59:37.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T00:59:37.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T00:59:37.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T00:59:37.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:59:12, diff=25.206874s, valid=True
2026-06-04T00:59:37.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T00:59:37.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T00:59:37.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T00:59:37.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101774.20771s, valid=True
2026-06-04T00:59:37.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T00:59:37.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T00:59:37.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T00:59:37.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T00:59:37.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T00:59:37.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T00:59:37.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T00:59:37.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T00:59:37.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T00:59:37.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T00:59:37.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T00:59:37.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T00:59:37.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T00:59:37.600 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T00:59:37.807 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:59:38.153 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T00:59:38.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T00:59:38.256 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T00:59:38.256 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T00:59:38.444 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T00:59:38.444 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:00:08.455 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:00:08.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:00:08.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:00:08.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:00:08.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:00:08.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:00:08.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:00:08.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:00:08.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:00:08.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:00:08.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:00:08.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:00:08.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:00:11.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:00:11.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:00:11.156 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:00:11.156 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:00:11.167 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:00:11.180 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:00:11.180 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:00:11.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:00:11.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:00:11.181 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:00:11.182 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:00:11.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:00:11.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:00:11.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:00:11.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:00:11.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:00:11.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:00:11.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:00:11.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:00:11.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:00:11.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:00:11.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:00:11.500 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:00:11.572 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 00:59:49
2026-06-04T01:00:11.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87513, datetime.datetime(2026, 6, 4, 0, 59, 49), datetime.datetime(2026, 6, 4, 0, 59, 48), 'salt', 1.6, 100.31, None, 57.69, 111.61, -0.04, 821.29, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:00:11.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:00:11.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:00:11.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:59:48, diff=23.579339s, valid=True
2026-06-04T01:00:11.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:00:11.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:00:11.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:00:12, diff=-0.417458s, valid=True
2026-06-04T01:00:11.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:00:11.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:00:11.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 00:59:48, diff=23.590126s, valid=True
2026-06-04T01:00:11.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:00:11.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:00:11.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:00:11.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:00:11.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:00:11.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:00:11.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:00:12, diff=-0.406414s, valid=True
2026-06-04T01:00:11.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:00:11.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:00:11.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:00:11.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101808.594322s, valid=True
2026-06-04T01:00:11.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:00:11.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:00:11.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:00:11.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:00:11.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:00:11.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:00:11.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:00:11.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:00:11.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:00:11.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:00:11.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:00:11.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:00:11.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:00:11.913 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:00:12.117 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:00:12.459 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:00:12.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:00:12.562 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:00:12.562 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:00:12.792 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:00:12.792 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:00:42.815 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:00:42.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:00:42.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:00:42.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:00:42.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:00:43.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:00:43.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:00:43.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:00:43.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:00:43.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:00:43.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:00:43.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:00:43.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:00:45.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:00:45.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:00:45.656 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:00:45.657 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:00:45.668 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:00:45.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:00:45.681 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:00:45.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:00:45.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:00:45.682 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:00:45.682 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:00:45.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:00:45.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:00:45.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:00:45.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-04T01:00:45.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:00:45.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T01:00:45.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:00:46.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T01:00:46.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:00:46.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:00:46.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:00:46.024 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:00:46.095 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:00:19
2026-06-04T01:00:46.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87514, datetime.datetime(2026, 6, 4, 1, 0, 19), datetime.datetime(2026, 6, 4, 1, 0, 19), 'salt', 1.5, 100.28, None, 55.92, 119.43, -0.04, 821.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:00:46.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:00:46.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:00:46.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:00:19, diff=27.102661s, valid=True
2026-06-04T01:00:46.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:00:46.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T01:00:46.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:00:12, diff=34.10614s, valid=True
2026-06-04T01:00:46.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:00:46.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-04T01:00:46.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:00:18, diff=28.114348s, valid=True
2026-06-04T01:00:46.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:00:46.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:00:46.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:00:46.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:00:46.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:00:46.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T01:00:46.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:00:12, diff=34.118094s, valid=True
2026-06-04T01:00:46.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:00:46.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:00:46.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:00:46.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101843.118907s, valid=True
2026-06-04T01:00:46.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:00:46.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:00:46.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:00:46.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:00:46.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:00:46.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:00:46.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:00:46.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:00:46.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:00:46.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:00:46.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:00:46.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:00:46.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:00:46.507 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:00:46.712 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:00:47.060 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:00:47.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:00:47.162 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:00:47.162 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:00:47.699 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:00:47.699 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:01:17.728 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:01:17.729 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:01:17.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:01:18.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:01:18.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:01:18.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:01:18.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:01:18.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:01:18.314 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:01:18.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:01:18.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:01:18.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:01:18.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:01:21.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:01:21.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:01:21.010 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:01:21.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:01:21.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:01:21.034 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:01:21.035 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:01:21.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:01:21.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:01:21.036 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:01:21.036 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:01:21.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:01:21.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:01:21.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:01:21.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:01:21.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:01:21.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:01:21.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:01:21.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:01:21.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:01:21.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:01:21.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:01:21.378 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:01:21.452 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:01:20
2026-06-04T01:01:21.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87516, datetime.datetime(2026, 6, 4, 1, 1, 20), datetime.datetime(2026, 6, 4, 1, 1, 19), 'salt', 1.57, 100.24, None, 57.65, 113.8, -0.03, 821.11, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:01:21.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:01:21.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:01:21.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:01:19, diff=2.459835s, valid=True
2026-06-04T01:01:21.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:01:21.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:01:21.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:01:12, diff=9.463318s, valid=True
2026-06-04T01:01:21.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:01:21.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:01:21.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:01:19, diff=2.471546s, valid=True
2026-06-04T01:01:21.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:01:21.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:01:21.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:01:21.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:01:21.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:01:21.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:01:21.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:01:12, diff=9.475275s, valid=True
2026-06-04T01:01:21.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:01:21.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:01:21.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:01:21.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101878.476094s, valid=True
2026-06-04T01:01:21.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:01:21.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:01:21.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:01:21.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:01:21.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:01:21.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:01:21.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:01:21.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:01:21.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:01:21.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:01:21.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:01:21.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:01:21.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:01:21.800 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:01:22.006 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:01:22.348 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:01:22.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:01:22.451 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:01:22.451 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:01:22.673 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:01:22.673 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:01:52.692 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:01:52.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:01:52.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:01:53.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:01:53.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:01:53.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:01:53.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:01:53.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:01:53.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:01:53.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:01:53.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:01:53.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:01:53.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:01:55.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:01:55.729 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:01:55.729 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:01:55.729 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:01:55.738 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:01:55.750 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:01:55.750 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:01:55.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:01:55.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:01:55.751 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:01:55.751 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:01:55.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:01:55.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:01:55.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:01:55.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:01:55.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:01:55.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:01:55.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:01:56.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:01:56.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:01:56.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:01:56.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:01:56.041 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:01:56.121 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:01:50
2026-06-04T01:01:56.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87517, datetime.datetime(2026, 6, 4, 1, 1, 50), datetime.datetime(2026, 6, 4, 1, 1, 49), 'salt', 1.57, 100.28, None, 49.36, 108.49, -0.04, 821.11, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:01:56.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:01:56.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:01:56.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:01:49, diff=7.12864s, valid=True
2026-06-04T01:01:56.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:01:56.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:01:56.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:02:12, diff=-15.868104s, valid=True
2026-06-04T01:01:56.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:01:56.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:01:56.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:01:49, diff=7.139396s, valid=True
2026-06-04T01:01:56.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:01:56.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:01:56.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:01:56.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:01:56.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:01:56.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:01:56.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:02:12, diff=-15.85714s, valid=True
2026-06-04T01:01:56.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:01:56.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:01:56.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:01:56.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101913.143601s, valid=True
2026-06-04T01:01:56.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:01:56.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:01:56.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:01:56.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:01:56.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:01:56.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:01:56.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:01:56.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:01:56.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:01:56.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:01:56.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:01:56.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:01:56.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:01:56.534 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:01:56.740 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:01:57.081 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:01:57.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:01:57.183 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:01:57.183 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:01:57.371 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:01:57.372 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:02:27.382 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:02:27.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:02:27.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:02:27.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:02:27.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:02:27.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:02:27.926 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:02:27.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:02:27.944 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:02:27.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:02:27.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:02:27.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:02:27.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:02:30.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:02:30.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:02:30.428 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:02:30.429 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:02:30.439 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:02:30.454 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:02:30.454 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:02:30.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:02:30.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:02:30.456 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:02:30.456 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:02:30.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:02:30.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:02:30.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:02:30.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:02:30.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:02:30.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:02:30.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:02:30.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:02:30.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:02:30.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:02:30.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:02:30.786 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:02:30.859 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:02:20
2026-06-04T01:02:30.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87518, datetime.datetime(2026, 6, 4, 1, 2, 20), datetime.datetime(2026, 6, 4, 1, 2, 20), 'salt', 1.6, 100.31, None, 52.5, 135.43, -0.04, 821.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:02:30.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:02:30.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:02:30.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:02:20, diff=10.866931s, valid=True
2026-06-04T01:02:30.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:02:30.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:02:30.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:02:12, diff=18.870453s, valid=True
2026-06-04T01:02:30.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:02:30.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:02:30.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:02:19, diff=11.878471s, valid=True
2026-06-04T01:02:30.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:02:30.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:02:30.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:02:30.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:02:30.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:02:30.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:02:30.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:02:12, diff=18.882225s, valid=True
2026-06-04T01:02:30.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:02:30.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:02:30.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:02:30.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101947.883019s, valid=True
2026-06-04T01:02:30.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:02:30.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:02:30.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:02:30.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:02:30.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:02:30.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:02:30.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:02:30.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:02:30.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:02:31.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:02:31.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:02:31.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:02:31.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:02:31.201 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:02:31.405 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:02:31.743 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:02:31.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:02:31.842 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:02:31.842 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:02:32.062 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:02:32.062 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:03:02.092 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:03:02.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:03:02.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:03:02.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:03:02.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:03:02.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:03:02.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:03:02.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:03:02.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:03:02.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:03:02.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:03:02.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:03:02.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:03:05.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:03:05.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:03:05.081 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:03:05.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:03:05.092 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:03:05.104 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:03:05.105 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:03:05.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:03:05.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:03:05.106 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:03:05.106 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:03:05.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:03:05.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:03:05.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:03:05.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:03:05.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:03:05.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:03:05.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:03:05.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:03:05.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:03:05.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:03:05.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:03:05.444 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:03:05.517 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:02:52
2026-06-04T01:03:05.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87519, datetime.datetime(2026, 6, 4, 1, 2, 52), datetime.datetime(2026, 6, 4, 1, 2, 50), 'salt', 1.57, 100.24, None, 46.01, 133.53, -0.03, 821.11, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:03:05.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:03:05.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:03:05.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:02:50, diff=15.525102s, valid=True
2026-06-04T01:03:05.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:03:05.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:03:05.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:03:12, diff=-6.471384s, valid=True
2026-06-04T01:03:05.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:03:05.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:03:05.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:02:50, diff=15.536812s, valid=True
2026-06-04T01:03:05.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:03:05.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:03:05.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:03:05.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:03:05.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:03:05.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:03:05.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:03:12, diff=-6.459452s, valid=True
2026-06-04T01:03:05.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:03:05.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:03:05.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:03:05.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=101982.541351s, valid=True
2026-06-04T01:03:05.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:03:05.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:03:05.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:03:05.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:03:05.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:03:05.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:03:05.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:03:05.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:03:05.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:03:05.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:03:05.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:03:05.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:03:05.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:03:05.861 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:03:06.066 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:03:06.407 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:03:06.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:03:06.516 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:03:06.516 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:03:06.757 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:03:06.757 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:03:36.787 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:03:36.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:03:36.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:03:37.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:03:37.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:03:37.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:03:37.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:03:37.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:03:37.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:03:37.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:03:37.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:03:37.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:03:37.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:03:39.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:03:39.828 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:03:39.828 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:03:39.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:03:39.837 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:03:39.849 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:03:39.849 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:03:39.849 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:03:39.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:03:39.850 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:03:39.850 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:03:39.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:03:39.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:03:39.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:03:40.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:03:40.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:03:40.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:03:40.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:03:40.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:03:40.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:03:40.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:03:40.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:03:40.144 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:03:40.225 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:03:22
2026-06-04T01:03:40.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87520, datetime.datetime(2026, 6, 4, 1, 3, 22), datetime.datetime(2026, 6, 4, 1, 3, 21), 'salt', 1.63, 100.31, None, 46.82, 116.33, -0.05, 821.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:03:40.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:03:40.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:03:40.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:03:21, diff=19.23191s, valid=True
2026-06-04T01:03:40.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:03:40.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:03:40.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:03:12, diff=28.23514s, valid=True
2026-06-04T01:03:40.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:03:40.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:03:40.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:03:20, diff=20.242732s, valid=True
2026-06-04T01:03:40.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:03:40.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:03:40.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:03:40.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:03:40.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:03:40.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:03:40.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:03:12, diff=28.246237s, valid=True
2026-06-04T01:03:40.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:03:40.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:03:40.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:03:40.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102017.24701s, valid=True
2026-06-04T01:03:40.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:03:40.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:03:40.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:03:40.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:03:40.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:03:40.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:03:40.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:03:40.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:03:40.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:03:40.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:03:40.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:03:40.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:03:40.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:03:40.564 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:03:40.770 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:03:41.171 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:03:41.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:03:41.273 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:03:41.273 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:03:41.360 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:03:41.360 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:04:11.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:04:11.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:04:11.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:04:11.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:04:11.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:04:12.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:04:12.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:04:12.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:04:12.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:04:12.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:04:12.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:04:12.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:04:12.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:04:14.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:04:14.551 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:04:14.552 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:04:14.552 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:04:14.563 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:04:14.575 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:04:14.576 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:04:14.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:04:14.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:04:14.577 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:04:14.577 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:04:14.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:04:14.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:04:14.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:04:14.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:04:14.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:04:14.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:04:14.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:04:14.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:04:14.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:04:14.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:04:14.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:04:14.923 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:04:14.998 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:03:52
2026-06-04T01:04:14.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87521, datetime.datetime(2026, 6, 4, 1, 3, 52), datetime.datetime(2026, 6, 4, 1, 3, 51), 'salt', 1.57, 100.31, None, 55.04, 117.91, -0.04, 821.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:04:14.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:04:14.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:04:15.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:03:51, diff=24.005575s, valid=True
2026-06-04T01:04:15.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:04:15.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:04:15.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:04:12, diff=3.009139s, valid=True
2026-06-04T01:04:15.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:04:15.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:04:15.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:03:50, diff=25.017313s, valid=True
2026-06-04T01:04:15.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:04:15.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:04:15.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:04:15.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:04:15.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:04:15.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:04:15.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:04:12, diff=3.021076s, valid=True
2026-06-04T01:04:15.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:04:15.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:04:15.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:04:15.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102052.021897s, valid=True
2026-06-04T01:04:15.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:04:15.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:04:15.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:04:15.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:04:15.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:04:15.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:04:15.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:04:15.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:04:15.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:04:15.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:04:15.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:04:15.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:04:15.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:04:15.342 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:04:15.550 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:04:15.891 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:04:15.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:04:15.993 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:04:15.993 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:04:16.234 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:04:16.235 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:04:46.265 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:04:46.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:04:46.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:04:46.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:04:46.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:04:46.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:04:46.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:04:46.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:04:46.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:04:46.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:04:46.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:04:46.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:04:46.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:04:49.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:04:49.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:04:49.300 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:04:49.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:04:49.311 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:04:49.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:04:49.325 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:04:49.325 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:04:49.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:04:49.326 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:04:49.326 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:04:49.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:04:49.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-04T01:04:49.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:04:49.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-04T01:04:49.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:04:49.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T01:04:49.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:04:49.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T01:04:49.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:04:49.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:04:49.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:04:49.668 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:04:49.738 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:04:22
2026-06-04T01:04:49.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87522, datetime.datetime(2026, 6, 4, 1, 4, 22), datetime.datetime(2026, 6, 4, 1, 4, 22), 'salt', 1.6, 100.34, None, 51.76, 120.66, -0.05, 821.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:04:49.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:04:49.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-04T01:04:49.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:04:22, diff=27.744148s, valid=True
2026-06-04T01:04:49.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:04:49.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T01:04:49.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:04:12, diff=37.746957s, valid=True
2026-06-04T01:04:49.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:04:49.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-04T01:04:49.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:04:20, diff=29.753556s, valid=True
2026-06-04T01:04:49.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:04:49.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:04:49.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:04:49.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:04:49.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:04:49.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T01:04:49.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:04:12, diff=37.756581s, valid=True
2026-06-04T01:04:49.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:04:49.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:04:49.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:04:49.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102086.757241s, valid=True
2026-06-04T01:04:49.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:04:49.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:04:49.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:04:49.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:04:49.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:04:49.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:04:49.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:04:49.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:04:49.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:04:49.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:04:49.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:04:50.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:04:50.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:04:50.123 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:04:50.423 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:04:50.764 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:04:50.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:04:50.867 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:04:50.867 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:04:51.015 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:04:51.015 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:05:21.032 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:05:21.032 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:05:21.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:05:21.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:05:21.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:05:21.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:05:21.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:05:21.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:05:21.619 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:05:21.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:05:21.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:05:21.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:05:21.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:05:24.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:05:24.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:05:24.312 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:05:24.312 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:05:24.321 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:05:24.332 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:05:24.333 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:05:24.333 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:05:24.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:05:24.333 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:05:24.333 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:05:24.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:05:24.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:05:24.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:05:24.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:05:24.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:05:24.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:05:24.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:05:24.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:05:24.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:05:24.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:05:24.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:05:24.671 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:05:24.766 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:05:23
2026-06-04T01:05:24.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87524, datetime.datetime(2026, 6, 4, 1, 5, 23), datetime.datetime(2026, 6, 4, 1, 5, 22), 'salt', 1.6, 100.28, None, 47.63, 117.37, -0.04, 821.35, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:05:24.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:05:24.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:05:24.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:05:22, diff=2.774086s, valid=True
2026-06-04T01:05:24.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:05:24.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:05:24.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:05:12, diff=12.777607s, valid=True
2026-06-04T01:05:24.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:05:24.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:05:24.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:05:21, diff=3.785819s, valid=True
2026-06-04T01:05:24.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:05:24.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:05:24.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:05:24.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:05:24.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:05:24.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:05:24.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:05:12, diff=12.789565s, valid=True
2026-06-04T01:05:24.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:05:24.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:05:24.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:05:24.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102121.790371s, valid=True
2026-06-04T01:05:24.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:05:24.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:05:24.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:05:24.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:05:24.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:05:24.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:05:24.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:05:24.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:05:24.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:05:24.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:05:24.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:05:25.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:05:25.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:05:25.113 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:05:25.318 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:05:25.659 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:05:25.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:05:25.761 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:05:25.761 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:05:25.941 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:05:25.941 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:05:55.971 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:05:55.972 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:05:55.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:05:56.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:05:56.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:05:56.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:05:56.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:05:56.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:05:56.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:05:56.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:05:56.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:05:56.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:05:56.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:05:59.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:05:59.051 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:05:59.052 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:05:59.052 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:05:59.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:05:59.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:05:59.073 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:05:59.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:05:59.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:05:59.074 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:05:59.074 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:05:59.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:05:59.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:05:59.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:05:59.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:05:59.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:05:59.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:05:59.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:05:59.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:05:59.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:05:59.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:05:59.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:05:59.422 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:05:59.498 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:05:54
2026-06-04T01:05:59.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87525, datetime.datetime(2026, 6, 4, 1, 5, 54), datetime.datetime(2026, 6, 4, 1, 5, 53), 'salt', 1.6, 100.28, None, 53.06, 120.63, -0.04, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:05:59.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:05:59.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:05:59.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:05:53, diff=6.505588s, valid=True
2026-06-04T01:05:59.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:05:59.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:05:59.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:06:12, diff=-12.490905s, valid=True
2026-06-04T01:05:59.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:05:59.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:05:59.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:05:51, diff=8.517274s, valid=True
2026-06-04T01:05:59.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:05:59.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:05:59.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:05:59.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:05:59.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:05:59.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:05:59.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:06:12, diff=-12.478899s, valid=True
2026-06-04T01:05:59.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:05:59.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:05:59.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:05:59.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102156.521921s, valid=True
2026-06-04T01:05:59.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:05:59.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:05:59.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:05:59.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:05:59.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:05:59.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:05:59.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:05:59.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:05:59.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:05:59.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:05:59.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:05:59.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:05:59.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:05:59.934 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:06:00.154 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:06:00.498 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:06:00.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:06:00.601 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:06:00.602 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:06:00.860 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:06:00.860 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:06:30.878 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:06:30.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:06:30.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:06:31.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:06:31.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:06:31.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:06:31.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:06:31.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:06:31.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:06:31.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:06:31.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:06:31.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:06:31.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:06:34.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:06:34.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:06:34.044 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:06:34.044 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:06:34.055 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:06:34.068 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:06:34.068 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:06:34.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:06:34.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:06:34.070 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:06:34.070 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:06:34.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:06:34.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:06:34.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:06:34.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:06:34.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:06:34.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:06:34.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:06:34.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:06:34.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:06:34.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:06:34.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:06:34.419 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:06:34.492 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:06:24
2026-06-04T01:06:34.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87526, datetime.datetime(2026, 6, 4, 1, 6, 24), datetime.datetime(2026, 6, 4, 1, 6, 24), 'salt', 1.6, 100.31, None, 50.74, 123.64, -0.04, 821.47, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:06:34.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:06:34.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:06:34.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:06:24, diff=10.500027s, valid=True
2026-06-04T01:06:34.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:06:34.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:06:34.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:06:12, diff=22.503478s, valid=True
2026-06-04T01:06:34.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:06:34.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:06:34.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:06:21, diff=13.51159s, valid=True
2026-06-04T01:06:34.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:06:34.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:06:34.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:06:34.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:06:34.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:06:34.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:06:34.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:06:12, diff=22.515351s, valid=True
2026-06-04T01:06:34.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:06:34.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:06:34.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:06:34.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102191.516169s, valid=True
2026-06-04T01:06:34.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:06:34.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:06:34.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:06:34.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:06:34.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:06:34.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:06:34.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:06:34.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:06:34.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:06:34.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:06:34.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:06:34.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:06:34.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:06:34.838 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:06:35.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:06:35.383 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:06:35.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:06:35.486 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:06:35.486 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:06:35.681 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:06:35.681 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:07:05.685 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:07:05.686 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:07:05.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:07:05.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:07:06.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:07:06.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:07:06.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:07:06.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:07:06.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:07:06.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:07:06.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:07:06.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:07:06.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:07:08.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:07:08.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:07:08.782 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:07:08.782 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:07:08.792 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:07:08.804 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:07:08.805 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:07:08.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:07:08.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:07:08.806 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:07:08.806 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:07:08.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:07:08.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:07:08.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:07:09.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:07:09.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:07:09.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:07:09.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:07:09.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:07:09.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:07:09.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:07:09.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:07:09.152 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:07:09.225 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:06:55
2026-06-04T01:07:09.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87527, datetime.datetime(2026, 6, 4, 1, 6, 55), datetime.datetime(2026, 6, 4, 1, 6, 54), 'salt', 1.6, 100.34, None, 44.35, 113.09, -0.05, 821.35, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:07:09.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:07:09.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:07:09.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:06:54, diff=15.232861s, valid=True
2026-06-04T01:07:09.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:07:09.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:07:09.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:07:12, diff=-2.763644s, valid=True
2026-06-04T01:07:09.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:07:09.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:07:09.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:06:52, diff=17.244414s, valid=True
2026-06-04T01:07:09.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:07:09.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:07:09.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:07:09.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:07:09.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:07:09.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:07:09.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:07:12, diff=-2.751839s, valid=True
2026-06-04T01:07:09.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:07:09.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:07:09.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:07:09.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102226.248976s, valid=True
2026-06-04T01:07:09.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:07:09.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:07:09.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:07:09.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:07:09.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:07:09.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:07:09.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:07:09.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:07:09.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:07:09.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:07:09.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:07:09.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:07:09.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:07:09.645 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:07:09.854 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:07:10.220 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:07:10.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:07:10.334 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:07:10.334 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:07:10.513 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:07:10.514 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:07:40.544 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:07:40.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:07:40.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:07:41.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:07:41.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:07:41.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:07:41.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:07:41.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:07:41.310 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:07:41.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:07:41.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:07:41.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:07:41.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:07:43.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:07:43.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:07:43.892 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:07:43.892 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:07:43.902 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:07:43.918 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:07:43.919 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:07:43.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:07:43.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:07:43.920 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:07:43.920 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:07:43.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:07:44.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:07:44.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:07:44.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:07:44.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:07:44.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:07:44.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:07:44.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:07:44.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:07:44.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:07:44.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:07:44.276 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:07:44.352 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:07:26
2026-06-04T01:07:44.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87528, datetime.datetime(2026, 6, 4, 1, 7, 26), datetime.datetime(2026, 6, 4, 1, 7, 25), 'salt', 1.57, 100.34, None, 50.17, 124.84, -0.05, 821.41, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:07:44.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:07:44.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:07:44.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:07:25, diff=19.359857s, valid=True
2026-06-04T01:07:44.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:07:44.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:07:44.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:07:12, diff=32.363242s, valid=True
2026-06-04T01:07:44.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:07:44.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:07:44.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:07:22, diff=22.371252s, valid=True
2026-06-04T01:07:44.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:07:44.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:07:44.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:07:44.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:07:44.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:07:44.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:07:44.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:07:12, diff=32.374907s, valid=True
2026-06-04T01:07:44.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:07:44.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:07:44.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:07:44.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102261.375706s, valid=True
2026-06-04T01:07:44.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:07:44.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:07:44.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:07:44.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:07:44.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:07:44.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:07:44.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:07:44.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:07:44.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:07:44.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:07:44.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:07:44.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:07:44.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:07:44.698 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:07:44.907 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:07:45.254 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:07:45.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:07:45.358 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:07:45.358 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:07:45.440 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:07:45.441 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:08:15.471 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:08:15.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:08:15.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:08:15.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:08:15.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:08:16.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:08:16.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:08:16.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:08:16.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:08:16.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:08:16.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:08:16.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:08:16.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:08:18.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:08:18.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:08:18.479 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:08:18.480 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:08:18.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:08:18.502 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:08:18.503 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:08:18.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:08:18.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:08:18.504 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:08:18.504 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:08:18.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:08:18.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:08:18.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:08:18.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:08:18.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:08:18.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:08:18.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:08:18.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:08:18.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:08:18.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:08:18.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:08:18.852 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:08:18.928 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:07:56
2026-06-04T01:08:18.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87529, datetime.datetime(2026, 6, 4, 1, 7, 56), datetime.datetime(2026, 6, 4, 1, 7, 55), 'salt', 1.6, 100.34, None, 58.25, 117.2, -0.05, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:08:18.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:08:18.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:08:18.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:07:55, diff=23.936007s, valid=True
2026-06-04T01:08:18.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:08:18.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:08:18.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:08:12, diff=6.939515s, valid=True
2026-06-04T01:08:18.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:08:18.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:08:18.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:07:52, diff=26.947872s, valid=True
2026-06-04T01:08:18.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:08:18.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:08:18.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:08:18.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:08:18.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:08:18.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:08:18.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:08:12, diff=6.951689s, valid=True
2026-06-04T01:08:18.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:08:18.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:08:18.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:08:18.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102295.952498s, valid=True
2026-06-04T01:08:18.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:08:18.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:08:18.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:08:18.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:08:18.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:08:19.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:08:19.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:08:19.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:08:19.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:08:19.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:08:19.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:08:19.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:08:19.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:08:19.339 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:08:19.545 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:08:19.895 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:08:20.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:08:20.004 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:08:20.004 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:08:20.205 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:08:20.206 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:08:50.236 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:08:50.236 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:08:50.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:08:50.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:08:50.744 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:08:50.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:08:50.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:08:51.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:08:51.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:08:51.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:08:51.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:08:51.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:08:51.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:08:53.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:08:53.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:08:53.486 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:08:53.486 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:08:53.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:08:53.510 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:08:53.511 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:08:53.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:08:53.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:08:53.512 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:08:53.512 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:08:53.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:08:53.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-04T01:08:53.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:08:53.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-04T01:08:53.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:08:53.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T01:08:53.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:08:53.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T01:08:53.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:08:53.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:08:53.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:08:53.848 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:08:53.919 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:08:26
2026-06-04T01:08:53.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87530, datetime.datetime(2026, 6, 4, 1, 8, 26), datetime.datetime(2026, 6, 4, 1, 8, 25), 'salt', 1.63, 100.31, None, 46.04, 119.34, -0.05, 821.29, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:08:53.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:08:53.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-04T01:08:53.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:08:25, diff=28.927389s, valid=True
2026-06-04T01:08:53.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:08:53.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T01:08:53.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:08:12, diff=41.930919s, valid=True
2026-06-04T01:08:53.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:08:53.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-04T01:08:53.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:08:23, diff=30.939041s, valid=True
2026-06-04T01:08:53.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:08:53.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:08:53.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:08:53.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:08:53.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:08:53.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T01:08:53.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:08:12, diff=41.942782s, valid=True
2026-06-04T01:08:53.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:08:53.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:08:53.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:08:53.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102330.943594s, valid=True
2026-06-04T01:08:53.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:08:53.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:08:53.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:08:53.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:08:53.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:08:54.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:08:54.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:08:54.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:08:54.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:08:54.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:08:54.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:08:54.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:08:54.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:08:54.265 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:08:54.471 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:08:54.812 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:08:54.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:08:54.914 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:08:54.914 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:08:55.090 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:08:55.090 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:09:25.096 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:09:25.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:09:25.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:09:25.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:09:25.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:09:25.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:09:25.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:09:25.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:09:25.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:09:25.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:09:25.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:09:25.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:09:25.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:09:27.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:09:27.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:09:27.929 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:09:27.930 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:09:27.939 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:09:27.952 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:09:27.952 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:09:27.953 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:09:27.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:09:27.953 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:09:27.954 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:09:27.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:09:28.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:09:28.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:09:28.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:09:28.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:09:28.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:09:28.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:09:28.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:09:28.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:09:28.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:09:28.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:09:28.302 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:09:28.373 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:09:27
2026-06-04T01:09:28.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87532, datetime.datetime(2026, 6, 4, 1, 9, 27), datetime.datetime(2026, 6, 4, 1, 9, 26), 'salt', 1.6, 100.34, None, 46.93, 122.37, -0.05, 821.29, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:09:28.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:09:28.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:09:28.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:09:26, diff=2.380934s, valid=True
2026-06-04T01:09:28.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:09:28.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:09:28.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:09:12, diff=16.384421s, valid=True
2026-06-04T01:09:28.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:09:28.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:09:28.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:09:25, diff=3.392543s, valid=True
2026-06-04T01:09:28.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:09:28.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:09:28.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:09:28.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:09:28.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:09:28.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:09:28.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:09:12, diff=16.396279s, valid=True
2026-06-04T01:09:28.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:09:28.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:09:28.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:09:28.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102365.397089s, valid=True
2026-06-04T01:09:28.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:09:28.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:09:28.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:09:28.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:09:28.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:09:28.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:09:28.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:09:28.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:09:28.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:09:28.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:09:28.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:09:28.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:09:28.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:09:28.717 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:09:28.924 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:09:29.267 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:09:29.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:09:29.369 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:09:29.369 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:09:29.554 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:09:29.555 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:09:59.569 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:09:59.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:09:59.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:10:00.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:10:00.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:10:00.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:10:00.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:10:00.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:10:00.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:10:00.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:10:00.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:10:00.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:10:00.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:10:02.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:10:02.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:10:02.762 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:10:02.763 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:10:02.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:10:02.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:10:02.785 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:10:02.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:10:02.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:10:02.787 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:10:02.787 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:10:02.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:10:02.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:10:02.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:10:03.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:10:03.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:10:03.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:10:03.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:10:03.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:10:03.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:10:03.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:10:03.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:10:03.118 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:10:03.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:09:57
2026-06-04T01:10:03.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87533, datetime.datetime(2026, 6, 4, 1, 9, 57), datetime.datetime(2026, 6, 4, 1, 9, 56), 'salt', 1.57, 100.24, None, 39.45, 122.54, -0.03, 821.17, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:10:03.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:10:03.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:10:03.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:09:56, diff=7.194226s, valid=True
2026-06-04T01:10:03.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:10:03.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:10:03.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:10:12, diff=-8.80277s, valid=True
2026-06-04T01:10:03.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:10:03.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:10:03.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:09:53, diff=10.203907s, valid=True
2026-06-04T01:10:03.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:10:03.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:10:03.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:10:03.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:10:03.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:10:03.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:10:03.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:10:12, diff=-8.793014s, valid=True
2026-06-04T01:10:03.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:10:03.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:10:03.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:10:03.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102400.207663s, valid=True
2026-06-04T01:10:03.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:10:03.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:10:03.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:10:03.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:10:03.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:10:03.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:10:03.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:10:03.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:10:03.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:10:03.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:10:03.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:10:03.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:10:03.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:10:03.521 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:10:03.787 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:10:04.125 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:10:04.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:10:04.228 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:10:04.228 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:10:04.314 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:10:04.314 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:10:34.320 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:10:34.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:10:34.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:10:34.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:10:34.483 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:10:34.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:10:34.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:10:34.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:10:34.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:10:34.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:10:34.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:10:34.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:10:34.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:10:37.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:10:37.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:10:37.160 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:10:37.160 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:10:37.170 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:10:37.183 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:10:37.184 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:10:37.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:10:37.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:10:37.185 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:10:37.185 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:10:37.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:10:37.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:10:37.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:10:37.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:10:37.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:10:37.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:10:37.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:10:37.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:10:37.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:10:37.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:10:37.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:10:37.522 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:10:37.593 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:10:27
2026-06-04T01:10:37.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87534, datetime.datetime(2026, 6, 4, 1, 10, 27), datetime.datetime(2026, 6, 4, 1, 10, 26), 'salt', 1.7, 100.38, None, 47.0, 123.92, -0.05, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:10:37.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:10:37.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:10:37.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:10:26, diff=11.601135s, valid=True
2026-06-04T01:10:37.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:10:37.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:10:37.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:10:12, diff=25.604642s, valid=True
2026-06-04T01:10:37.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:10:37.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:10:37.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:10:24, diff=13.612753s, valid=True
2026-06-04T01:10:37.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:10:37.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:10:37.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:10:37.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:10:37.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:10:37.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:10:37.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:10:12, diff=25.616469s, valid=True
2026-06-04T01:10:37.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:10:37.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:10:37.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:10:37.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102434.6173s, valid=True
2026-06-04T01:10:37.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:10:37.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:10:37.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:10:37.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:10:37.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:10:37.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:10:37.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:10:37.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:10:37.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:10:37.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:10:37.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:10:37.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:10:37.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:10:37.939 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:10:38.148 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:10:38.514 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:10:38.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:10:38.637 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:10:38.637 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:10:38.854 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:10:38.854 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:11:08.855 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:11:08.856 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:11:08.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:11:09.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:11:09.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:11:09.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:11:09.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:11:09.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:11:09.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:11:09.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:11:09.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:11:09.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:11:09.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:11:11.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:11:11.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:11:11.738 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:11:11.738 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:11:11.751 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:11:11.764 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:11:11.764 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:11:11.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:11:11.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:11:11.766 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:11:11.766 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:11:11.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:11:11.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:11:11.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:11:12.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:11:12.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:11:12.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:11:12.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:11:12.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:11:12.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:11:12.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:11:12.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:11:12.099 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:11:12.169 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:10:57
2026-06-04T01:11:12.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87535, datetime.datetime(2026, 6, 4, 1, 10, 57), datetime.datetime(2026, 6, 4, 1, 10, 57), 'salt', 1.63, 100.34, None, 51.34, 120.8, -0.05, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:11:12.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:11:12.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:11:12.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:10:57, diff=15.175631s, valid=True
2026-06-04T01:11:12.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:11:12.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:11:12.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:11:12, diff=0.17851s, valid=True
2026-06-04T01:11:12.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:11:12.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:11:12.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:10:54, diff=18.185279s, valid=True
2026-06-04T01:11:12.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:11:12.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:11:12.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:11:12.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:11:12.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:11:12.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:11:12.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:11:12, diff=0.188461s, valid=True
2026-06-04T01:11:12.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:11:12.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:11:12.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:11:12.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102469.189132s, valid=True
2026-06-04T01:11:12.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:11:12.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:11:12.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:11:12.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:11:12.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:11:12.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:11:12.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:11:12.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:11:12.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:11:12.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:11:12.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:11:12.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:11:12.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:11:12.586 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:11:12.818 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:11:13.162 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:11:13.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:11:13.264 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:11:13.264 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:11:13.485 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:11:13.485 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:11:43.515 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:11:43.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:11:43.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:11:43.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:11:43.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:11:44.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:11:44.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:11:44.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:11:44.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:11:44.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:11:44.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:11:44.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:11:44.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:11:46.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:11:46.599 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:11:46.600 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:11:46.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:11:46.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:11:46.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:11:46.622 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:11:46.622 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:11:46.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:11:46.623 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:11:46.623 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:11:46.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:11:46.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:11:46.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:11:46.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:11:46.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:11:46.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:11:46.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:11:46.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:11:46.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:11:46.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:11:46.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:11:46.909 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:11:46.980 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:11:28
2026-06-04T01:11:46.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87536, datetime.datetime(2026, 6, 4, 1, 11, 28), datetime.datetime(2026, 6, 4, 1, 11, 27), 'salt', 1.57, 100.31, None, 48.23, 128.03, -0.04, 821.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:11:46.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:11:46.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:11:46.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:11:27, diff=19.988116s, valid=True
2026-06-04T01:11:46.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:11:46.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:11:46.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:11:12, diff=34.991454s, valid=True
2026-06-04T01:11:46.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:11:46.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:11:46.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:11:24, diff=22.999305s, valid=True
2026-06-04T01:11:46.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:11:46.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:11:46.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:11:46.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:11:46.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:11:46.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:11:47.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:11:12, diff=35.00282s, valid=True
2026-06-04T01:11:47.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:11:47.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:11:47.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:11:47.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102504.003572s, valid=True
2026-06-04T01:11:47.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:11:47.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:11:47.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:11:47.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:11:47.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:11:47.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:11:47.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:11:47.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:11:47.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:11:47.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:11:47.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:11:47.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:11:47.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:11:47.323 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:11:47.529 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:11:47.871 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:11:47.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:11:47.974 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:11:47.974 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:11:48.153 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:11:48.153 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:12:18.161 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:12:18.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:12:18.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:12:18.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:12:18.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:12:18.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:12:18.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:12:18.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:12:18.726 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:12:18.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:12:18.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:12:18.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:12:18.746 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:12:21.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:12:21.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:12:21.147 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:12:21.147 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:12:21.156 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:12:21.168 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:12:21.168 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:12:21.168 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:12:21.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:12:21.168 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:12:21.168 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:12:21.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:12:21.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:12:21.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:12:21.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:12:21.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:12:21.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:12:21.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:12:21.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:12:21.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:12:21.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:12:21.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:12:21.460 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:12:21.531 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:11:58
2026-06-04T01:12:21.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87537, datetime.datetime(2026, 6, 4, 1, 11, 58), datetime.datetime(2026, 6, 4, 1, 11, 57), 'salt', 1.57, 100.34, None, 49.54, 129.68, -0.05, 821.29, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:12:21.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:12:21.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:12:21.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:11:57, diff=24.538244s, valid=True
2026-06-04T01:12:21.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:12:21.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:12:21.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:12:12, diff=9.541513s, valid=True
2026-06-04T01:12:21.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:12:21.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:12:21.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:11:54, diff=27.549211s, valid=True
2026-06-04T01:12:21.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:12:21.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:12:21.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:12:21.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:12:21.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:12:21.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:12:21.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:12:12, diff=9.5527s, valid=True
2026-06-04T01:12:21.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:12:21.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:12:21.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:12:21.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102538.553459s, valid=True
2026-06-04T01:12:21.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:12:21.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:12:21.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:12:21.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:12:21.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:12:21.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:12:21.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:12:21.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:12:21.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:12:21.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:12:21.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:12:21.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:12:21.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:12:21.942 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:12:22.147 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:12:22.489 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:12:22.591 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:12:22.591 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:12:22.591 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:12:22.780 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:12:22.780 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:12:52.810 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:12:52.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:12:52.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:12:52.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:12:53.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:12:53.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:12:53.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:12:53.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:12:53.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:12:53.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:12:53.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:12:53.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:12:53.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:12:55.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:12:55.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:12:55.666 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:12:55.666 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:12:55.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:12:55.686 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:12:55.686 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:12:55.686 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:12:55.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:12:55.686 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:12:55.686 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:12:55.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:12:55.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from salt
2026-06-04T01:12:55.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:12:55.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1427 rows from monet
2026-06-04T01:12:55.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:12:55.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T01:12:55.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:12:56.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T01:12:56.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:12:56.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:12:56.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:12:56.019 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:12:56.091 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:12:28
2026-06-04T01:12:56.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87538, datetime.datetime(2026, 6, 4, 1, 12, 28), datetime.datetime(2026, 6, 4, 1, 12, 27), 'salt', 1.67, 100.34, None, 54.79, 125.9, -0.05, 821.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:12:56.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:12:56.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 10 fields
2026-06-04T01:12:56.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:12:27, diff=29.098328s, valid=True
2026-06-04T01:12:56.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:12:56.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T01:12:56.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:12:12, diff=44.101725s, valid=True
2026-06-04T01:12:56.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:12:56.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1427 rows. Structure expected: 11 fields
2026-06-04T01:12:56.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:12:25, diff=31.109603s, valid=True
2026-06-04T01:12:56.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:12:56.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:12:56.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:12:56.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:12:56.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:12:56.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T01:12:56.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:12:12, diff=44.113207s, valid=True
2026-06-04T01:12:56.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:12:56.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:12:56.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:12:56.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102573.113984s, valid=True
2026-06-04T01:12:56.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:12:56.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:12:56.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:12:56.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:12:56.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:12:56.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:12:56.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:12:56.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:12:56.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:12:56.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:12:56.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:12:56.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:12:56.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:12:56.432 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:12:56.640 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:12:56.980 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:12:57.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:12:57.083 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:12:57.083 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:12:57.333 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:12:57.333 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:13:27.358 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:13:27.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:13:27.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:13:27.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:13:27.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:13:28.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:13:28.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:13:28.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:13:28.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:13:28.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:13:28.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:13:28.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:13:28.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:13:30.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:13:30.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:13:30.545 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:13:30.545 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:13:30.555 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:13:30.568 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:13:30.568 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:13:30.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:13:30.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:13:30.569 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:13:30.570 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:13:30.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:13:30.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:13:30.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:13:30.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:13:30.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:13:30.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:13:30.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:13:30.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:13:30.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:13:30.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:13:30.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:13:30.901 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:13:30.970 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:13:29
2026-06-04T01:13:30.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87540, datetime.datetime(2026, 6, 4, 1, 13, 29), datetime.datetime(2026, 6, 4, 1, 13, 28), 'salt', 1.63, 100.34, None, 55.22, 114.71, -0.05, 821.29, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:13:30.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:13:30.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:13:30.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:13:28, diff=2.978038s, valid=True
2026-06-04T01:13:30.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:13:30.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:13:30.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:13:12, diff=18.981411s, valid=True
2026-06-04T01:13:30.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:13:30.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:13:30.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:13:25, diff=5.989381s, valid=True
2026-06-04T01:13:30.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:13:30.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:13:30.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:13:30.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:13:30.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:13:30.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:13:30.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:13:12, diff=18.993177s, valid=True
2026-06-04T01:13:30.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:13:30.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:13:30.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:13:30.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102607.993977s, valid=True
2026-06-04T01:13:30.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:13:30.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:13:30.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:13:30.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:13:30.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:13:31.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:13:31.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:13:31.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:13:31.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:13:31.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:13:31.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:13:31.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:13:31.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:13:31.382 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:13:31.587 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:13:31.932 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:13:32.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:13:32.035 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:13:32.035 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:13:32.187 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:13:32.188 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:14:02.218 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:14:02.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:14:02.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:14:02.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:14:02.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:14:02.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:14:02.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:14:02.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:14:02.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:14:02.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:14:02.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:14:02.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:14:02.806 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:14:05.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:14:05.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:14:05.112 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:14:05.112 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:14:05.124 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:14:05.136 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:14:05.137 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:14:05.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:14:05.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:14:05.138 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:14:05.138 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:14:05.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:14:05.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:14:05.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:14:05.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:14:05.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:14:05.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:14:05.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:14:05.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:14:05.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:14:05.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:14:05.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:14:05.471 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:14:05.553 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:13:59
2026-06-04T01:14:05.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87541, datetime.datetime(2026, 6, 4, 1, 13, 59), datetime.datetime(2026, 6, 4, 1, 13, 58), 'salt', 1.7, 100.41, None, 49.68, 139.43, -0.06, 821.35, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:14:05.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:14:05.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:14:05.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:13:58, diff=7.561373s, valid=True
2026-06-04T01:14:05.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:14:05.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:14:05.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:14:12, diff=-6.435085s, valid=True
2026-06-04T01:14:05.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:14:05.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:14:05.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:13:55, diff=10.573087s, valid=True
2026-06-04T01:14:05.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:14:05.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:14:05.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:14:05.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:14:05.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:14:05.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:14:05.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:14:12, diff=-6.423182s, valid=True
2026-06-04T01:14:05.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:14:05.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:14:05.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:14:05.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102642.577656s, valid=True
2026-06-04T01:14:05.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:14:05.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:14:05.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:14:05.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:14:05.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:14:05.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:14:05.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:14:05.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:14:05.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:14:05.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:14:05.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:14:05.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:14:05.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:14:05.921 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:14:06.139 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:14:06.491 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:14:06.595 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:14:06.595 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:14:06.595 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:14:06.747 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:14:06.747 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:14:36.766 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:14:36.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:14:36.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:14:37.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:14:37.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:14:37.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:14:37.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:14:37.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:14:37.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:14:37.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:14:37.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:14:37.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:14:37.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:14:39.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:14:39.949 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:14:39.950 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:14:39.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:14:39.958 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:14:39.969 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:14:39.970 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:14:39.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:14:39.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:14:39.970 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:14:39.970 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:14:39.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:14:40.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:14:40.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:14:40.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:14:40.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:14:40.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:14:40.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:14:40.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:14:40.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:14:40.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:14:40.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:14:40.255 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:14:40.333 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:14:29
2026-06-04T01:14:40.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87542, datetime.datetime(2026, 6, 4, 1, 14, 29), datetime.datetime(2026, 6, 4, 1, 14, 28), 'salt', 1.6, 100.31, None, 48.13, 118.43, -0.04, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:14:40.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:14:40.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:14:40.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:14:28, diff=12.340696s, valid=True
2026-06-04T01:14:40.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:14:40.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:14:40.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:14:12, diff=28.343873s, valid=True
2026-06-04T01:14:40.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:14:40.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:14:40.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:14:25, diff=15.351452s, valid=True
2026-06-04T01:14:40.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:14:40.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:14:40.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:14:40.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:14:40.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:14:40.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:14:40.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:14:12, diff=28.354903s, valid=True
2026-06-04T01:14:40.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:14:40.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:14:40.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:14:40.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102677.355642s, valid=True
2026-06-04T01:14:40.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:14:40.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:14:40.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:14:40.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:14:40.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:14:40.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:14:40.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:14:40.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:14:40.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:14:40.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:14:40.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:14:40.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:14:40.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:14:40.674 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:14:40.879 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:14:41.221 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:14:41.322 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:14:41.322 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:14:41.322 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:14:41.514 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:14:41.514 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:15:11.544 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:15:11.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:15:11.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:15:11.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:15:11.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:15:11.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:15:11.926 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:15:11.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:15:11.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:15:11.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:15:11.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:15:11.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:15:11.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:15:14.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:15:14.393 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:15:14.393 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:15:14.394 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:15:14.404 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:15:14.416 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:15:14.417 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:15:14.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:15:14.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:15:14.418 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:15:14.418 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:15:14.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:15:14.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:15:14.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:15:14.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:15:14.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:15:14.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:15:14.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:15:14.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:15:14.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:15:14.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:15:14.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:15:14.746 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:15:14.817 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:15:00
2026-06-04T01:15:14.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87543, datetime.datetime(2026, 6, 4, 1, 15), datetime.datetime(2026, 6, 4, 1, 14, 59), 'salt', 1.53, 100.28, None, 51.44, 126.58, -0.04, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:15:14.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:15:14.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:15:14.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:14:59, diff=15.824239s, valid=True
2026-06-04T01:15:14.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:15:14.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:15:14.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:15:12, diff=2.827651s, valid=True
2026-06-04T01:15:14.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:15:14.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:15:14.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:14:56, diff=18.835561s, valid=True
2026-06-04T01:15:14.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:15:14.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:15:14.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:15:14.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:15:14.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:15:14.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:15:14.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:15:12, diff=2.839164s, valid=True
2026-06-04T01:15:14.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:15:14.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:15:14.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:15:14.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102711.839946s, valid=True
2026-06-04T01:15:14.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:15:14.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:15:14.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:15:14.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:15:14.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:15:14.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:15:14.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:15:14.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:15:14.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:15:14.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:15:15.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:15:15.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:15:15.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:15:15.158 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:15:15.423 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:15:15.761 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:15:15.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:15:15.864 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:15:15.864 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:15:16.045 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:15:16.045 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:15:46.054 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:15:46.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:15:46.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:15:46.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:15:46.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:15:46.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:15:46.618 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:15:46.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:15:46.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:15:46.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:15:46.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:15:46.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:15:46.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:15:49.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:15:49.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:15:49.349 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:15:49.349 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:15:49.360 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:15:49.374 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:15:49.374 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:15:49.375 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:15:49.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:15:49.376 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:15:49.376 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:15:49.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:15:49.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:15:49.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:15:49.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:15:49.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:15:49.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:15:49.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:15:49.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:15:49.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:15:49.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:15:49.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:15:49.708 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:15:49.780 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:15:30
2026-06-04T01:15:49.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87544, datetime.datetime(2026, 6, 4, 1, 15, 30), datetime.datetime(2026, 6, 4, 1, 15, 29), 'salt', 1.67, 100.31, None, 52.04, 125.8, -0.04, 821.54, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:15:49.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:15:49.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:15:49.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:15:29, diff=20.787689s, valid=True
2026-06-04T01:15:49.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:15:49.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:15:49.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:15:12, diff=37.79122s, valid=True
2026-06-04T01:15:49.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:15:49.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:15:49.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:15:26, diff=23.799474s, valid=True
2026-06-04T01:15:49.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:15:49.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:15:49.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:15:49.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:15:49.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:15:49.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:15:49.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:15:12, diff=37.803263s, valid=True
2026-06-04T01:15:49.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:15:49.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:15:49.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:15:49.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102746.804091s, valid=True
2026-06-04T01:15:49.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:15:49.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:15:49.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:15:49.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:15:49.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:15:49.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:15:49.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:15:49.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:15:49.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:15:49.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:15:50.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:15:50.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:15:50.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:15:50.155 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:15:50.360 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:15:50.702 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:15:50.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:15:50.804 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:15:50.804 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:15:50.980 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:15:50.980 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:16:21.001 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:16:21.002 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:16:21.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:16:21.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:16:21.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:16:21.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:16:21.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:16:21.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:16:21.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:16:21.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:16:21.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:16:21.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:16:21.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:16:24.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:16:24.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:16:24.048 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:16:24.049 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:16:24.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:16:24.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:16:24.073 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:16:24.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:16:24.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:16:24.074 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:16:24.075 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:16:24.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:16:24.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:16:24.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:16:24.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:16:24.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:16:24.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:16:24.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:16:24.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:16:24.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:16:24.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:16:24.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:16:24.413 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:16:24.485 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:16:00
2026-06-04T01:16:24.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87545, datetime.datetime(2026, 6, 4, 1, 16), datetime.datetime(2026, 6, 4, 1, 15, 59), 'salt', 1.63, 100.31, None, 55.39, 114.13, -0.05, 821.29, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:16:24.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:16:24.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:16:24.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:15:59, diff=25.492941s, valid=True
2026-06-04T01:16:24.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:16:24.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:16:24.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:16:12, diff=12.496428s, valid=True
2026-06-04T01:16:24.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:16:24.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:16:24.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:15:56, diff=28.504758s, valid=True
2026-06-04T01:16:24.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:16:24.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:16:24.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:16:24.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:16:24.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:16:24.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:16:24.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:16:12, diff=12.508478s, valid=True
2026-06-04T01:16:24.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:16:24.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:16:24.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:16:24.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102781.5093s, valid=True
2026-06-04T01:16:24.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:16:24.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:16:24.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:16:24.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:16:24.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:16:24.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:16:24.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:16:24.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:16:24.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:16:24.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:16:24.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:16:24.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:16:24.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:16:24.925 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:16:25.131 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:16:25.472 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:16:25.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:16:25.573 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:16:25.573 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:16:25.730 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:16:25.730 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:16:55.761 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:16:55.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:16:55.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:16:56.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:16:56.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:16:56.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:16:56.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:16:56.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:16:56.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:16:56.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:16:56.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:16:56.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:16:56.525 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:16:59.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:16:59.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:16:59.372 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:16:59.372 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:16:59.383 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:16:59.396 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:16:59.396 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:16:59.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:16:59.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:16:59.397 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:16:59.398 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:16:59.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:16:59.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:16:59.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:16:59.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:16:59.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:16:59.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T01:16:59.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:16:59.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T01:16:59.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:16:59.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:16:59.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:16:59.732 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:16:59.803 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:16:30
2026-06-04T01:16:59.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87546, datetime.datetime(2026, 6, 4, 1, 16, 30), datetime.datetime(2026, 6, 4, 1, 16, 29), 'salt', 1.6, 100.34, None, 54.33, 119.67, -0.05, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:16:59.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:16:59.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:16:59.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:16:29, diff=30.810312s, valid=True
2026-06-04T01:16:59.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:16:59.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T01:16:59.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:16:12, diff=47.813884s, valid=True
2026-06-04T01:16:59.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:16:59.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:16:59.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:16:27, diff=32.822074s, valid=True
2026-06-04T01:16:59.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:16:59.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:16:59.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:16:59.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:16:59.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:16:59.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T01:16:59.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:16:12, diff=47.825834s, valid=True
2026-06-04T01:16:59.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:16:59.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:16:59.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:16:59.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102816.826714s, valid=True
2026-06-04T01:16:59.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:16:59.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:16:59.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:16:59.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:16:59.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:16:59.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:16:59.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:16:59.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:16:59.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:16:59.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:17:00.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:17:00.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:17:00.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:17:00.162 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:17:00.368 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:17:00.711 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:17:00.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:17:00.814 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:17:00.814 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:17:01.018 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:17:01.018 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:17:31.049 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:17:31.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:17:31.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:17:31.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:17:31.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:17:31.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:17:31.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:17:31.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:17:31.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:17:31.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:17:31.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:17:31.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:17:31.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:17:34.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:17:34.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:17:34.292 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:17:34.292 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:17:34.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:17:34.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:17:34.314 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:17:34.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:17:34.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:17:34.316 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:17:34.316 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:17:34.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:17:34.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:17:34.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:17:34.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:17:34.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:17:34.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:17:34.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:17:34.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:17:34.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:17:34.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:17:34.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:17:34.658 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:17:34.733 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:17:31
2026-06-04T01:17:34.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87548, datetime.datetime(2026, 6, 4, 1, 17, 31), datetime.datetime(2026, 6, 4, 1, 17, 30), 'salt', 1.67, 100.38, None, 54.86, 127.21, -0.05, 821.47, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:17:34.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:17:34.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:17:34.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:17:30, diff=4.740346s, valid=True
2026-06-04T01:17:34.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:17:34.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:17:34.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:17:12, diff=22.743743s, valid=True
2026-06-04T01:17:34.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:17:34.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:17:34.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:17:28, diff=6.751712s, valid=True
2026-06-04T01:17:34.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:17:34.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:17:34.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:17:34.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:17:34.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:17:34.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:17:34.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:17:12, diff=22.755325s, valid=True
2026-06-04T01:17:34.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:17:34.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:17:34.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:17:34.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102851.756105s, valid=True
2026-06-04T01:17:34.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:17:34.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:17:34.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:17:34.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:17:34.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:17:34.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:17:34.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:17:34.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:17:34.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:17:34.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:17:35.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:17:35.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:17:35.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:17:35.146 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:17:35.350 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:17:35.692 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:17:35.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:17:35.794 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:17:35.795 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:17:35.981 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:17:35.981 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:18:05.995 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:18:05.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:18:05.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:18:06.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:18:06.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:18:06.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:18:06.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:18:06.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:18:06.792 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:18:06.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:18:06.806 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:18:06.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:18:06.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:18:09.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:18:09.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:18:09.421 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:18:09.422 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:18:09.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:18:09.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:18:09.447 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:18:09.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:18:09.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:18:09.448 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:18:09.448 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:18:09.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:18:09.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:18:09.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:18:09.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:18:09.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:18:09.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:18:09.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:18:09.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:18:09.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:18:09.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:18:09.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:18:09.779 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:18:09.850 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:18:01
2026-06-04T01:18:09.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87549, datetime.datetime(2026, 6, 4, 1, 18, 1), datetime.datetime(2026, 6, 4, 1, 18), 'salt', 1.67, 100.38, None, 44.24, 112.22, -0.05, 821.35, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:18:09.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:18:09.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:18:09.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:18:00, diff=9.857726s, valid=True
2026-06-04T01:18:09.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:18:09.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:18:09.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:18:12, diff=-2.139297s, valid=True
2026-06-04T01:18:09.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:18:09.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:18:09.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:17:58, diff=11.867799s, valid=True
2026-06-04T01:18:09.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:18:09.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:18:09.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:18:09.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:18:09.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:18:09.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:18:09.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:18:12, diff=-2.127924s, valid=True
2026-06-04T01:18:09.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:18:09.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:18:09.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:18:09.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102886.872993s, valid=True
2026-06-04T01:18:09.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:18:09.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:18:09.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:18:09.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:18:09.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:18:09.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:18:09.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:18:09.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:18:09.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:18:10.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:18:10.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:18:10.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:18:10.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:18:10.209 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:18:10.460 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:18:10.861 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:18:10.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:18:10.964 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:18:10.964 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:18:11.115 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:18:11.115 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:18:41.145 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:18:41.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:18:41.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:18:41.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:18:41.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:18:41.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:18:41.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:18:41.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:18:41.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:18:41.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:18:41.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:18:41.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:18:41.746 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:18:44.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:18:44.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:18:44.156 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:18:44.156 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:18:44.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:18:44.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:18:44.179 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:18:44.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:18:44.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:18:44.180 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:18:44.181 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:18:44.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:18:44.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:18:44.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:18:44.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:18:44.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:18:44.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:18:44.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:18:44.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:18:44.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:18:44.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:18:44.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:18:44.511 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:18:44.583 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:18:31
2026-06-04T01:18:44.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87550, datetime.datetime(2026, 6, 4, 1, 18, 31), datetime.datetime(2026, 6, 4, 1, 18, 31), 'salt', 1.6, 100.31, None, 51.9, 120.73, -0.04, 821.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:18:44.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:18:44.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:18:44.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:18:31, diff=13.591056s, valid=True
2026-06-04T01:18:44.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:18:44.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:18:44.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:18:12, diff=32.594547s, valid=True
2026-06-04T01:18:44.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:18:44.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:18:44.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:18:28, diff=16.602749s, valid=True
2026-06-04T01:18:44.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:18:44.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:18:44.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:18:44.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:18:44.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:18:44.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:18:44.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:18:12, diff=32.606485s, valid=True
2026-06-04T01:18:44.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:18:44.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:18:44.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:18:44.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102921.60731s, valid=True
2026-06-04T01:18:44.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:18:44.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:18:44.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:18:44.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:18:44.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:18:44.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:18:44.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:18:44.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:18:44.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:18:44.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:18:44.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:18:44.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:18:44.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:18:44.994 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:18:45.199 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:18:45.540 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:18:45.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:18:45.642 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:18:45.642 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:18:45.893 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:18:45.893 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:19:15.923 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:19:15.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:19:15.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:19:16.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:19:16.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:19:16.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:19:16.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:19:16.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:19:16.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:19:16.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:19:16.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:19:16.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:19:16.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:19:18.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:19:18.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:19:18.764 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:19:18.764 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:19:18.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:19:18.789 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:19:18.789 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:19:18.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:19:18.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:19:18.791 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:19:18.791 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:19:18.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:19:18.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:19:18.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:19:19.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:19:19.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:19:19.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T01:19:19.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:19:19.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T01:19:19.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:19:19.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:19:19.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:19:19.161 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:19:19.245 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:19:02
2026-06-04T01:19:19.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87551, datetime.datetime(2026, 6, 4, 1, 19, 2), datetime.datetime(2026, 6, 4, 1, 19, 1), 'salt', 1.7, 100.44, None, 46.26, 120.92, -0.06, 821.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:19:19.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:19:19.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:19:19.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:19:01, diff=18.252906s, valid=True
2026-06-04T01:19:19.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:19:19.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T01:19:19.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:18:12, diff=67.256558s, valid=True
2026-06-04T01:19:19.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:19:19.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:19:19.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:18:58, diff=21.265059s, valid=True
2026-06-04T01:19:19.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:19:19.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:19:19.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:19:19.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:19:19.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:19:19.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T01:19:19.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:18:12, diff=67.268966s, valid=True
2026-06-04T01:19:19.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:19:19.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:19:19.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:19:19.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102956.269827s, valid=True
2026-06-04T01:19:19.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:19:19.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:19:19.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:19:19.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:19:19.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:19:19.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:19:19.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:19:19.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:19:19.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:19:19.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:19:19.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:19:19.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:19:19.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:19:19.591 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:19:19.796 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:19:20.160 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:19:20.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:19:20.262 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:19:20.262 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:19:20.418 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:19:20.418 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:19:50.425 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:19:50.426 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:19:50.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:19:50.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:19:50.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:19:51.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:19:51.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:19:51.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:19:51.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:19:51.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:19:51.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:19:51.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:19:51.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:19:53.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:19:53.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:19:53.489 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:19:53.489 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:19:53.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:19:53.510 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:19:53.511 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:19:53.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:19:53.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:19:53.512 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:19:53.512 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:19:53.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:19:53.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:19:53.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:19:53.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:19:53.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:19:53.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T01:19:53.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:19:53.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T01:19:53.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:19:53.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:19:53.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:19:53.841 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:19:53.912 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:19:32
2026-06-04T01:19:53.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87552, datetime.datetime(2026, 6, 4, 1, 19, 32), datetime.datetime(2026, 6, 4, 1, 19, 31), 'salt', 1.57, 100.34, None, 52.61, 126.67, -0.05, 821.11, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:19:53.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:19:53.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:19:53.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:19:31, diff=22.919572s, valid=True
2026-06-04T01:19:53.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:19:53.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T01:19:53.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:18:12, diff=101.923051s, valid=True
2026-06-04T01:19:53.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:19:53.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:19:53.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:19:28, diff=25.93106s, valid=True
2026-06-04T01:19:53.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:19:53.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:19:53.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:19:53.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:19:53.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:19:53.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T01:19:53.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:18:12, diff=101.934778s, valid=True
2026-06-04T01:19:53.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:19:53.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:19:53.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:19:53.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=102990.935573s, valid=True
2026-06-04T01:19:53.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:19:53.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:19:53.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:19:53.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:19:53.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:19:54.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:19:54.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:19:54.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:19:54.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:19:54.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:19:54.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:19:54.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:19:54.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:19:54.253 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:19:54.459 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:19:54.801 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:19:54.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:19:54.903 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:19:54.903 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:19:55.091 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:19:55.091 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:20:25.121 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:20:25.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:20:25.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:20:25.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:20:25.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:20:25.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:20:25.674 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:20:25.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:20:25.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:20:25.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:20:25.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:20:25.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:20:25.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:20:28.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:20:28.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:20:28.129 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:20:28.129 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:20:28.141 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:20:28.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:20:28.155 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:20:28.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:20:28.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:20:28.156 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:20:28.156 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:20:28.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:20:28.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:20:28.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:20:28.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:20:28.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:20:28.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T01:20:28.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:20:28.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T01:20:28.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:20:28.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:20:28.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:20:28.493 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:20:28.564 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:20:02
2026-06-04T01:20:28.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87553, datetime.datetime(2026, 6, 4, 1, 20, 2), datetime.datetime(2026, 6, 4, 1, 20, 1), 'salt', 1.57, 100.44, None, 47.98, 126.98, -0.06, 821.41, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:20:28.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:20:28.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:20:28.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:20:01, diff=27.57228s, valid=True
2026-06-04T01:20:28.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:20:28.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T01:20:28.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:18:12, diff=136.575759s, valid=True
2026-06-04T01:20:28.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:20:28.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:20:28.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:19:59, diff=29.583907s, valid=True
2026-06-04T01:20:28.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:20:28.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:20:28.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:20:28.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:20:28.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:20:28.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T01:20:28.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:18:12, diff=136.587593s, valid=True
2026-06-04T01:20:28.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:20:28.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:20:28.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:20:28.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103025.5884s, valid=True
2026-06-04T01:20:28.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:20:28.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:20:28.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:20:28.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:20:28.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:20:28.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:20:28.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:20:28.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:20:28.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:20:28.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:20:28.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:20:28.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:20:28.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:20:28.910 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:20:29.175 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:20:29.513 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:20:29.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:20:29.617 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:20:29.617 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:20:29.838 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:20:29.838 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:20:59.868 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:20:59.868 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:20:59.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:21:00.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:21:00.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:21:00.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:21:00.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:21:00.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:21:00.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:21:00.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:21:00.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:21:00.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:21:00.587 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:21:02.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:21:03.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:21:03.011 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:21:03.012 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:21:03.023 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:21:03.036 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:21:03.037 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:21:03.037 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:21:03.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:21:03.038 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:21:03.038 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:21:03.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:21:03.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:21:03.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:21:03.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:21:03.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:21:03.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:21:03.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:21:03.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:21:03.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:21:03.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:21:03.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:21:03.380 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:21:03.449 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:21:02
2026-06-04T01:21:03.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87555, datetime.datetime(2026, 6, 4, 1, 21, 2), datetime.datetime(2026, 6, 4, 1, 21, 2), 'salt', 1.67, 100.44, None, 50.74, 127.38, -0.06, 821.41, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:21:03.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:21:03.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:21:03.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:21:02, diff=1.456869s, valid=True
2026-06-04T01:21:03.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:21:03.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:21:03.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:18:12, diff=171.460237s, valid=True
2026-06-04T01:21:03.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:21:03.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:21:03.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:21:00, diff=3.468016s, valid=True
2026-06-04T01:21:03.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:21:03.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:21:03.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:21:03.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:21:03.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:21:03.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:21:03.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:18:12, diff=171.471576s, valid=True
2026-06-04T01:21:03.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:21:03.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:21:03.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:21:03.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103060.472349s, valid=True
2026-06-04T01:21:03.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:21:03.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:21:03.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:21:03.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:21:03.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:21:03.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:21:03.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:21:03.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:21:03.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:21:03.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:21:03.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:21:03.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:21:03.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:21:03.793 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:21:03.998 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:21:04.338 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:21:04.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:21:04.442 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:21:04.442 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:21:04.669 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:21:04.669 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:21:34.671 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:21:34.671 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:21:34.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:21:35.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:21:35.144 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:21:35.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:21:35.387 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:21:35.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:21:35.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:21:35.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:21:35.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:21:35.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:21:35.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:21:37.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:21:37.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:21:37.848 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:21:37.848 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:21:37.856 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:21:37.869 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:21:37.869 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:21:37.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:21:37.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:21:37.869 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:21:37.869 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:21:37.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:21:37.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:21:37.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:21:38.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:21:38.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:21:38.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:21:38.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:21:38.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:21:38.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:21:38.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:21:38.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:21:38.145 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:21:38.220 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:21:33
2026-06-04T01:21:38.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87556, datetime.datetime(2026, 6, 4, 1, 21, 33), datetime.datetime(2026, 6, 4, 1, 21, 32), 'salt', 1.63, 100.44, None, 47.77, 117.49, -0.07, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:21:38.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:21:38.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:21:38.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:21:32, diff=6.230768s, valid=True
2026-06-04T01:21:38.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:21:38.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:21:38.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:18:12, diff=206.235189s, valid=True
2026-06-04T01:21:38.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:21:38.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:21:38.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:21:30, diff=8.242873s, valid=True
2026-06-04T01:21:38.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:21:38.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:21:38.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:21:38.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:21:38.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:21:38.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:21:38.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:18:12, diff=206.246323s, valid=True
2026-06-04T01:21:38.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:21:38.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:21:38.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:21:38.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103095.247076s, valid=True
2026-06-04T01:21:38.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:21:38.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:21:38.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:21:38.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:21:38.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:21:38.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:21:38.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:21:38.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:21:38.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:21:38.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:21:38.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:21:38.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:21:38.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:21:38.657 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:21:38.862 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:21:39.204 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:21:39.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:21:39.306 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:21:39.306 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:21:39.488 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:21:39.489 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:22:09.519 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:22:09.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:22:09.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:22:09.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:22:09.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:22:10.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:22:10.090 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:22:10.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:22:10.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:22:10.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:22:10.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:22:10.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:22:10.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:22:12.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:22:12.608 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:22:12.609 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:22:12.609 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:22:12.619 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:22:12.631 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:22:12.632 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:22:12.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:22:12.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:22:12.633 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:22:12.634 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:22:12.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:22:12.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:22:12.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:22:12.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:22:12.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:22:12.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:22:12.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:22:12.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:22:12.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:22:12.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:22:12.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:22:12.960 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:22:13.031 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:22:03
2026-06-04T01:22:13.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87557, datetime.datetime(2026, 6, 4, 1, 22, 3), datetime.datetime(2026, 6, 4, 1, 22, 2), 'salt', 1.6, 100.38, None, 51.97, 121.95, -0.05, 821.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:22:13.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:22:13.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:22:13.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:22:02, diff=11.03882s, valid=True
2026-06-04T01:22:13.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:22:13.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:22:13.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:18:12, diff=241.042284s, valid=True
2026-06-04T01:22:13.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:22:13.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:22:13.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:22:00, diff=13.050509s, valid=True
2026-06-04T01:22:13.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:22:13.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:22:13.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:22:13.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:22:13.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:22:13.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:22:13.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:18:12, diff=241.054227s, valid=True
2026-06-04T01:22:13.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:22:13.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:22:13.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:22:13.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103130.055045s, valid=True
2026-06-04T01:22:13.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:22:13.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:22:13.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:22:13.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:22:13.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:22:13.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:22:13.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:22:13.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:22:13.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:22:13.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:22:13.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:22:13.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:22:13.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:22:13.374 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:22:13.598 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:22:13.939 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:22:14.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:22:14.043 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:22:14.043 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:22:14.267 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:22:14.267 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:22:44.297 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:22:44.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:22:44.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:22:44.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:22:44.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:22:44.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:22:44.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:22:44.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:22:44.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:22:44.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:22:44.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:22:44.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:22:44.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:22:47.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:22:47.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:22:47.349 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:22:47.350 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:22:47.360 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:22:47.373 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:22:47.373 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:22:47.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:22:47.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:22:47.375 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:22:47.375 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:22:47.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:22:47.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:22:47.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:22:47.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:22:47.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:22:47.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:22:47.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:22:47.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:22:47.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:22:47.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:22:47.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:22:47.703 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:22:47.816 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:22:33
2026-06-04T01:22:47.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87558, datetime.datetime(2026, 6, 4, 1, 22, 33), datetime.datetime(2026, 6, 4, 1, 22, 33), 'salt', 1.63, 100.54, None, 56.98, 125.07, -0.08, 821.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:22:47.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:22:47.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:22:47.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:22:33, diff=14.823652s, valid=True
2026-06-04T01:22:47.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:22:47.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:22:47.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:23:12, diff=-24.172841s, valid=True
2026-06-04T01:22:47.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:22:47.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:22:47.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:22:31, diff=16.835201s, valid=True
2026-06-04T01:22:47.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:22:47.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:22:47.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:22:47.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:22:47.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:22:47.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:22:47.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:23:12, diff=-24.161028s, valid=True
2026-06-04T01:22:47.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:22:47.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:22:47.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:22:47.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103164.839818s, valid=True
2026-06-04T01:22:47.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:22:47.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:22:47.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:22:47.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:22:47.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:22:47.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:22:47.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:22:47.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:22:47.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:22:47.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:22:48.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:22:48.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:22:48.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:22:48.235 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:22:48.440 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:22:48.785 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:22:48.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:22:48.887 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:22:48.887 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:22:49.043 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:22:49.043 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:23:19.073 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:23:19.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:23:19.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:23:19.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:23:19.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:23:19.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:23:19.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:23:19.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:23:19.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:23:19.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:23:19.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:23:19.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:23:19.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:23:22.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:23:22.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:23:22.118 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:23:22.118 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:23:22.130 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:23:22.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:23:22.144 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:23:22.145 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:23:22.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:23:22.146 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:23:22.146 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:23:22.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:23:22.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:23:22.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:23:22.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:23:22.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:23:22.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:23:22.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:23:22.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:23:22.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:23:22.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:23:22.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:23:22.469 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:23:22.539 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:23:03
2026-06-04T01:23:22.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87559, datetime.datetime(2026, 6, 4, 1, 23, 3), datetime.datetime(2026, 6, 4, 1, 23, 3), 'salt', 1.63, 100.44, None, 52.25, 130.73, -0.07, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:23:22.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:23:22.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:23:22.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:23:03, diff=19.546868s, valid=True
2026-06-04T01:23:22.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:23:22.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:23:22.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:23:12, diff=10.550274s, valid=True
2026-06-04T01:23:22.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:23:22.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:23:22.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:23:01, diff=21.558303s, valid=True
2026-06-04T01:23:22.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:23:22.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:23:22.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:23:22.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:23:22.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:23:22.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:23:22.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:23:12, diff=10.561942s, valid=True
2026-06-04T01:23:22.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:23:22.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:23:22.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:23:22.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103199.562739s, valid=True
2026-06-04T01:23:22.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:23:22.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:23:22.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:23:22.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:23:22.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:23:22.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:23:22.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:23:22.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:23:22.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:23:22.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:23:22.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:23:22.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:23:22.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:23:22.881 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:23:23.087 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:23:23.428 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:23:23.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:23:23.530 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:23:23.530 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:23:23.820 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:23:23.820 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:23:53.839 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:23:53.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:23:53.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:23:54.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:23:54.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:23:54.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:23:54.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:23:54.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:23:54.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:23:54.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:23:54.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:23:54.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:23:54.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:23:56.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:23:56.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:23:56.874 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:23:56.874 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:23:56.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:23:56.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:23:56.894 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:23:56.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:23:56.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:23:56.894 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:23:56.894 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:23:56.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:23:56.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:23:56.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:23:57.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:23:57.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:23:57.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:23:57.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:23:57.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:23:57.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:23:57.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:23:57.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:23:57.189 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:23:57.259 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:23:34
2026-06-04T01:23:57.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87560, datetime.datetime(2026, 6, 4, 1, 23, 34), datetime.datetime(2026, 6, 4, 1, 23, 33), 'salt', 1.63, 100.48, None, 41.25, 127.63, -0.07, 821.6, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:23:57.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:23:57.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:23:57.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:23:33, diff=24.266533s, valid=True
2026-06-04T01:23:57.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:23:57.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:23:57.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:24:12, diff=-14.730103s, valid=True
2026-06-04T01:23:57.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:23:57.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:23:57.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:23:31, diff=26.278543s, valid=True
2026-06-04T01:23:57.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:23:57.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:23:57.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:23:57.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:23:57.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:23:57.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:23:57.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:24:12, diff=-14.717862s, valid=True
2026-06-04T01:23:57.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:23:57.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:23:57.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:23:57.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103234.282919s, valid=True
2026-06-04T01:23:57.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:23:57.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:23:57.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:23:57.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:23:57.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:23:57.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:23:57.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:23:57.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:23:57.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:23:57.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:23:57.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:23:57.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:23:57.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:23:57.669 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:23:57.875 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:23:58.219 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:23:58.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:23:58.321 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:23:58.321 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:23:58.515 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:23:58.516 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:24:28.546 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:24:28.546 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:24:28.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:24:28.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:24:28.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:24:29.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:24:29.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:24:29.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:24:29.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:24:29.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:24:29.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:24:29.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:24:29.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:24:31.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:24:31.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:24:31.571 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:24:31.571 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:24:31.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:24:31.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:24:31.595 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:24:31.595 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:24:31.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:24:31.596 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:24:31.596 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:24:31.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:24:31.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:24:31.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:24:31.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:24:31.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:24:31.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:24:31.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:24:31.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:24:31.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:24:31.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:24:31.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:24:31.930 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:24:32.009 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:24:04
2026-06-04T01:24:32.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87561, datetime.datetime(2026, 6, 4, 1, 24, 4), datetime.datetime(2026, 6, 4, 1, 24, 3), 'salt', 1.63, 100.54, None, 46.01, 131.63, -0.08, 821.54, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:24:32.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:24:32.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:24:32.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:24:03, diff=29.017307s, valid=True
2026-06-04T01:24:32.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:24:32.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:24:32.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:24:12, diff=20.020866s, valid=True
2026-06-04T01:24:32.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:24:32.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:24:32.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:24:02, diff=30.029014s, valid=True
2026-06-04T01:24:32.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:24:32.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:24:32.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:24:32.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:24:32.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:24:32.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:24:32.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:24:12, diff=20.0328s, valid=True
2026-06-04T01:24:32.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:24:32.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:24:32.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:24:32.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103269.033617s, valid=True
2026-06-04T01:24:32.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:24:32.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:24:32.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:24:32.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:24:32.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:24:32.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:24:32.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:24:32.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:24:32.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:24:32.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:24:32.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:24:32.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:24:32.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:24:32.376 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:24:32.581 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:24:32.923 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:24:33.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:24:33.025 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:24:33.025 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:24:33.179 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:24:33.179 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:25:03.209 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:25:03.209 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:25:03.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:25:03.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:25:03.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:25:03.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:25:03.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:25:03.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:25:03.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:25:03.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:25:03.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:25:03.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:25:03.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:25:05.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:25:05.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:25:05.987 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:25:05.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:25:05.997 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:25:06.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:25:06.011 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:25:06.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:25:06.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:25:06.012 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:25:06.012 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:25:06.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:25:06.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:25:06.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:25:06.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:25:06.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:25:06.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:25:06.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:25:06.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:25:06.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:25:06.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:25:06.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:25:06.348 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:25:06.432 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:25:04
2026-06-04T01:25:06.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87563, datetime.datetime(2026, 6, 4, 1, 25, 4), datetime.datetime(2026, 6, 4, 1, 25, 4), 'salt', 1.63, 100.61, None, 43.36, 122.54, -0.09, 821.54, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:25:06.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:25:06.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:25:06.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:25:04, diff=2.439951s, valid=True
2026-06-04T01:25:06.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:25:06.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:25:06.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:25:12, diff=-5.556585s, valid=True
2026-06-04T01:25:06.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:25:06.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:25:06.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:25:02, diff=4.451482s, valid=True
2026-06-04T01:25:06.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:25:06.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:25:06.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:25:06.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:25:06.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:25:06.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:25:06.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:25:12, diff=-5.544804s, valid=True
2026-06-04T01:25:06.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:25:06.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:25:06.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:25:06.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103303.45602s, valid=True
2026-06-04T01:25:06.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:25:06.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:25:06.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:25:06.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:25:06.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:25:06.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:25:06.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:25:06.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:25:06.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:25:06.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:25:06.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:25:06.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:25:06.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:25:06.776 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:25:06.982 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:25:07.324 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:25:07.426 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:25:07.427 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:25:07.427 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:25:07.623 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:25:07.623 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:25:37.639 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:25:37.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:25:37.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:25:38.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:25:38.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:25:38.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:25:38.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:25:38.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:25:38.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:25:38.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:25:38.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:25:38.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:25:38.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:25:41.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:25:41.165 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:25:41.166 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:25:41.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:25:41.176 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:25:41.189 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:25:41.190 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:25:41.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:25:41.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:25:41.191 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:25:41.191 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:25:41.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:25:41.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:25:41.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:25:41.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:25:41.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:25:41.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:25:41.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:25:41.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:25:41.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:25:41.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:25:41.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:25:41.525 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:25:41.596 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:25:35
2026-06-04T01:25:41.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87564, datetime.datetime(2026, 6, 4, 1, 25, 35), datetime.datetime(2026, 6, 4, 1, 25, 34), 'salt', 1.63, 100.48, None, 37.19, 108.47, -0.07, 821.29, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:25:41.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:25:41.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:25:41.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:25:34, diff=7.603446s, valid=True
2026-06-04T01:25:41.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:25:41.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:25:41.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:26:12, diff=-30.393174s, valid=True
2026-06-04T01:25:41.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:25:41.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:25:41.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:25:32, diff=9.614759s, valid=True
2026-06-04T01:25:41.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:25:41.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:25:41.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:25:41.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:25:41.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:25:41.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:25:41.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:26:12, diff=-30.38169s, valid=True
2026-06-04T01:25:41.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:25:41.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:25:41.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:25:41.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103338.619218s, valid=True
2026-06-04T01:25:41.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:25:41.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:25:41.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:25:41.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:25:41.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:25:41.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:25:41.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:25:41.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:25:41.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:25:41.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:25:41.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:25:41.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:25:41.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:25:41.938 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:25:42.204 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:25:42.545 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:25:42.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:25:42.649 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:25:42.649 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:25:42.845 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:25:42.845 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:26:12.864 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:26:12.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:26:12.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:26:13.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:26:13.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:26:13.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:26:13.268 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:26:13.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:26:13.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:26:13.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:26:13.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:26:13.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:26:13.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:26:15.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:26:15.600 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:26:15.601 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:26:15.601 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:26:15.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:26:15.625 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:26:15.626 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:26:15.626 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:26:15.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:26:15.627 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:26:15.627 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:26:15.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:26:15.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:26:15.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:26:15.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:26:15.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:26:15.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:26:15.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:26:15.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:26:15.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:26:15.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:26:15.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:26:15.958 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:26:16.042 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:26:05
2026-06-04T01:26:16.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87565, datetime.datetime(2026, 6, 4, 1, 26, 5), datetime.datetime(2026, 6, 4, 1, 26, 4), 'salt', 1.6, 100.28, None, 38.53, 114.64, -0.04, 821.29, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:26:16.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:26:16.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:26:16.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:26:04, diff=12.049919s, valid=True
2026-06-04T01:26:16.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:26:16.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:26:16.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:26:12, diff=4.053404s, valid=True
2026-06-04T01:26:16.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:26:16.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:26:16.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:26:03, diff=13.061665s, valid=True
2026-06-04T01:26:16.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:26:16.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:26:16.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:26:16.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:26:16.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:26:16.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:26:16.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:26:12, diff=4.065377s, valid=True
2026-06-04T01:26:16.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:26:16.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:26:16.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:26:16.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103373.066191s, valid=True
2026-06-04T01:26:16.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:26:16.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:26:16.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:26:16.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:26:16.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:26:16.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:26:16.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:26:16.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:26:16.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:26:16.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:26:16.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:26:16.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:26:16.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:26:16.387 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:26:16.592 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:26:16.937 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:26:17.042 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:26:17.042 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:26:17.042 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:26:18.818 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:26:18.819 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:26:48.842 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:26:48.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:26:48.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:26:49.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:26:49.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:26:49.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:26:49.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:26:49.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:26:49.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:26:49.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:26:49.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:26:49.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:26:49.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:26:52.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:26:52.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:26:52.394 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:26:52.395 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:26:52.404 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:26:52.416 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:26:52.417 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:26:52.418 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:26:52.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:26:52.418 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:26:52.418 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:26:52.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:26:52.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:26:52.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:26:52.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:26:52.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:26:52.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:26:52.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:26:52.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:26:52.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:26:52.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:26:52.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:26:52.752 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:26:52.824 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:26:35
2026-06-04T01:26:52.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87566, datetime.datetime(2026, 6, 4, 1, 26, 35), datetime.datetime(2026, 6, 4, 1, 26, 34), 'salt', 1.57, 100.24, None, 48.48, 125.1, -0.03, 821.54, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:26:52.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:26:52.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:26:52.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:26:34, diff=18.832098s, valid=True
2026-06-04T01:26:52.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:26:52.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:26:52.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:27:12, diff=-19.164436s, valid=True
2026-06-04T01:26:52.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:26:52.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:26:52.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:26:33, diff=19.843723s, valid=True
2026-06-04T01:26:52.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:26:52.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:26:52.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:26:52.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:26:52.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:26:52.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:26:52.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:27:12, diff=-19.152532s, valid=True
2026-06-04T01:26:52.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:26:52.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:26:52.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:26:52.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103409.848306s, valid=True
2026-06-04T01:26:52.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:26:52.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:26:52.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:26:52.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:26:52.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:26:52.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:26:52.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:26:52.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:26:52.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:26:52.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:26:53.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:26:53.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:26:53.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:26:53.244 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:26:53.449 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:26:53.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:26:53.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:26:53.891 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:26:53.891 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:26:54.080 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:26:54.080 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:27:24.111 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:27:24.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:27:24.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:27:24.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:27:24.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:27:24.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:27:24.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:27:24.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:27:24.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:27:24.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:27:24.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:27:24.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:27:24.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:27:27.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:27:27.289 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:27:27.290 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:27:27.290 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:27:27.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:27:27.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:27:27.316 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:27:27.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:27:27.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:27:27.317 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:27:27.317 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:27:27.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:27:27.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:27:27.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:27:27.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:27:27.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:27:27.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:27:27.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:27:27.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:27:27.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:27:27.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:27:27.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:27:27.650 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:27:27.729 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:27:06
2026-06-04T01:27:27.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87567, datetime.datetime(2026, 6, 4, 1, 27, 6), datetime.datetime(2026, 6, 4, 1, 27, 5), 'salt', 1.63, 100.38, None, 40.33, 118.4, -0.06, 821.35, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:27:27.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:27:27.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:27:27.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:27:05, diff=22.73688s, valid=True
2026-06-04T01:27:27.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:27:27.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:27:27.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:27:12, diff=15.740584s, valid=True
2026-06-04T01:27:27.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:27:27.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:27:27.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:27:03, diff=24.748984s, valid=True
2026-06-04T01:27:27.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:27:27.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:27:27.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:27:27.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:27:27.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:27:27.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:27:27.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:27:12, diff=15.752733s, valid=True
2026-06-04T01:27:27.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:27:27.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:27:27.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:27:27.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103444.753531s, valid=True
2026-06-04T01:27:27.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:27:27.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:27:27.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:27:27.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:27:27.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:27:27.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:27:27.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:27:27.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:27:27.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:27:27.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:27:27.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:27:27.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:27:28.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:27:28.074 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:27:28.280 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:27:28.623 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:27:28.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:27:28.727 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:27:28.727 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:27:28.809 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:27:28.809 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:27:58.834 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:27:58.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:27:58.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:27:58.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:27:58.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:27:59.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:27:59.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:27:59.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:27:59.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:27:59.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:27:59.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:27:59.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:27:59.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:28:01.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:28:01.671 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:28:01.672 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:28:01.672 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:28:01.683 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:28:01.696 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:28:01.696 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:28:01.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:28:01.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:28:01.698 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:28:01.698 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:28:01.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:28:01.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:28:01.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:28:01.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:28:01.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:28:01.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:28:01.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:28:02.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:28:02.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:28:02.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:28:02.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:28:02.028 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:28:02.105 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:27:36
2026-06-04T01:28:02.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87568, datetime.datetime(2026, 6, 4, 1, 27, 36), datetime.datetime(2026, 6, 4, 1, 27, 35), 'salt', 1.6, 100.31, None, 44.6, 117.39, -0.04, 821.41, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:28:02.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:28:02.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:28:02.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:27:35, diff=27.112335s, valid=True
2026-06-04T01:28:02.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:28:02.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:28:02.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:28:12, diff=-9.884498s, valid=True
2026-06-04T01:28:02.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:28:02.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:28:02.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:27:33, diff=29.122494s, valid=True
2026-06-04T01:28:02.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:28:02.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:28:02.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:28:02.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:28:02.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:28:02.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:28:02.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:28:12, diff=-9.874346s, valid=True
2026-06-04T01:28:02.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:28:02.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:28:02.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:28:02.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103479.126301s, valid=True
2026-06-04T01:28:02.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:28:02.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:28:02.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:28:02.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:28:02.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:28:02.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:28:02.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:28:02.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:28:02.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:28:02.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:28:02.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:28:02.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:28:02.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:28:02.508 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:28:02.714 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:28:03.061 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:28:03.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:28:03.163 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:28:03.163 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:28:03.430 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:28:03.430 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:28:33.438 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:28:33.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:28:33.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:28:33.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:28:33.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:28:33.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:28:33.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:28:33.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:28:33.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:28:33.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:28:33.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:28:33.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:28:33.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:28:36.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:28:36.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:28:36.218 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:28:36.218 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:28:36.227 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:28:36.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:28:36.240 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:28:36.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:28:36.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:28:36.242 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:28:36.242 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:28:36.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:28:36.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:28:36.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:28:36.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:28:36.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:28:36.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:28:36.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:28:36.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:28:36.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:28:36.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:28:36.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:28:36.569 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:28:36.638 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:28:06
2026-06-04T01:28:36.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87569, datetime.datetime(2026, 6, 4, 1, 28, 6), datetime.datetime(2026, 6, 4, 1, 28, 5), 'salt', 1.5, 100.28, None, 54.51, 125.66, -0.04, 821.29, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:28:36.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:28:36.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:28:36.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:28:05, diff=31.644855s, valid=True
2026-06-04T01:28:36.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:28:36.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:28:36.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:28:12, diff=24.647771s, valid=True
2026-06-04T01:28:36.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:28:36.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:28:36.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:28:03, diff=33.654475s, valid=True
2026-06-04T01:28:36.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:28:36.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:28:36.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:28:36.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:28:36.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:28:36.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:28:36.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:28:12, diff=24.65758s, valid=True
2026-06-04T01:28:36.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:28:36.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:28:36.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:28:36.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103513.658259s, valid=True
2026-06-04T01:28:36.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:28:36.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:28:36.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:28:36.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:28:36.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:28:36.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:28:36.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:28:36.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:28:36.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:28:36.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:28:36.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:28:36.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:28:36.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:28:36.978 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:28:37.186 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:28:37.531 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:28:37.634 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:28:37.634 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:28:37.634 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:28:37.722 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:28:37.722 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:29:07.744 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:29:07.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:29:07.744 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:29:08.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:29:08.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:29:08.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:29:08.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:29:08.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:29:08.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:29:08.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:29:08.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:29:08.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:29:08.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:29:10.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:29:10.831 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:29:10.831 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:29:10.832 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:29:10.843 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:29:10.856 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:29:10.856 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:29:10.857 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:29:10.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:29:10.857 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:29:10.858 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:29:10.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:29:11.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:29:11.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:29:11.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:29:11.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:29:11.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:29:11.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:29:11.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:29:11.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:29:11.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:29:11.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:29:11.189 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:29:11.260 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:29:07
2026-06-04T01:29:11.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87571, datetime.datetime(2026, 6, 4, 1, 29, 7), datetime.datetime(2026, 6, 4, 1, 29, 6), 'salt', 1.63, 100.34, None, 44.42, 117.32, -0.05, 821.47, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:29:11.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:29:11.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:29:11.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:29:06, diff=5.267274s, valid=True
2026-06-04T01:29:11.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:29:11.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:29:11.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:29:12, diff=-0.729222s, valid=True
2026-06-04T01:29:11.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:29:11.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:29:11.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:29:04, diff=7.279089s, valid=True
2026-06-04T01:29:11.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:29:11.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:29:11.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:29:11.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:29:11.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:29:11.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:29:11.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:29:12, diff=-0.717184s, valid=True
2026-06-04T01:29:11.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:29:11.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:29:11.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:29:11.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103548.283635s, valid=True
2026-06-04T01:29:11.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:29:11.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:29:11.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:29:11.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:29:11.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:29:11.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:29:11.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:29:11.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:29:11.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:29:11.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:29:11.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:29:11.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:29:11.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:29:11.683 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:29:11.895 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:29:12.241 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:29:12.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:29:12.345 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:29:12.345 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:29:12.570 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:29:12.570 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:29:42.600 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:29:42.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:29:42.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:29:42.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:29:42.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:29:43.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:29:43.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:29:43.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:29:43.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:29:43.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:29:43.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:29:43.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:29:43.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:29:45.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:29:45.615 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:29:45.616 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:29:45.616 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:29:45.625 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:29:45.637 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:29:45.638 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:29:45.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:29:45.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:29:45.639 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:29:45.639 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:29:45.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:29:45.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:29:45.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:29:45.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:29:45.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:29:45.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:29:45.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:29:45.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:29:45.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:29:45.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:29:45.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:29:45.921 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:29:45.997 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:29:37
2026-06-04T01:29:45.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87572, datetime.datetime(2026, 6, 4, 1, 29, 37), datetime.datetime(2026, 6, 4, 1, 29, 36), 'salt', 1.63, 100.28, None, 37.22, 121.9, -0.04, 821.54, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:29:45.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:29:45.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:29:46.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:29:36, diff=10.003907s, valid=True
2026-06-04T01:29:46.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:29:46.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:29:46.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:30:12, diff=-25.992853s, valid=True
2026-06-04T01:29:46.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:29:46.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:29:46.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:29:34, diff=12.014724s, valid=True
2026-06-04T01:29:46.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:29:46.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:29:46.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:29:46.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:29:46.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:29:46.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:29:46.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:30:12, diff=-25.981814s, valid=True
2026-06-04T01:29:46.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:29:46.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:29:46.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:29:46.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103583.018956s, valid=True
2026-06-04T01:29:46.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:29:46.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:29:46.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:29:46.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:29:46.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:29:46.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:29:46.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:29:46.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:29:46.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:29:46.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:29:46.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:29:46.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:29:46.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:29:46.339 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:29:46.544 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:29:46.885 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:29:47.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:29:47.000 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:29:47.001 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:29:47.185 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:29:47.186 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:30:17.216 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:30:17.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:30:17.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:30:17.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:30:17.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:30:18.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:30:18.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:30:18.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:30:18.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:30:18.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:30:18.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:30:18.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:30:18.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:30:20.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:30:20.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:30:20.486 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:30:20.486 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:30:20.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:30:20.510 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:30:20.511 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:30:20.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:30:20.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:30:20.512 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:30:20.512 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:30:20.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:30:20.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:30:20.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:30:20.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:30:20.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:30:20.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:30:20.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:30:20.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:30:20.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:30:20.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:30:20.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:30:20.863 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:30:20.936 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:30:07
2026-06-04T01:30:20.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87573, datetime.datetime(2026, 6, 4, 1, 30, 7), datetime.datetime(2026, 6, 4, 1, 30, 6), 'salt', 1.57, 100.31, None, 39.41, 116.45, -0.04, 821.29, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:30:20.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:30:20.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:30:20.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:30:06, diff=14.943846s, valid=True
2026-06-04T01:30:20.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:30:20.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:30:20.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:30:12, diff=8.947372s, valid=True
2026-06-04T01:30:20.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:30:20.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:30:20.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:30:05, diff=15.955584s, valid=True
2026-06-04T01:30:20.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:30:20.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:30:20.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:30:20.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:30:20.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:30:20.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:30:20.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:30:12, diff=8.95938s, valid=True
2026-06-04T01:30:20.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:30:20.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:30:20.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:30:20.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103617.960199s, valid=True
2026-06-04T01:30:20.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:30:20.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:30:20.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:30:20.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:30:20.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:30:21.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:30:21.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:30:21.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:30:21.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:30:21.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:30:21.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:30:21.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:30:21.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:30:21.281 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:30:21.489 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:30:21.837 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:30:21.940 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:30:21.940 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:30:21.940 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:30:22.126 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:30:22.126 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:30:52.157 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:30:52.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:30:52.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:30:52.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:30:52.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:30:52.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:30:52.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:30:52.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:30:52.726 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:30:52.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:30:52.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:30:52.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:30:52.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:30:55.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:30:55.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:30:55.132 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:30:55.132 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:30:55.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:30:55.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:30:55.157 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:30:55.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:30:55.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:30:55.159 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:30:55.159 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:30:55.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:30:55.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:30:55.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:30:55.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:30:55.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:30:55.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:30:55.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:30:55.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:30:55.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:30:55.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:30:55.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:30:55.501 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:30:55.576 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:30:37
2026-06-04T01:30:55.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87574, datetime.datetime(2026, 6, 4, 1, 30, 37), datetime.datetime(2026, 6, 4, 1, 30, 37), 'salt', 1.6, 100.24, None, 49.08, 128.79, -0.04, 821.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:30:55.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:30:55.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:30:55.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:30:37, diff=18.583805s, valid=True
2026-06-04T01:30:55.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:30:55.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:30:55.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:31:12, diff=-16.412719s, valid=True
2026-06-04T01:30:55.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:30:55.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:30:55.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:30:35, diff=20.595347s, valid=True
2026-06-04T01:30:55.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:30:55.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:30:55.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:30:55.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:30:55.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:30:55.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:30:55.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:31:12, diff=-16.400939s, valid=True
2026-06-04T01:30:55.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:30:55.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:30:55.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:30:55.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103652.599864s, valid=True
2026-06-04T01:30:55.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:30:55.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:30:55.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:30:55.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:30:55.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:30:55.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:30:55.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:30:55.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:30:55.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:30:55.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:30:55.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:30:55.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:30:55.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:30:55.919 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:30:56.185 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:30:56.525 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:30:56.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:30:56.629 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:30:56.629 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:30:56.869 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:30:56.869 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:31:26.873 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:31:26.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:31:26.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:31:27.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:31:27.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:31:27.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:31:27.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:31:27.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:31:27.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:31:27.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:31:27.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:31:27.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:31:27.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:31:30.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:31:30.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:31:30.312 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:31:30.313 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:31:30.325 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:31:30.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:31:30.338 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:31:30.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:31:30.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:31:30.339 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:31:30.339 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:31:30.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:31:30.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:31:30.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:31:30.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:31:30.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:31:30.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:31:30.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:31:30.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:31:30.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:31:30.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:31:30.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:31:30.704 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:31:30.784 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:31:08
2026-06-04T01:31:30.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87575, datetime.datetime(2026, 6, 4, 1, 31, 8), datetime.datetime(2026, 6, 4, 1, 31, 7), 'salt', 1.57, 100.24, None, 51.09, 125.87, -0.03, 821.29, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:31:30.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:31:30.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:31:30.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:31:07, diff=23.791052s, valid=True
2026-06-04T01:31:30.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:31:30.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:31:30.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:31:12, diff=18.794302s, valid=True
2026-06-04T01:31:30.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:31:30.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:31:30.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:31:05, diff=25.802012s, valid=True
2026-06-04T01:31:30.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:31:30.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:31:30.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:31:30.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:31:30.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:31:30.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:31:30.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:31:12, diff=18.805428s, valid=True
2026-06-04T01:31:30.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:31:30.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:31:30.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:31:30.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103687.806189s, valid=True
2026-06-04T01:31:30.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:31:30.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:31:30.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:31:30.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:31:30.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:31:30.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:31:30.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:31:30.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:31:30.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:31:30.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:31:31.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:31:31.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:31:31.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:31:31.125 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:31:31.336 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:31:31.678 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:31:31.780 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:31:31.780 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:31:31.780 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:31:31.971 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:31:31.971 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:32:02.001 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:32:02.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:32:02.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:32:02.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:32:02.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:32:02.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:32:02.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:32:02.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:32:02.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:32:02.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:32:02.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:32:02.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:32:02.618 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:32:04.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:32:04.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:32:04.924 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:32:04.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:32:04.936 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:32:04.948 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:32:04.949 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:32:04.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:32:04.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:32:04.950 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:32:04.950 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:32:04.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:32:05.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:32:05.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:32:05.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:32:05.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:32:05.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:32:05.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:32:05.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:32:05.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:32:05.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:32:05.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:32:05.298 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:32:05.370 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:31:38
2026-06-04T01:32:05.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87576, datetime.datetime(2026, 6, 4, 1, 31, 38), datetime.datetime(2026, 6, 4, 1, 31, 37), 'salt', 1.63, 100.34, None, 48.83, 117.79, -0.05, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:32:05.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:32:05.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:32:05.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:31:37, diff=28.377573s, valid=True
2026-06-04T01:32:05.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:32:05.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:32:05.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:32:12, diff=-6.618917s, valid=True
2026-06-04T01:32:05.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:32:05.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:32:05.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:31:35, diff=30.389341s, valid=True
2026-06-04T01:32:05.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:32:05.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:32:05.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:32:05.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:32:05.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:32:05.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:32:05.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:32:12, diff=-6.606918s, valid=True
2026-06-04T01:32:05.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:32:05.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:32:05.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:32:05.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103722.393894s, valid=True
2026-06-04T01:32:05.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:32:05.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:32:05.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:32:05.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:32:05.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:32:05.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:32:05.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:32:05.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:32:05.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:32:05.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:32:05.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:32:05.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:32:05.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:32:05.788 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:32:05.992 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:32:06.334 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:32:06.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:32:06.435 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:32:06.436 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:32:06.971 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:32:06.971 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:32:37.001 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:32:37.002 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:32:37.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:32:37.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:32:37.181 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:32:37.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:32:37.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:32:37.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:32:37.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:32:37.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:32:37.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:32:37.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:32:37.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:32:39.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:32:39.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:32:39.919 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:32:39.919 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:32:39.930 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:32:39.941 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:32:39.942 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:32:39.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:32:39.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:32:39.942 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:32:39.942 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:32:39.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:32:40.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:32:40.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:32:40.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:32:40.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:32:40.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:32:40.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:32:40.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:32:40.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:32:40.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:32:40.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:32:40.302 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:32:40.382 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:32:38
2026-06-04T01:32:40.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87578, datetime.datetime(2026, 6, 4, 1, 32, 38), datetime.datetime(2026, 6, 4, 1, 32, 38), 'salt', 1.53, 100.24, None, 47.98, 126.72, -0.04, 821.6, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:32:40.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:32:40.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:32:40.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:32:38, diff=2.389652s, valid=True
2026-06-04T01:32:40.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:32:40.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:32:40.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:33:12, diff=-31.606888s, valid=True
2026-06-04T01:32:40.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:32:40.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:32:40.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:32:37, diff=3.401282s, valid=True
2026-06-04T01:32:40.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:32:40.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:32:40.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:32:40.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:32:40.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:32:40.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:32:40.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:33:12, diff=-31.595013s, valid=True
2026-06-04T01:32:40.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:32:40.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:32:40.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:32:40.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103757.405795s, valid=True
2026-06-04T01:32:40.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:32:40.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:32:40.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:32:40.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:32:40.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:32:40.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:32:40.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:32:40.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:32:40.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:32:40.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:32:40.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:32:40.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:32:40.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:32:40.728 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:32:40.932 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:32:41.273 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:32:41.377 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:32:41.377 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:32:41.377 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:32:41.564 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:32:41.564 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:33:11.594 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:33:11.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:33:11.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:33:11.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:33:11.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:33:12.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:33:12.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:33:12.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:33:12.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:33:12.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:33:12.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:33:12.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:33:12.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:33:14.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:33:14.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:33:14.931 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:33:14.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:33:14.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:33:14.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:33:14.957 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:33:14.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:33:14.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:33:14.958 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:33:14.958 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:33:14.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:33:15.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:33:15.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:33:15.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:33:15.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:33:15.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:33:15.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:33:15.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:33:15.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:33:15.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:33:15.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:33:15.318 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:33:15.391 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:33:09
2026-06-04T01:33:15.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87579, datetime.datetime(2026, 6, 4, 1, 33, 9), datetime.datetime(2026, 6, 4, 1, 33, 8), 'salt', 1.53, 100.31, None, 49.57, 119.86, -0.05, 821.11, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:33:15.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:33:15.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:33:15.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:33:08, diff=7.398877s, valid=True
2026-06-04T01:33:15.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:33:15.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:33:15.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:33:12, diff=3.402475s, valid=True
2026-06-04T01:33:15.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:33:15.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:33:15.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:33:07, diff=8.410889s, valid=True
2026-06-04T01:33:15.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:33:15.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:33:15.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:33:15.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:33:15.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:33:15.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:33:15.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:33:12, diff=3.414724s, valid=True
2026-06-04T01:33:15.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:33:15.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:33:15.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:33:15.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103792.415551s, valid=True
2026-06-04T01:33:15.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:33:15.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:33:15.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:33:15.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:33:15.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:33:15.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:33:15.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:33:15.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:33:15.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:33:15.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:33:15.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:33:15.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:33:15.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:33:15.806 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:33:16.012 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:33:16.356 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:33:16.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:33:16.459 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:33:16.459 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:33:16.652 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:33:16.653 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:33:46.657 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:33:46.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:33:46.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:33:46.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:33:46.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:33:47.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:33:47.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:33:47.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:33:47.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:33:47.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:33:47.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:33:47.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:33:47.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:33:49.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:33:49.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:33:49.570 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:33:49.571 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:33:49.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:33:49.593 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:33:49.594 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:33:49.595 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:33:49.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:33:49.595 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:33:49.595 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:33:49.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:33:49.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:33:49.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:33:49.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:33:49.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:33:49.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:33:49.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:33:49.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:33:49.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:33:49.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:33:49.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:33:49.955 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:33:50.035 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:33:39
2026-06-04T01:33:50.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87580, datetime.datetime(2026, 6, 4, 1, 33, 39), datetime.datetime(2026, 6, 4, 1, 33, 38), 'salt', 1.57, 100.24, None, 55.68, 113.54, -0.03, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:33:50.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:33:50.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:33:50.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:33:38, diff=12.045348s, valid=True
2026-06-04T01:33:50.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:33:50.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:33:50.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:34:12, diff=-21.951653s, valid=True
2026-06-04T01:33:50.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:33:50.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:33:50.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:33:37, diff=13.056399s, valid=True
2026-06-04T01:33:50.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:33:50.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:33:50.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:33:50.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:33:50.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:33:50.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:33:50.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:34:12, diff=-21.94041s, valid=True
2026-06-04T01:33:50.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:33:50.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:33:50.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:33:50.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103827.060265s, valid=True
2026-06-04T01:33:50.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:33:50.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:33:50.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:33:50.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:33:50.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:33:50.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:33:50.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:33:50.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:33:50.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:33:50.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:33:50.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:33:50.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:33:50.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:33:50.394 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:33:50.602 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:33:50.947 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:33:51.050 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:33:51.050 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:33:51.050 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:33:51.250 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:33:51.250 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:34:21.280 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:34:21.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:34:21.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:34:21.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:34:21.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:34:21.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:34:21.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:34:21.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:34:21.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:34:21.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:34:21.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:34:21.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:34:21.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:34:24.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:34:24.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:34:24.289 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:34:24.289 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:34:24.300 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:34:24.313 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:34:24.313 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:34:24.314 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:34:24.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:34:24.314 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:34:24.315 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:34:24.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:34:24.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:34:24.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:34:24.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:34:24.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:34:24.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:34:24.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:34:24.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:34:24.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:34:24.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:34:24.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:34:24.656 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:34:24.728 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:34:09
2026-06-04T01:34:24.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87581, datetime.datetime(2026, 6, 4, 1, 34, 9), datetime.datetime(2026, 6, 4, 1, 34, 8), 'salt', 1.57, 100.31, None, 51.79, 131.68, -0.04, 821.05, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:34:24.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:34:24.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:34:24.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:34:08, diff=16.73464s, valid=True
2026-06-04T01:34:24.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:34:24.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:34:24.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:34:12, diff=12.7375s, valid=True
2026-06-04T01:34:24.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:34:24.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:34:24.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:34:07, diff=17.744143s, valid=True
2026-06-04T01:34:24.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:34:24.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:34:24.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:34:24.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:34:24.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:34:24.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:34:24.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:34:12, diff=12.747224s, valid=True
2026-06-04T01:34:24.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:34:24.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:34:24.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:34:24.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103861.747894s, valid=True
2026-06-04T01:34:24.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:34:24.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:34:24.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:34:24.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:34:24.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:34:24.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:34:24.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:34:24.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:34:24.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:34:24.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:34:25.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:34:25.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:34:25.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:34:25.136 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:34:25.344 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:34:25.686 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:34:25.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:34:25.787 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:34:25.787 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:34:25.981 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:34:25.981 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:34:56.011 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:34:56.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:34:56.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:34:56.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:34:56.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:34:56.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:34:56.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:34:56.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:34:56.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:34:56.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:34:56.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:34:56.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:34:56.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:34:59.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:34:59.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:34:59.140 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:34:59.140 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:34:59.148 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:34:59.160 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:34:59.160 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:34:59.161 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:34:59.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:34:59.161 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:34:59.161 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:34:59.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:34:59.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:34:59.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:34:59.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:34:59.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:34:59.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:34:59.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:34:59.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:34:59.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:34:59.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:34:59.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:34:59.449 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:34:59.520 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:34:39
2026-06-04T01:34:59.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87582, datetime.datetime(2026, 6, 4, 1, 34, 39), datetime.datetime(2026, 6, 4, 1, 34, 39), 'salt', 1.6, 100.28, None, 50.81, 125.4, -0.04, 821.35, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:34:59.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:34:59.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:34:59.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:34:39, diff=20.527972s, valid=True
2026-06-04T01:34:59.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:34:59.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:34:59.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:35:12, diff=-12.468691s, valid=True
2026-06-04T01:34:59.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:34:59.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:34:59.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:34:37, diff=22.539178s, valid=True
2026-06-04T01:34:59.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:34:59.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:34:59.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:34:59.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:34:59.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:34:59.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:34:59.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:35:12, diff=-12.457222s, valid=True
2026-06-04T01:34:59.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:34:59.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:34:59.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:34:59.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103896.543549s, valid=True
2026-06-04T01:34:59.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:34:59.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:34:59.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:34:59.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:34:59.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:34:59.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:34:59.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:34:59.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:34:59.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:34:59.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:34:59.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:34:59.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:34:59.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:34:59.867 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:35:00.100 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:35:00.446 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:35:00.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:35:00.550 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:35:00.550 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:35:00.764 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:35:00.765 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:35:30.795 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:35:30.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:35:30.795 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:35:31.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:35:31.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:35:31.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:35:31.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:35:31.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:35:31.437 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:35:31.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:35:31.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:35:31.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:35:31.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:35:33.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:35:33.862 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:35:33.864 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:35:33.864 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:35:33.874 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:35:33.886 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:35:33.887 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:35:33.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:35:33.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:35:33.888 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:35:33.888 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:35:33.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:35:34.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:35:34.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:35:34.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:35:34.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:35:34.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:35:34.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:35:34.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:35:34.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:35:34.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:35:34.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:35:34.231 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:35:34.302 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:35:10
2026-06-04T01:35:34.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87583, datetime.datetime(2026, 6, 4, 1, 35, 10), datetime.datetime(2026, 6, 4, 1, 35, 9), 'salt', 1.63, 100.34, None, 44.0, 111.94, -0.05, 821.29, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:35:34.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:35:34.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:35:34.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:35:09, diff=25.309241s, valid=True
2026-06-04T01:35:34.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:35:34.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:35:34.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:35:12, diff=22.312684s, valid=True
2026-06-04T01:35:34.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:35:34.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:35:34.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:35:08, diff=26.320641s, valid=True
2026-06-04T01:35:34.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:35:34.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:35:34.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:35:34.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:35:34.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:35:34.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:35:34.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:35:12, diff=22.324287s, valid=True
2026-06-04T01:35:34.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:35:34.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:35:34.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:35:34.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103931.325074s, valid=True
2026-06-04T01:35:34.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:35:34.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:35:34.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:35:34.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:35:34.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:35:34.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:35:34.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:35:34.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:35:34.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:35:34.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:35:34.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:35:34.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:35:34.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:35:34.646 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:35:34.855 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:35:35.202 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:35:35.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:35:35.306 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:35:35.306 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:35:35.493 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:35:35.494 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:36:05.524 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:36:05.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:36:05.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:36:05.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:36:05.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:36:05.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:36:05.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:36:05.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:36:05.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:36:05.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:36:05.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:36:05.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:36:05.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:36:08.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:36:08.412 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:36:08.412 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:36:08.413 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:36:08.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:36:08.439 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:36:08.440 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:36:08.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:36:08.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:36:08.441 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:36:08.441 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:36:08.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:36:08.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:36:08.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:36:08.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:36:08.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:36:08.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:36:08.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:36:08.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:36:08.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:36:08.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:36:08.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:36:08.775 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:36:08.847 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:35:40
2026-06-04T01:36:08.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87584, datetime.datetime(2026, 6, 4, 1, 35, 40), datetime.datetime(2026, 6, 4, 1, 35, 39), 'salt', 1.63, 100.38, None, 58.36, 126.48, -0.06, 821.29, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:36:08.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:36:08.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:36:08.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:35:39, diff=29.854387s, valid=True
2026-06-04T01:36:08.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:36:08.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:36:08.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:36:12, diff=-3.142081s, valid=True
2026-06-04T01:36:08.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:36:08.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:36:08.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:35:38, diff=30.866055s, valid=True
2026-06-04T01:36:08.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:36:08.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:36:08.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:36:08.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:36:08.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:36:08.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:36:08.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:36:12, diff=-3.130194s, valid=True
2026-06-04T01:36:08.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:36:08.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:36:08.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:36:08.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=103965.870637s, valid=True
2026-06-04T01:36:08.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:36:08.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:36:08.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:36:08.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:36:08.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:36:08.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:36:08.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:36:08.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:36:08.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:36:09.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:36:09.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:36:09.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:36:09.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:36:09.191 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:36:09.399 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:36:09.805 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:36:09.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:36:09.918 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:36:09.918 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:36:10.218 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:36:10.218 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:36:40.222 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:36:40.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:36:40.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:36:40.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:36:40.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:36:40.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:36:40.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:36:40.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:36:40.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:36:40.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:36:40.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:36:40.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:36:40.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:36:43.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:36:43.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:36:43.651 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:36:43.651 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:36:43.661 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:36:43.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:36:43.674 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:36:43.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:36:43.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:36:43.675 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:36:43.676 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:36:43.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:36:43.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:36:43.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:36:43.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:36:43.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:36:43.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:36:43.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:36:44.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:36:44.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:36:44.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:36:44.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:36:44.014 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:36:44.085 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:36:40
2026-06-04T01:36:44.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87586, datetime.datetime(2026, 6, 4, 1, 36, 40), datetime.datetime(2026, 6, 4, 1, 36, 40), 'salt', 1.6, 100.28, None, 51.23, 122.91, -0.04, 821.47, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:36:44.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:36:44.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:36:44.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:36:40, diff=4.093009s, valid=True
2026-06-04T01:36:44.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:36:44.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:36:44.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:37:12, diff=-27.903529s, valid=True
2026-06-04T01:36:44.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:36:44.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:36:44.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:36:38, diff=6.104617s, valid=True
2026-06-04T01:36:44.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:36:44.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:36:44.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:36:44.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:36:44.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:36:44.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:36:44.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:37:12, diff=-27.891678s, valid=True
2026-06-04T01:36:44.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:36:44.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:36:44.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:36:44.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104001.109142s, valid=True
2026-06-04T01:36:44.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:36:44.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:36:44.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:36:44.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:36:44.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:36:44.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:36:44.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:36:44.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:36:44.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:36:44.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:36:44.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:36:44.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:36:44.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:36:44.433 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:36:44.642 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:36:44.991 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:36:45.097 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:36:45.097 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:36:45.097 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:36:45.438 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:36:45.438 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:37:15.446 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:37:15.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:37:15.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:37:15.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:37:15.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:37:16.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:37:16.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:37:16.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:37:16.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:37:16.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:37:16.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:37:16.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:37:16.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:37:18.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:37:18.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:37:18.981 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:37:18.981 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:37:18.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:37:19.003 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:37:19.004 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:37:19.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:37:19.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:37:19.005 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:37:19.005 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:37:19.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:37:19.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:37:19.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:37:19.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:37:19.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:37:19.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:37:19.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:37:19.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:37:19.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:37:19.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:37:19.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:37:19.352 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:37:19.423 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:37:11
2026-06-04T01:37:19.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87587, datetime.datetime(2026, 6, 4, 1, 37, 11), datetime.datetime(2026, 6, 4, 1, 37, 10), 'salt', 1.57, 100.31, None, 49.33, 129.98, -0.04, 821.41, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:37:19.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:37:19.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:37:19.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:37:10, diff=9.431044s, valid=True
2026-06-04T01:37:19.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:37:19.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:37:19.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:37:12, diff=7.43456s, valid=True
2026-06-04T01:37:19.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:37:19.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:37:19.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:37:09, diff=10.442675s, valid=True
2026-06-04T01:37:19.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:37:19.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:37:19.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:37:19.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:37:19.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:37:19.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:37:19.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:37:12, diff=7.446389s, valid=True
2026-06-04T01:37:19.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:37:19.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:37:19.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:37:19.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104036.447225s, valid=True
2026-06-04T01:37:19.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:37:19.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:37:19.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:37:19.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:37:19.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:37:19.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:37:19.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:37:19.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:37:19.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:37:19.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:37:19.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:37:19.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:37:19.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:37:19.767 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:37:20.064 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:37:20.416 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:37:20.517 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:37:20.517 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:37:20.517 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:37:20.697 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:37:20.697 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:37:50.717 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:37:50.717 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:37:50.717 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:37:51.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:37:51.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:37:51.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:37:51.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:37:51.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:37:51.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:37:51.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:37:51.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:37:51.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:37:51.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:37:54.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:37:54.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:37:54.036 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:37:54.036 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:37:54.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:37:54.057 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:37:54.058 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:37:54.058 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:37:54.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:37:54.059 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:37:54.059 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:37:54.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:37:54.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:37:54.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:37:54.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:37:54.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:37:54.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:37:54.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:37:54.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:37:54.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:37:54.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:37:54.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:37:54.398 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:37:54.478 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:37:41
2026-06-04T01:37:54.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87588, datetime.datetime(2026, 6, 4, 1, 37, 41), datetime.datetime(2026, 6, 4, 1, 37, 40), 'salt', 1.57, 100.24, None, 42.16, 127.33, -0.03, 821.17, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:37:54.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:37:54.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:37:54.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:37:40, diff=14.485821s, valid=True
2026-06-04T01:37:54.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:37:54.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:37:54.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:38:12, diff=-17.51068s, valid=True
2026-06-04T01:37:54.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:37:54.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:37:54.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:37:39, diff=15.497559s, valid=True
2026-06-04T01:37:54.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:37:54.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:37:54.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:37:54.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:37:54.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:37:54.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:37:54.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:38:12, diff=-17.498721s, valid=True
2026-06-04T01:37:54.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:37:54.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:37:54.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:37:54.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104071.502113s, valid=True
2026-06-04T01:37:54.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:37:54.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:37:54.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:37:54.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:37:54.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:37:54.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:37:54.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:37:54.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:37:54.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:37:54.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:37:54.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:37:54.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:37:54.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:37:54.825 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:37:55.025 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:37:55.362 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:37:55.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:37:55.464 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:37:55.464 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:37:55.638 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:37:55.639 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:38:25.654 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:38:25.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:38:25.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:38:25.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:38:25.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:38:26.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:38:26.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:38:26.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:38:26.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:38:26.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:38:26.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:38:26.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:38:26.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:38:28.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:38:28.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:38:28.915 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:38:28.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:38:28.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:38:28.939 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:38:28.940 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:38:28.940 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:38:28.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:38:28.941 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:38:28.941 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:38:28.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:38:29.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:38:29.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:38:29.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:38:29.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:38:29.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:38:29.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:38:29.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:38:29.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:38:29.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:38:29.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:38:29.211 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:38:29.280 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:38:12
2026-06-04T01:38:29.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87589, datetime.datetime(2026, 6, 4, 1, 38, 12), datetime.datetime(2026, 6, 4, 1, 38, 10), 'salt', 1.6, 100.28, None, 55.11, 122.19, -0.04, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:38:29.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:38:29.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:38:29.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:38:10, diff=19.287151s, valid=True
2026-06-04T01:38:29.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:38:29.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:38:29.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:38:12, diff=17.290339s, valid=True
2026-06-04T01:38:29.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:38:29.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:38:29.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:38:10, diff=19.297759s, valid=True
2026-06-04T01:38:29.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:38:29.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:38:29.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:38:29.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:38:29.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:38:29.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:38:29.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:38:12, diff=17.301186s, valid=True
2026-06-04T01:38:29.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:38:29.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:38:29.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:38:29.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104106.301942s, valid=True
2026-06-04T01:38:29.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:38:29.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:38:29.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:38:29.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:38:29.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:38:29.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:38:29.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:38:29.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:38:29.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:38:29.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:38:29.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:38:29.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:38:29.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:38:29.691 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:38:29.910 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:38:30.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:38:30.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:38:30.356 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:38:30.356 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:38:31.209 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:38:31.209 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:39:01.239 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:39:01.240 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:39:01.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:39:01.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:39:01.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:39:01.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:39:01.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:39:01.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:39:01.792 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:39:01.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:39:01.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:39:01.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:39:01.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:39:04.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:39:04.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:39:04.110 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:39:04.110 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:39:04.121 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:39:04.134 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:39:04.134 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:39:04.135 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:39:04.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:39:04.136 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:39:04.136 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:39:04.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:39:04.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:39:04.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:39:04.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:39:04.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:39:04.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:39:04.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:39:04.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:39:04.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:39:04.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:39:04.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:39:04.463 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:39:04.537 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:38:42
2026-06-04T01:39:04.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87590, datetime.datetime(2026, 6, 4, 1, 38, 42), datetime.datetime(2026, 6, 4, 1, 38, 42), 'salt', 1.53, 100.28, None, 53.74, 127.61, -0.04, 821.11, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:39:04.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:39:04.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:39:04.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:38:42, diff=22.544714s, valid=True
2026-06-04T01:39:04.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:39:04.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:39:04.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:39:12, diff=-7.451784s, valid=True
2026-06-04T01:39:04.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:39:04.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:39:04.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:38:39, diff=25.556334s, valid=True
2026-06-04T01:39:04.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:39:04.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:39:04.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:39:04.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:39:04.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:39:04.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:39:04.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:39:12, diff=-7.43989s, valid=True
2026-06-04T01:39:04.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:39:04.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:39:04.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:39:04.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104141.560951s, valid=True
2026-06-04T01:39:04.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:39:04.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:39:04.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:39:04.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:39:04.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:39:04.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:39:04.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:39:04.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:39:04.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:39:04.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:39:04.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:39:04.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:39:04.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:39:04.882 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:39:05.087 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:39:05.423 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:39:05.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:39:05.524 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:39:05.525 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:39:05.894 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:39:05.894 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:39:35.924 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:39:35.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:39:35.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:39:36.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:39:36.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:39:36.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:39:36.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:39:36.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:39:36.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:39:36.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:39:36.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:39:36.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:39:36.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:39:39.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:39:39.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:39:39.054 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:39:39.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:39:39.064 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:39:39.077 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:39:39.077 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:39:39.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:39:39.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:39:39.078 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:39:39.079 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:39:39.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:39:39.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:39:39.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:39:39.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:39:39.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:39:39.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:39:39.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:39:39.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:39:39.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:39:39.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:39:39.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:39:39.406 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:39:39.476 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:39:13
2026-06-04T01:39:39.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87591, datetime.datetime(2026, 6, 4, 1, 39, 13), datetime.datetime(2026, 6, 4, 1, 39, 12), 'salt', 1.6, 100.34, None, 48.16, 119.37, -0.05, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:39:39.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:39:39.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:39:39.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:39:12, diff=27.483457s, valid=True
2026-06-04T01:39:39.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:39:39.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:39:39.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:39:12, diff=27.486957s, valid=True
2026-06-04T01:39:39.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:39:39.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:39:39.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:39:10, diff=29.495136s, valid=True
2026-06-04T01:39:39.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:39:39.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:39:39.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:39:39.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:39:39.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:39:39.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:39:39.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:39:12, diff=27.498926s, valid=True
2026-06-04T01:39:39.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:39:39.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:39:39.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:39:39.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104176.499752s, valid=True
2026-06-04T01:39:39.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:39:39.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:39:39.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:39:39.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:39:39.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:39:39.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:39:39.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:39:39.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:39:39.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:39:39.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:39:39.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:39:39.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:39:39.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:39:39.893 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:39:40.103 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:39:40.439 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:39:40.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:39:40.542 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:39:40.542 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:39:40.770 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:39:40.770 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:40:10.800 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:40:10.801 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:40:10.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:40:11.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:40:11.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:40:11.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:40:11.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:40:11.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:40:11.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:40:11.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:40:11.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:40:11.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:40:11.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:40:13.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:40:13.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:40:13.795 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:40:13.795 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:40:13.806 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:40:13.819 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:40:13.820 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:40:13.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:40:13.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:40:13.821 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:40:13.821 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:40:13.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:40:13.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:40:13.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:40:14.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:40:14.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:40:14.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:40:14.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:40:14.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:40:14.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:40:14.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:40:14.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:40:14.149 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:40:14.219 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:40:13
2026-06-04T01:40:14.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87593, datetime.datetime(2026, 6, 4, 1, 40, 13), datetime.datetime(2026, 6, 4, 1, 40, 13), 'salt', 1.63, 100.38, None, 49.01, 124.49, -0.06, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:40:14.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:40:14.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:40:14.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:40:13, diff=1.227225s, valid=True
2026-06-04T01:40:14.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:40:14.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:40:14.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:40:12, diff=2.230724s, valid=True
2026-06-04T01:40:14.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:40:14.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:40:14.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:40:10, diff=4.238783s, valid=True
2026-06-04T01:40:14.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:40:14.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:40:14.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:40:14.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:40:14.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:40:14.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:40:14.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:40:12, diff=2.242497s, valid=True
2026-06-04T01:40:14.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:40:14.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:40:14.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:40:14.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104211.243317s, valid=True
2026-06-04T01:40:14.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:40:14.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:40:14.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:40:14.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:40:14.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:40:14.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:40:14.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:40:14.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:40:14.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:40:14.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:40:14.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:40:14.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:40:14.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:40:14.566 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:40:14.765 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:40:15.101 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:40:15.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:40:15.202 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:40:15.202 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:40:15.293 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:40:15.294 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:40:45.324 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:40:45.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:40:45.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:40:45.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:40:45.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:40:46.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:40:46.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:40:46.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:40:46.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:40:46.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:40:46.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:40:46.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:40:46.105 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:40:48.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:40:48.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:40:48.520 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:40:48.520 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:40:48.530 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:40:48.542 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:40:48.543 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:40:48.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:40:48.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:40:48.544 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:40:48.544 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:40:48.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:40:48.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:40:48.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:40:48.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:40:48.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:40:48.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:40:48.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:40:48.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:40:48.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:40:48.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:40:48.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:40:48.936 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:40:49.009 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:40:44
2026-06-04T01:40:49.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87594, datetime.datetime(2026, 6, 4, 1, 40, 44), datetime.datetime(2026, 6, 4, 1, 40, 43), 'salt', 1.53, 100.31, None, 51.62, 135.86, -0.05, 821.35, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:40:49.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:40:49.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:40:49.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:40:43, diff=6.015173s, valid=True
2026-06-04T01:40:49.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:40:49.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:40:49.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:41:12, diff=-22.981957s, valid=True
2026-06-04T01:40:49.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:40:49.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:40:49.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:40:40, diff=9.024661s, valid=True
2026-06-04T01:40:49.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:40:49.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:40:49.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:40:49.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:40:49.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:40:49.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:40:49.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:41:12, diff=-22.972345s, valid=True
2026-06-04T01:40:49.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:40:49.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:40:49.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:40:49.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104246.028293s, valid=True
2026-06-04T01:40:49.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:40:49.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:40:49.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:40:49.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:40:49.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:40:49.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:40:49.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:40:49.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:40:49.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:40:49.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:40:49.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:40:49.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:40:49.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:40:49.339 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:40:49.536 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:40:49.874 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:40:49.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:40:49.984 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:40:49.984 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:40:50.165 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:40:50.165 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:41:20.196 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:41:20.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:41:20.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:41:20.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:41:20.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:41:20.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:41:20.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:41:20.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:41:20.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:41:20.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:41:20.882 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:41:20.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:41:20.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:41:24.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:41:24.165 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:41:24.166 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:41:24.167 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:41:24.177 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:41:24.189 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:41:24.190 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:41:24.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:41:24.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:41:24.191 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:41:24.191 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:41:24.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:41:24.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:41:24.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:41:24.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:41:24.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:41:24.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:41:24.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:41:24.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:41:24.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:41:24.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:41:24.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:41:24.522 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:41:24.592 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:41:14
2026-06-04T01:41:24.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87595, datetime.datetime(2026, 6, 4, 1, 41, 14), datetime.datetime(2026, 6, 4, 1, 41, 13), 'salt', 1.53, 100.31, None, 39.27, 113.07, -0.05, 821.05, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:41:24.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:41:24.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:41:24.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:41:13, diff=11.600186s, valid=True
2026-06-04T01:41:24.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:41:24.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:41:24.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:41:12, diff=12.60371s, valid=True
2026-06-04T01:41:24.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:41:24.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:41:24.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:41:11, diff=13.611804s, valid=True
2026-06-04T01:41:24.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:41:24.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:41:24.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:41:24.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:41:24.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:41:24.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:41:24.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:41:12, diff=12.615555s, valid=True
2026-06-04T01:41:24.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:41:24.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:41:24.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:41:24.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104281.616358s, valid=True
2026-06-04T01:41:24.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:41:24.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:41:24.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:41:24.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:41:24.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:41:24.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:41:24.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:41:24.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:41:24.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:41:24.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:41:24.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:41:24.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:41:24.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:41:24.941 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:41:25.146 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:41:25.485 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:41:25.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:41:25.588 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:41:25.588 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:41:25.675 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:41:25.675 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:41:55.698 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:41:55.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:41:55.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:41:55.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:41:56.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:41:56.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:41:56.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:41:56.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:41:56.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:41:56.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:41:56.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:41:56.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:41:56.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:41:58.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:41:58.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:41:58.797 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:41:58.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:41:58.808 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:41:58.829 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:41:58.829 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:41:58.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:41:58.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:41:58.831 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:41:58.831 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:41:58.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:41:58.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:41:58.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:41:59.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:41:59.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:41:59.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:41:59.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:41:59.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:41:59.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:41:59.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:41:59.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:41:59.162 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:41:59.231 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:41:44
2026-06-04T01:41:59.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87596, datetime.datetime(2026, 6, 4, 1, 41, 44), datetime.datetime(2026, 6, 4, 1, 41, 43), 'salt', 1.63, 100.38, None, 51.65, 128.01, -0.06, 821.05, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:41:59.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:41:59.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:41:59.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:41:43, diff=16.237994s, valid=True
2026-06-04T01:41:59.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:41:59.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:41:59.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:42:12, diff=-12.759092s, valid=True
2026-06-04T01:41:59.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:41:59.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:41:59.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:41:41, diff=18.247671s, valid=True
2026-06-04T01:41:59.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:41:59.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:41:59.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:41:59.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:41:59.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:41:59.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:41:59.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:42:12, diff=-12.749258s, valid=True
2026-06-04T01:41:59.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:41:59.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:41:59.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:41:59.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104316.251404s, valid=True
2026-06-04T01:41:59.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:41:59.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:41:59.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:41:59.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:41:59.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:41:59.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:41:59.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:41:59.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:41:59.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:41:59.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:41:59.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:41:59.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:41:59.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:41:59.572 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:41:59.773 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:42:00.136 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:42:00.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:42:00.246 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:42:00.246 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:42:00.433 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:42:00.433 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:42:30.463 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:42:30.463 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:42:30.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:42:30.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:42:30.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:42:30.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:42:30.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:42:30.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:42:30.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:42:30.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:42:30.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:42:30.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:42:30.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:42:33.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:42:33.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:42:33.240 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:42:33.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:42:33.250 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:42:33.262 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:42:33.263 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:42:33.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:42:33.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:42:33.264 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:42:33.264 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:42:33.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:42:33.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:42:33.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:42:33.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:42:33.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:42:33.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:42:33.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:42:33.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:42:33.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:42:33.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:42:33.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:42:33.593 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:42:33.666 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:42:14
2026-06-04T01:42:33.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87597, datetime.datetime(2026, 6, 4, 1, 42, 14), datetime.datetime(2026, 6, 4, 1, 42, 14), 'salt', 1.67, 100.38, None, 49.68, 132.38, -0.05, 821.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:42:33.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:42:33.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:42:33.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:42:14, diff=19.67316s, valid=True
2026-06-04T01:42:33.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:42:33.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:42:33.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:42:12, diff=21.67624s, valid=True
2026-06-04T01:42:33.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:42:33.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:42:33.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:42:11, diff=22.683132s, valid=True
2026-06-04T01:42:33.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:42:33.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:42:33.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:42:33.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:42:33.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:42:33.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:42:33.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:42:12, diff=21.686165s, valid=True
2026-06-04T01:42:33.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:42:33.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:42:33.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:42:33.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104350.686828s, valid=True
2026-06-04T01:42:33.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:42:33.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:42:33.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:42:33.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:42:33.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:42:33.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:42:33.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:42:33.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:42:33.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:42:33.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:42:33.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:42:33.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:42:33.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:42:34.002 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:42:34.198 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:42:34.530 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:42:34.689 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:42:34.689 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:42:34.689 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:42:34.776 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:42:34.776 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:43:04.798 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:43:04.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:43:04.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:43:04.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:43:04.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:43:05.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:43:05.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:43:05.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:43:05.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:43:05.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:43:05.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:43:05.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:43:05.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:43:07.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:43:07.648 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:43:07.650 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:43:07.650 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:43:07.661 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:43:07.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:43:07.674 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:43:07.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:43:07.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:43:07.675 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:43:07.676 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:43:07.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:43:07.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:43:07.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:43:07.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:43:07.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:43:07.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:43:07.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:43:07.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:43:07.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:43:08.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:43:08.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:43:08.003 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:43:08.076 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:42:45
2026-06-04T01:43:08.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87598, datetime.datetime(2026, 6, 4, 1, 42, 45), datetime.datetime(2026, 6, 4, 1, 42, 44), 'salt', 1.6, 100.38, None, 48.62, 122.91, -0.05, 821.29, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:43:08.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:43:08.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:43:08.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:42:44, diff=24.0843s, valid=True
2026-06-04T01:43:08.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:43:08.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:43:08.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:43:12, diff=-3.912161s, valid=True
2026-06-04T01:43:08.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:43:08.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:43:08.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:42:41, diff=27.096086s, valid=True
2026-06-04T01:43:08.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:43:08.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:43:08.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:43:08.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:43:08.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:43:08.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:43:08.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:43:12, diff=-3.900214s, valid=True
2026-06-04T01:43:08.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:43:08.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:43:08.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:43:08.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104385.10054s, valid=True
2026-06-04T01:43:08.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:43:08.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:43:08.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:43:08.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:43:08.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:43:08.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:43:08.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:43:08.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:43:08.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:43:08.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:43:08.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:43:08.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:43:08.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:43:08.422 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:43:08.619 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:43:08.952 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:43:09.052 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:43:09.053 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:43:09.053 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:43:09.292 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:43:09.292 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:43:39.323 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:43:39.323 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:43:39.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:43:39.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:43:39.634 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:43:39.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:43:39.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:43:39.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:43:39.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:43:39.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:43:39.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:43:39.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:43:39.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:43:42.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:43:42.221 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:43:42.222 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:43:42.222 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:43:42.231 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:43:42.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:43:42.244 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:43:42.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:43:42.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:43:42.246 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:43:42.246 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:43:42.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:43:42.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:43:42.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:43:42.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:43:42.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:43:42.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:43:42.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:43:42.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:43:42.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:43:42.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:43:42.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:43:42.580 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:43:42.649 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:43:15
2026-06-04T01:43:42.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87599, datetime.datetime(2026, 6, 4, 1, 43, 15), datetime.datetime(2026, 6, 4, 1, 43, 14), 'salt', 1.57, 100.28, None, 52.29, 126.63, -0.04, 821.11, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:43:42.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:43:42.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:43:42.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:43:14, diff=28.655378s, valid=True
2026-06-04T01:43:42.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:43:42.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:43:42.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:43:12, diff=30.658211s, valid=True
2026-06-04T01:43:42.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:43:42.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:43:42.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:43:12, diff=30.664715s, valid=True
2026-06-04T01:43:42.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:43:42.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:43:42.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:43:42.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:43:42.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:43:42.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:43:42.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:43:12, diff=30.667768s, valid=True
2026-06-04T01:43:42.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:43:42.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:43:42.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:43:42.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104419.668427s, valid=True
2026-06-04T01:43:42.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:43:42.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:43:42.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:43:42.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:43:42.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:43:42.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:43:42.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:43:42.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:43:42.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:43:42.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:43:42.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:43:42.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:43:42.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:43:42.984 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:43:43.256 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:43:43.592 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:43:43.694 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:43:43.694 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:43:43.694 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:43:44.251 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:43:44.251 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:44:14.259 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:44:14.259 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:44:14.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:44:14.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:44:14.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:44:14.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:44:14.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:44:14.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:44:14.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:44:14.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:44:14.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:44:14.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:44:14.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:44:17.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:44:17.134 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:44:17.134 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:44:17.134 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:44:17.144 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:44:17.155 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:44:17.156 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:44:17.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:44:17.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:44:17.156 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:44:17.156 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:44:17.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:44:17.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:44:17.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:44:17.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:44:17.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:44:17.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:44:17.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:44:17.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:44:17.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:44:17.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:44:17.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:44:17.488 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:44:17.559 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:44:15
2026-06-04T01:44:17.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87601, datetime.datetime(2026, 6, 4, 1, 44, 15), datetime.datetime(2026, 6, 4, 1, 44, 15), 'salt', 1.53, 100.25, None, 50.49, 129.05, -0.04, 821.11, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:44:17.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:44:17.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:44:17.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:44:15, diff=2.567111s, valid=True
2026-06-04T01:44:17.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:44:17.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:44:17.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:44:12, diff=5.570673s, valid=True
2026-06-04T01:44:17.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:44:17.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:44:17.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:44:12, diff=5.578752s, valid=True
2026-06-04T01:44:17.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:44:17.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:44:17.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:44:17.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:44:17.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:44:17.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:44:17.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:44:12, diff=5.582433s, valid=True
2026-06-04T01:44:17.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:44:17.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:44:17.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:44:17.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104454.583255s, valid=True
2026-06-04T01:44:17.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:44:17.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:44:17.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:44:17.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:44:17.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:44:17.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:44:17.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:44:17.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:44:17.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:44:17.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:44:17.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:44:17.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:44:17.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:44:17.904 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:44:18.101 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:44:18.434 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:44:18.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:44:18.534 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:44:18.534 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:44:18.768 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:44:18.768 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:44:48.798 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:44:48.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:44:48.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:44:49.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:44:49.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:44:49.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:44:49.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:44:49.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:44:49.353 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:44:49.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:44:49.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:44:49.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:44:49.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:44:51.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:44:51.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:44:51.800 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:44:51.800 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:44:51.810 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:44:51.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:44:51.823 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:44:51.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:44:51.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:44:51.824 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:44:51.824 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:44:51.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:44:51.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:44:51.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:44:52.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:44:52.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:44:52.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:44:52.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:44:52.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:44:52.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:44:52.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:44:52.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:44:52.159 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:44:52.233 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:44:46
2026-06-04T01:44:52.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87602, datetime.datetime(2026, 6, 4, 1, 44, 46), datetime.datetime(2026, 6, 4, 1, 44, 45), 'salt', 1.6, 100.34, None, 40.43, 120.85, -0.05, 821.23, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:44:52.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:44:52.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:44:52.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:44:45, diff=7.240272s, valid=True
2026-06-04T01:44:52.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:44:52.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:44:52.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:45:12, diff=-19.756356s, valid=True
2026-06-04T01:44:52.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:44:52.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:44:52.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:44:42, diff=10.251605s, valid=True
2026-06-04T01:44:52.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:44:52.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:44:52.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:44:52.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:44:52.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:44:52.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:44:52.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:45:12, diff=-19.744776s, valid=True
2026-06-04T01:44:52.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:44:52.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:44:52.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:44:52.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104489.256016s, valid=True
2026-06-04T01:44:52.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:44:52.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:44:52.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:44:52.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:44:52.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:44:52.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:44:52.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:44:52.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:44:52.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:44:52.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:44:52.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:44:52.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:44:52.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:44:52.646 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:44:52.844 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:44:53.178 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:44:53.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:44:53.278 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:44:53.278 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:44:53.527 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:44:53.528 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:45:23.549 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:45:23.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:45:23.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:45:24.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:45:24.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:45:24.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:45:24.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:45:24.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:45:24.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:45:24.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:45:24.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:45:24.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:45:24.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:45:26.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:45:26.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:45:26.745 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:45:26.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:45:26.756 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:45:26.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:45:26.771 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:45:26.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:45:26.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:45:26.772 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:45:26.773 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:45:26.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:45:26.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:45:26.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:45:27.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:45:27.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:45:27.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:45:27.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:45:27.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:45:27.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:45:27.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:45:27.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:45:27.096 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:45:27.164 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:45:16
2026-06-04T01:45:27.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87603, datetime.datetime(2026, 6, 4, 1, 45, 16), datetime.datetime(2026, 6, 4, 1, 45, 15), 'salt', 1.67, 100.38, None, 48.62, 127.73, -0.05, 820.87, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:45:27.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:45:27.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:45:27.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:45:15, diff=12.170363s, valid=True
2026-06-04T01:45:27.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:45:27.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:45:27.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:45:12, diff=15.173379s, valid=True
2026-06-04T01:45:27.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:45:27.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:45:27.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:45:13, diff=14.180184s, valid=True
2026-06-04T01:45:27.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:45:27.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:45:27.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:45:27.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:45:27.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:45:27.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:45:27.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:45:12, diff=15.183227s, valid=True
2026-06-04T01:45:27.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:45:27.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:45:27.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:45:27.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104524.18388s, valid=True
2026-06-04T01:45:27.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:45:27.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:45:27.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:45:27.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:45:27.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:45:27.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:45:27.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:45:27.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:45:27.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:45:27.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:45:27.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:45:27.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:45:27.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:45:27.599 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:45:27.795 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:45:28.130 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:45:28.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:45:28.231 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:45:28.231 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:45:28.478 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:45:28.478 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:45:58.508 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:45:58.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:45:58.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:45:58.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:45:58.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:45:59.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:45:59.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:45:59.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:45:59.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:45:59.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:45:59.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:45:59.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:45:59.105 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:46:01.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:46:01.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:46:01.453 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:46:01.454 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:46:01.464 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:46:01.477 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:46:01.477 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:46:01.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:46:01.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:46:01.478 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:46:01.479 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:46:01.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:46:01.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:46:01.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:46:01.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:46:01.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:46:01.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:46:01.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:46:01.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:46:01.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:46:01.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:46:01.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:46:01.822 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:46:01.892 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:45:46
2026-06-04T01:46:01.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87604, datetime.datetime(2026, 6, 4, 1, 45, 46), datetime.datetime(2026, 6, 4, 1, 45, 45), 'salt', 1.67, 100.31, None, 41.63, 124.18, -0.04, 821.11, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:46:01.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:46:01.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:46:01.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:45:45, diff=16.898336s, valid=True
2026-06-04T01:46:01.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:46:01.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:46:01.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:46:12, diff=-10.098713s, valid=True
2026-06-04T01:46:01.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:46:01.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:46:01.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:45:43, diff=18.908145s, valid=True
2026-06-04T01:46:01.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:46:01.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:46:01.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:46:01.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:46:01.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:46:01.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:46:01.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:46:12, diff=-10.088689s, valid=True
2026-06-04T01:46:01.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:46:01.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:46:01.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:46:01.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104558.912s, valid=True
2026-06-04T01:46:01.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:46:01.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:46:01.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:46:01.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:46:01.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:46:01.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:46:01.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:46:01.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:46:01.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:46:02.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:46:02.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:46:02.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:46:02.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:46:02.297 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:46:02.493 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:46:02.827 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:46:02.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:46:02.928 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:46:02.928 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:46:03.103 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:46:03.103 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:46:33.133 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:46:33.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:46:33.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:46:33.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:46:33.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:46:33.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:46:33.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:46:33.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:46:33.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:46:33.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:46:33.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:46:33.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:46:33.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:46:36.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:46:36.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:46:36.392 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:46:36.392 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:46:36.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:46:36.415 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:46:36.416 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:46:36.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:46:36.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:46:36.417 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:46:36.417 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:46:36.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:46:36.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:46:36.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:46:36.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:46:36.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:46:36.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:46:36.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:46:36.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:46:36.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:46:36.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:46:36.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:46:36.774 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:46:36.863 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:46:16
2026-06-04T01:46:36.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87605, datetime.datetime(2026, 6, 4, 1, 46, 16), datetime.datetime(2026, 6, 4, 1, 46, 16), 'salt', 1.63, 100.38, None, 41.56, 123.43, -0.06, 821.11, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:46:36.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:46:36.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:46:36.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:46:16, diff=20.871386s, valid=True
2026-06-04T01:46:36.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:46:36.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:46:36.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:46:12, diff=24.874875s, valid=True
2026-06-04T01:46:36.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:46:36.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:46:36.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:46:13, diff=23.88302s, valid=True
2026-06-04T01:46:36.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:46:36.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:46:36.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:46:36.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:46:36.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:46:36.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:46:36.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:46:12, diff=24.886775s, valid=True
2026-06-04T01:46:36.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:46:36.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:46:36.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:46:36.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104593.887608s, valid=True
2026-06-04T01:46:36.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:46:36.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:46:36.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:46:36.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:46:36.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:46:36.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:46:36.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:46:36.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:46:36.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:46:37.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:46:37.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:46:37.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:46:37.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:46:37.208 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:46:37.405 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:46:37.739 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:46:37.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:46:37.841 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:46:37.841 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:46:38.044 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:46:38.044 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:47:08.051 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:47:08.051 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:47:08.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:47:08.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:47:08.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:47:08.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:47:08.831 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:47:08.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:47:08.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:47:08.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:47:08.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:47:08.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:47:08.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:47:11.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:47:11.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:47:11.558 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:47:11.559 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:47:11.568 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:47:11.580 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:47:11.581 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:47:11.581 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:47:11.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:47:11.582 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:47:11.582 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:47:11.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:47:11.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:47:11.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:47:11.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:47:11.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:47:11.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:47:11.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:47:11.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:47:11.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:47:11.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:47:11.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:47:11.908 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:47:11.986 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:46:47
2026-06-04T01:47:11.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87606, datetime.datetime(2026, 6, 4, 1, 46, 47), datetime.datetime(2026, 6, 4, 1, 46, 46), 'salt', 1.63, 100.31, None, 51.9, 115.63, -0.05, 821.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:47:11.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:47:11.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:47:11.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:46:46, diff=25.993291s, valid=True
2026-06-04T01:47:11.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:47:11.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:47:11.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:47:12, diff=-0.003253s, valid=True
2026-06-04T01:47:11.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:47:11.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:47:12.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:46:44, diff=28.004728s, valid=True
2026-06-04T01:47:12.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:47:12.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:47:12.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:47:12.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:47:12.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:47:12.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:47:12.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:47:12, diff=0.008419s, valid=True
2026-06-04T01:47:12.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:47:12.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:47:12.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:47:12.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104629.009242s, valid=True
2026-06-04T01:47:12.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:47:12.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:47:12.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:47:12.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:47:12.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:47:12.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:47:12.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:47:12.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:47:12.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:47:12.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:47:12.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:47:12.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:47:12.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:47:12.397 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:47:12.595 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:47:12.931 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:47:13.032 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:47:13.032 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:47:13.032 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:47:13.271 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:47:13.271 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:47:43.302 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:47:43.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:47:43.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:47:43.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:47:43.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:47:43.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:47:43.728 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:47:43.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:47:43.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:47:43.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:47:43.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:47:43.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:47:43.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:47:46.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:47:46.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:47:46.159 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:47:46.160 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:47:46.169 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:47:46.183 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:47:46.184 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:47:46.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:47:46.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:47:46.185 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:47:46.185 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:47:46.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:47:46.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:47:46.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:47:46.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:47:46.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:47:46.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:47:46.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:47:46.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:47:46.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:47:46.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:47:46.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:47:46.514 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:47:46.587 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:47:17
2026-06-04T01:47:46.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87607, datetime.datetime(2026, 6, 4, 1, 47, 17), datetime.datetime(2026, 6, 4, 1, 47, 16), 'salt', 1.57, 100.34, None, 49.15, 112.53, -0.05, 820.99, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:47:46.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:47:46.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:47:46.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:47:16, diff=30.594702s, valid=True
2026-06-04T01:47:46.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:47:46.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:47:46.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:47:12, diff=34.598189s, valid=True
2026-06-04T01:47:46.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:47:46.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:47:46.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:47:17, diff=29.606452s, valid=True
2026-06-04T01:47:46.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:47:46.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:47:46.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:47:46.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:47:46.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:47:46.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:47:46.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:47:12, diff=34.610313s, valid=True
2026-06-04T01:47:46.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:47:46.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:47:46.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:47:46.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104663.611133s, valid=True
2026-06-04T01:47:46.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:47:46.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:47:46.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:47:46.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:47:46.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:47:46.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:47:46.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:47:46.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:47:46.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:47:46.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:47:46.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:47:46.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:47:46.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:47:46.945 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:47:47.145 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:47:47.479 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:47:47.579 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:47:47.579 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:47:47.579 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:47:47.661 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:47:47.661 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:48:17.691 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:48:17.691 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:48:17.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:48:17.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:48:18.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:48:18.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:48:18.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:48:18.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:48:18.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:48:18.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:48:18.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:48:18.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:48:18.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:48:20.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:48:20.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:48:20.724 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:48:20.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:48:20.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:48:20.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:48:20.749 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:48:20.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:48:20.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:48:20.750 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:48:20.750 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:48:20.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:48:20.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:48:20.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:48:21.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:48:21.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:48:21.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:48:21.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:48:21.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:48:21.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:48:21.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:48:21.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:48:21.100 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:48:21.171 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:48:17
2026-06-04T01:48:21.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87609, datetime.datetime(2026, 6, 4, 1, 48, 17), datetime.datetime(2026, 6, 4, 1, 48, 17), 'salt', 1.67, 100.38, None, 40.51, 119.63, -0.05, 820.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:48:21.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:48:21.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:48:21.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:48:17, diff=4.178782s, valid=True
2026-06-04T01:48:21.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:48:21.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:48:21.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:48:12, diff=9.182176s, valid=True
2026-06-04T01:48:21.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:48:21.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:48:21.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:48:14, diff=7.191766s, valid=True
2026-06-04T01:48:21.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:48:21.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:48:21.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:48:21.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:48:21.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:48:21.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:48:21.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:48:12, diff=9.195438s, valid=True
2026-06-04T01:48:21.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:48:21.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:48:21.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:48:21.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104698.196244s, valid=True
2026-06-04T01:48:21.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:48:21.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:48:21.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:48:21.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:48:21.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:48:21.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:48:21.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:48:21.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:48:21.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:48:21.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:48:21.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:48:21.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:48:21.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:48:21.533 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:48:21.734 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:48:22.071 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:48:22.172 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:48:22.172 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:48:22.172 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:48:22.370 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:48:22.370 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:48:52.400 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:48:52.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:48:52.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:48:52.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:48:52.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:48:53.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:48:53.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:48:53.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:48:53.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:48:53.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:48:53.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:48:53.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:48:53.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:48:55.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:48:55.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:48:55.862 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:48:55.862 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:48:55.872 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:48:55.885 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:48:55.886 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:48:55.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:48:55.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:48:55.887 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:48:55.887 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:48:55.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:48:56.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:48:56.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:48:56.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:48:56.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:48:56.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:48:56.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:48:56.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:48:56.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:48:56.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:48:56.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:48:56.230 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:48:56.326 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:48:48
2026-06-04T01:48:56.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87610, datetime.datetime(2026, 6, 4, 1, 48, 48), datetime.datetime(2026, 6, 4, 1, 48, 47), 'salt', 1.63, 100.38, None, 50.81, 127.26, -0.06, 820.99, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:48:56.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:48:56.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:48:56.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:48:47, diff=9.333881s, valid=True
2026-06-04T01:48:56.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:48:56.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:48:56.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:49:12, diff=-15.662599s, valid=True
2026-06-04T01:48:56.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:48:56.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:48:56.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:48:45, diff=11.345702s, valid=True
2026-06-04T01:48:56.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:48:56.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:48:56.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:48:56.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:48:56.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:48:56.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:48:56.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:49:12, diff=-15.65043s, valid=True
2026-06-04T01:48:56.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:48:56.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:48:56.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:48:56.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104733.350417s, valid=True
2026-06-04T01:48:56.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:48:56.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:48:56.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:48:56.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:48:56.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:48:56.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:48:56.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:48:56.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:48:56.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:48:56.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:48:56.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:48:56.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:48:56.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:48:56.672 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:48:56.868 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:48:57.200 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:48:57.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:48:57.358 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:48:57.358 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:48:57.608 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:48:57.608 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:49:27.637 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:49:27.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:49:27.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:49:27.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:49:27.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:49:28.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:49:28.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:49:28.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:49:28.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:49:28.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:49:28.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:49:28.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:49:28.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:49:30.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:49:30.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:49:30.674 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:49:30.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:49:30.684 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:49:30.696 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:49:30.697 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:49:30.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:49:30.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:49:30.699 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:49:30.699 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:49:30.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:49:30.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:49:30.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:49:30.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:49:30.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:49:30.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:49:30.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:49:31.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:49:31.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:49:31.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:49:31.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:49:31.029 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:49:31.111 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:49:18
2026-06-04T01:49:31.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87611, datetime.datetime(2026, 6, 4, 1, 49, 18), datetime.datetime(2026, 6, 4, 1, 49, 17), 'salt', 1.63, 100.35, None, 50.67, 123.48, -0.05, 821.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:49:31.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:49:31.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:49:31.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:49:17, diff=14.118433s, valid=True
2026-06-04T01:49:31.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:49:31.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:49:31.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:49:12, diff=19.121934s, valid=True
2026-06-04T01:49:31.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:49:31.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:49:31.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:49:15, diff=16.130134s, valid=True
2026-06-04T01:49:31.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:49:31.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:49:31.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:49:31.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:49:31.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:49:31.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:49:31.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:49:12, diff=19.133851s, valid=True
2026-06-04T01:49:31.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:49:31.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:49:31.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:49:31.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104768.134669s, valid=True
2026-06-04T01:49:31.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:49:31.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:49:31.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:49:31.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:49:31.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:49:31.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:49:31.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:49:31.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:49:31.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:49:31.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:49:31.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:49:31.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:49:31.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:49:31.455 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:49:31.652 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:49:31.985 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:49:32.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:49:32.085 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:49:32.085 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:49:32.321 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:49:32.321 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:50:02.331 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:50:02.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:50:02.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:50:02.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:50:02.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:50:02.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:50:02.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:50:02.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:50:02.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:50:02.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:50:02.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:50:02.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:50:02.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:50:05.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:50:05.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:50:05.269 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:50:05.269 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:50:05.279 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:50:05.292 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:50:05.293 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:50:05.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:50:05.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:50:05.294 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:50:05.294 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:50:05.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:50:05.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:50:05.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:50:05.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:50:05.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:50:05.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:50:05.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:50:05.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:50:05.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:50:05.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:50:05.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:50:05.638 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:50:05.720 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:49:48
2026-06-04T01:50:05.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87612, datetime.datetime(2026, 6, 4, 1, 49, 48), datetime.datetime(2026, 6, 4, 1, 49, 47), 'salt', 1.67, 100.38, None, 46.64, 127.82, -0.05, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:50:05.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:50:05.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:50:05.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:49:47, diff=18.72828s, valid=True
2026-06-04T01:50:05.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:50:05.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:50:05.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:50:12, diff=-6.268247s, valid=True
2026-06-04T01:50:05.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:50:05.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:50:05.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:49:45, diff=20.73994s, valid=True
2026-06-04T01:50:05.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:50:05.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:50:05.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:50:05.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:50:05.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:50:05.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:50:05.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:50:12, diff=-6.256332s, valid=True
2026-06-04T01:50:05.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:50:05.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:50:05.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:50:05.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104802.744463s, valid=True
2026-06-04T01:50:05.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:50:05.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:50:05.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:50:05.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:50:05.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:50:05.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:50:05.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:50:05.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:50:05.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:50:05.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:50:05.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:50:05.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:50:06.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:50:06.066 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:50:06.360 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:50:06.692 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:50:06.792 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:50:06.792 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:50:06.792 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:50:07.048 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:50:07.049 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:50:37.073 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:50:37.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:50:37.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:50:37.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:50:37.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:50:37.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:50:37.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:50:37.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:50:37.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:50:37.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:50:37.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:50:37.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:50:37.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:50:40.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:50:40.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:50:40.138 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:50:40.138 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:50:40.147 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:50:40.159 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:50:40.159 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:50:40.160 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:50:40.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:50:40.160 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:50:40.160 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:50:40.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:50:40.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:50:40.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:50:40.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:50:40.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:50:40.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:50:40.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:50:40.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:50:40.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:50:40.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:50:40.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:50:40.443 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:50:40.514 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:50:18
2026-06-04T01:50:40.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87613, datetime.datetime(2026, 6, 4, 1, 50, 18), datetime.datetime(2026, 6, 4, 1, 50, 18), 'salt', 1.7, 100.41, None, 38.28, 121.46, -0.06, 821.29, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:50:40.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:50:40.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:50:40.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:50:18, diff=22.521233s, valid=True
2026-06-04T01:50:40.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:50:40.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:50:40.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:50:12, diff=28.524349s, valid=True
2026-06-04T01:50:40.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:50:40.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:50:40.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:50:16, diff=24.531632s, valid=True
2026-06-04T01:50:40.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:50:40.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:50:40.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:50:40.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:50:40.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:50:40.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:50:40.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:50:12, diff=28.534971s, valid=True
2026-06-04T01:50:40.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:50:40.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:50:40.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:50:40.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104837.535765s, valid=True
2026-06-04T01:50:40.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:50:40.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:50:40.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:50:40.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:50:40.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:50:40.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:50:40.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:50:40.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:50:40.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:50:40.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:50:40.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:50:40.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:50:40.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:50:40.855 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:50:41.061 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:50:41.402 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:50:41.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:50:41.504 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:50:41.504 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:50:41.659 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:50:41.659 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:51:11.679 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:51:11.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:51:11.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:51:11.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:51:11.831 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:51:12.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:51:12.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:51:12.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:51:12.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:51:12.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:51:12.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:51:12.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:51:12.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:51:14.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:51:14.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:51:14.900 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:51:14.900 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:51:14.912 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:51:14.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:51:14.925 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:51:14.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:51:14.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:51:14.925 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:51:14.925 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:51:14.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:51:15.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:51:15.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:51:15.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:51:15.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:51:15.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:51:15.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:51:15.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T01:51:15.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:51:15.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:51:15.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:51:15.260 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:51:15.333 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:50:49
2026-06-04T01:51:15.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87614, datetime.datetime(2026, 6, 4, 1, 50, 49), datetime.datetime(2026, 6, 4, 1, 50, 48), 'salt', 1.6, 100.31, None, 41.32, 140.39, -0.05, 821.05, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:51:15.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:51:15.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:51:15.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:50:48, diff=27.340741s, valid=True
2026-06-04T01:51:15.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:51:15.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:51:15.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:51:12, diff=3.344247s, valid=True
2026-06-04T01:51:15.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:51:15.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:51:15.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:50:46, diff=29.352475s, valid=True
2026-06-04T01:51:15.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:51:15.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:51:15.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:51:15.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:51:15.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:51:15.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T01:51:15.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:51:12, diff=3.356185s, valid=True
2026-06-04T01:51:15.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:51:15.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:51:15.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:51:15.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104872.356989s, valid=True
2026-06-04T01:51:15.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:51:15.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:51:15.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:51:15.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:51:15.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:51:15.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:51:15.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:51:15.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:51:15.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:51:15.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:51:15.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:51:15.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:51:15.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:51:15.754 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:51:15.958 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:51:16.303 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:51:16.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:51:16.405 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:51:16.405 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:51:16.562 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:51:16.562 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:51:46.593 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:51:46.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:51:46.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:51:47.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:51:47.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:51:47.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:51:47.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:51:47.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:51:47.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:51:47.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:51:47.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:51:47.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:51:47.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:51:50.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:51:50.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:51:50.368 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:51:50.368 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:51:50.376 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:51:50.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:51:50.389 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:51:50.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:51:50.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:51:50.391 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:51:50.391 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:51:50.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:51:50.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:51:50.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:51:50.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:51:50.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:51:50.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:51:50.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:51:50.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:51:50.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:51:50.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:51:50.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:51:50.719 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:51:50.790 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:51:49
2026-06-04T01:51:50.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87616, datetime.datetime(2026, 6, 4, 1, 51, 49), datetime.datetime(2026, 6, 4, 1, 51, 48), 'salt', 1.63, 100.38, None, 43.86, 116.29, -0.06, 821.29, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:51:50.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:51:50.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:51:50.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:51:48, diff=2.797824s, valid=True
2026-06-04T01:51:50.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:51:50.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:51:50.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:52:12, diff=-21.19863s, valid=True
2026-06-04T01:51:50.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:51:50.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:51:50.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:51:46, diff=4.809432s, valid=True
2026-06-04T01:51:50.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:51:50.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:51:50.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:51:50.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:51:50.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:51:50.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:51:50.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:52:12, diff=-21.186835s, valid=True
2026-06-04T01:51:50.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:51:50.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:51:50.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:51:50.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104907.81398s, valid=True
2026-06-04T01:51:50.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:51:50.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:51:50.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:51:50.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:51:50.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:51:50.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:51:50.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:51:50.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:51:50.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:51:50.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:51:51.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:51:51.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:51:51.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:51:51.136 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:51:51.341 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:51:51.682 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:51:51.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:51:51.786 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:51:51.786 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:51:52.019 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:51:52.019 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:52:22.023 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:52:22.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:52:22.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:52:22.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:52:22.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:52:22.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:52:22.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:52:22.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:52:22.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:52:22.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:52:22.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:52:22.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:52:22.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:52:25.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:52:25.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:52:25.054 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:52:25.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:52:25.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:52:25.077 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:52:25.078 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:52:25.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:52:25.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:52:25.079 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:52:25.079 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:52:25.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:52:25.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:52:25.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:52:25.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:52:25.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:52:25.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:52:25.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:52:25.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T01:52:25.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:52:25.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:52:25.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:52:25.415 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:52:25.489 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:52:20
2026-06-04T01:52:25.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87617, datetime.datetime(2026, 6, 4, 1, 52, 20), datetime.datetime(2026, 6, 4, 1, 52, 19), 'salt', 1.6, 100.28, None, 36.8, 124.42, -0.04, 821.23, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:52:25.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:52:25.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:52:25.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:52:19, diff=6.497088s, valid=True
2026-06-04T01:52:25.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:52:25.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:52:25.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:52:12, diff=13.500595s, valid=True
2026-06-04T01:52:25.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:52:25.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:52:25.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:52:17, diff=8.508617s, valid=True
2026-06-04T01:52:25.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:52:25.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:52:25.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:52:25.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:52:25.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:52:25.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T01:52:25.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:52:12, diff=13.5123s, valid=True
2026-06-04T01:52:25.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:52:25.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:52:25.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:52:25.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104942.513106s, valid=True
2026-06-04T01:52:25.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:52:25.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:52:25.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:52:25.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:52:25.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:52:25.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:52:25.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:52:25.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:52:25.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:52:25.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:52:25.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:52:25.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:52:25.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:52:25.902 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:52:26.107 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:52:26.450 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:52:26.552 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:52:26.553 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:52:26.553 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:52:26.815 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:52:26.815 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:52:56.833 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:52:56.833 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:52:56.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:52:57.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:52:57.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:52:57.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:52:57.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:52:57.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:52:57.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:52:57.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:52:57.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:52:57.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:52:57.477 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:52:59.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:52:59.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:52:59.895 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:52:59.895 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:52:59.904 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:52:59.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:52:59.916 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:52:59.916 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:52:59.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:52:59.916 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:52:59.916 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:52:59.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:53:00.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:53:00.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:53:00.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:53:00.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:53:00.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T01:53:00.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:53:00.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T01:53:00.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:53:00.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:53:00.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:53:00.202 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:53:00.272 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:52:50
2026-06-04T01:53:00.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87618, datetime.datetime(2026, 6, 4, 1, 52, 50), datetime.datetime(2026, 6, 4, 1, 52, 49), 'salt', 1.73, 100.34, None, 49.64, 128.79, -0.05, 821.11, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:53:00.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:53:00.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:53:00.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:52:49, diff=11.278978s, valid=True
2026-06-04T01:53:00.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:53:00.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T01:53:00.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:53:12, diff=-11.717838s, valid=True
2026-06-04T01:53:00.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:53:00.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:53:00.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:52:47, diff=13.289654s, valid=True
2026-06-04T01:53:00.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:53:00.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:53:00.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:53:00.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:53:00.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:53:00.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T01:53:00.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:53:12, diff=-11.706971s, valid=True
2026-06-04T01:53:00.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:53:00.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:53:00.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:53:00.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=104977.29378s, valid=True
2026-06-04T01:53:00.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:53:00.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:53:00.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:53:00.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:53:00.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:53:00.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:53:00.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:53:00.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:53:00.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:53:00.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:53:00.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:53:00.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:53:00.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:53:00.611 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:53:00.817 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:53:01.163 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:53:01.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:53:01.265 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:53:01.265 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:53:01.419 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:53:01.420 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:53:31.428 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:53:31.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:53:31.429 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:53:31.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:53:31.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:53:31.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:53:31.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:53:32.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:53:32.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:53:32.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:53:32.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:53:32.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:53:32.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:53:34.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:53:34.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:53:34.470 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:53:34.470 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:53:34.480 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:53:34.493 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:53:34.493 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:53:34.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:53:34.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:53:34.495 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:53:34.495 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:53:34.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:53:34.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:53:34.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:53:34.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:53:34.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:53:34.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T01:53:34.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:53:34.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T01:53:34.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:53:34.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:53:34.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:53:34.907 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:53:34.979 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:53:20
2026-06-04T01:53:34.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87619, datetime.datetime(2026, 6, 4, 1, 53, 20), datetime.datetime(2026, 6, 4, 1, 53, 19), 'salt', 1.67, 100.31, None, 52.18, 122.8, -0.04, 821.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:53:34.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:53:34.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:53:34.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:53:19, diff=15.985453s, valid=True
2026-06-04T01:53:34.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:53:34.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T01:53:34.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:53:12, diff=22.988311s, valid=True
2026-06-04T01:53:34.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:53:34.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:53:34.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:53:17, diff=17.994844s, valid=True
2026-06-04T01:53:34.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:53:34.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:53:34.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:53:34.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:53:34.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:53:34.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T01:53:34.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:53:12, diff=22.997871s, valid=True
2026-06-04T01:53:34.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:53:34.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:53:34.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:53:34.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105011.998522s, valid=True
2026-06-04T01:53:35.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:53:35.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:53:35.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:53:35.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:53:35.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:53:35.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:53:35.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:53:35.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:53:35.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:53:35.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:53:35.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:53:35.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:53:35.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:53:35.312 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:53:35.517 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:53:35.858 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:53:35.960 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:53:35.960 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:53:35.960 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:53:36.217 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:53:36.217 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:54:06.239 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:54:06.240 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:54:06.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:54:06.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:54:06.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:54:06.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:54:06.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:54:06.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:54:06.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:54:06.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:54:06.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:54:06.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:54:06.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:54:09.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:54:09.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:54:09.210 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:54:09.210 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:54:09.221 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:54:09.233 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:54:09.234 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:54:09.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:54:09.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:54:09.235 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:54:09.235 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:54:09.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:54:09.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:54:09.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:54:09.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:54:09.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:54:09.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T01:54:09.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:54:09.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T01:54:09.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:54:09.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:54:09.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:54:09.561 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:54:09.636 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:53:50
2026-06-04T01:54:09.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87620, datetime.datetime(2026, 6, 4, 1, 53, 50), datetime.datetime(2026, 6, 4, 1, 53, 50), 'salt', 1.63, 100.34, None, 51.76, 120.19, -0.05, 821.11, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:54:09.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:54:09.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:54:09.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:53:50, diff=19.643919s, valid=True
2026-06-04T01:54:09.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:54:09.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T01:54:09.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:54:12, diff=-2.352614s, valid=True
2026-06-04T01:54:09.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:54:09.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:54:09.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:53:48, diff=21.655471s, valid=True
2026-06-04T01:54:09.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:54:09.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:54:09.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:54:09.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:54:09.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:54:09.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T01:54:09.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:54:12, diff=-2.340777s, valid=True
2026-06-04T01:54:09.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:54:09.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:54:09.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:54:09.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105046.660038s, valid=True
2026-06-04T01:54:09.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:54:09.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:54:09.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:54:09.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:54:09.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:54:09.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:54:09.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:54:09.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:54:09.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:54:09.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:54:09.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:54:09.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:54:09.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:54:10.000 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:54:10.241 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:54:10.596 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:54:10.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:54:10.700 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:54:10.700 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:54:10.893 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:54:10.893 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:54:40.922 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:54:40.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:54:40.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:54:41.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:54:41.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:54:41.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:54:41.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:54:41.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:54:41.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:54:41.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:54:41.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:54:41.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:54:41.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:54:43.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:54:43.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:54:43.920 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:54:43.920 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:54:43.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:54:43.939 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:54:43.939 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:54:43.939 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:54:43.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:54:43.940 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:54:43.940 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:54:43.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:54:44.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:54:44.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:54:44.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:54:44.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:54:44.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T01:54:44.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:54:44.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T01:54:44.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:54:44.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:54:44.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:54:44.219 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:54:44.296 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:54:21
2026-06-04T01:54:44.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87621, datetime.datetime(2026, 6, 4, 1, 54, 21), datetime.datetime(2026, 6, 4, 1, 54, 20), 'salt', 1.63, 100.34, None, 49.36, 121.25, -0.05, 821.35, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:54:44.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:54:44.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:54:44.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:54:20, diff=24.303323s, valid=True
2026-06-04T01:54:44.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:54:44.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T01:54:44.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:54:12, diff=32.30657s, valid=True
2026-06-04T01:54:44.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:54:44.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:54:44.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:54:18, diff=26.314226s, valid=True
2026-06-04T01:54:44.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:54:44.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:54:44.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:54:44.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:54:44.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:54:44.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T01:54:44.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:54:12, diff=32.317789s, valid=True
2026-06-04T01:54:44.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:54:44.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:54:44.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:54:44.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105081.31855s, valid=True
2026-06-04T01:54:44.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:54:44.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:54:44.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:54:44.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:54:44.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:54:44.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:54:44.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:54:44.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:54:44.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:54:44.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:54:44.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:54:44.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:54:44.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:54:44.639 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:54:44.848 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:54:45.198 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:54:45.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:54:45.302 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:54:45.302 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:54:45.491 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:54:45.492 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:55:15.498 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:55:15.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:55:15.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:55:15.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:55:15.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:55:16.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:55:16.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:55:16.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:55:16.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:55:16.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:55:16.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:55:16.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:55:16.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:55:18.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:55:18.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:55:18.467 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:55:18.467 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:55:18.478 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:55:18.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:55:18.490 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:55:18.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:55:18.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:55:18.490 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:55:18.490 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:55:18.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:55:18.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:55:18.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:55:18.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:55:18.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:55:18.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:55:18.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:55:18.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:55:18.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:55:18.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:55:18.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:55:18.856 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:55:18.929 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:54:51
2026-06-04T01:55:18.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87622, datetime.datetime(2026, 6, 4, 1, 54, 51), datetime.datetime(2026, 6, 4, 1, 54, 50), 'salt', 1.73, 100.48, None, 48.51, 133.63, -0.07, 821.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:55:18.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:55:18.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:55:18.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:54:50, diff=28.93636s, valid=True
2026-06-04T01:55:18.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:55:18.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:55:18.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:55:12, diff=6.939861s, valid=True
2026-06-04T01:55:18.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:55:18.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:55:18.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:54:48, diff=30.947983s, valid=True
2026-06-04T01:55:18.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:55:18.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:55:18.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:55:18.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:55:18.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:55:18.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:55:18.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:55:12, diff=6.951697s, valid=True
2026-06-04T01:55:18.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:55:18.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:55:18.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:55:18.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105115.952502s, valid=True
2026-06-04T01:55:18.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:55:18.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:55:18.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:55:18.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:55:18.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:55:19.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:55:19.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:55:19.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:55:19.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:55:19.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:55:19.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:55:19.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:55:19.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:55:19.274 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:55:19.481 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:55:19.888 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:55:20.015 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:55:20.015 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:55:20.015 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:55:20.201 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:55:20.202 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:55:50.232 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:55:50.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:55:50.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:55:50.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:55:50.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:55:50.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:55:50.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:55:50.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:55:50.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:55:51.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:55:51.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:55:51.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:55:51.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:55:53.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:55:53.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:55:53.854 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:55:53.854 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:55:53.860 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:55:53.872 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:55:53.872 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:55:53.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:55:53.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:55:53.874 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:55:53.874 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:55:53.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:55:54.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:55:54.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:55:54.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:55:54.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:55:54.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:55:54.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:55:54.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:55:54.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:55:54.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:55:54.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:55:54.202 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:55:54.271 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:55:51
2026-06-04T01:55:54.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87624, datetime.datetime(2026, 6, 4, 1, 55, 51), datetime.datetime(2026, 6, 4, 1, 55, 51), 'salt', 1.57, 100.31, None, 47.17, 122.21, -0.04, 821.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:55:54.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:55:54.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:55:54.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:55:51, diff=3.278634s, valid=True
2026-06-04T01:55:54.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:55:54.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:55:54.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:56:12, diff=-17.717989s, valid=True
2026-06-04T01:55:54.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:55:54.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:55:54.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:55:49, diff=5.289856s, valid=True
2026-06-04T01:55:54.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:55:54.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:55:54.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:55:54.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:55:54.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:55:54.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:55:54.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:56:12, diff=-17.706517s, valid=True
2026-06-04T01:55:54.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:55:54.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:55:54.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:55:54.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105151.294359s, valid=True
2026-06-04T01:55:54.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:55:54.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:55:54.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:55:54.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:55:54.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:55:54.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:55:54.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:55:54.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:55:54.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:55:54.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:55:54.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:55:54.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:55:54.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:55:54.614 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:55:54.821 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:55:55.161 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:55:55.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:55:55.263 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:55:55.263 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:55:56.702 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:55:56.702 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:56:26.718 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:56:26.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:56:26.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:56:27.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:56:27.052 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:56:27.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:56:27.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:56:27.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:56:27.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:56:27.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:56:27.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:56:27.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:56:27.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:56:29.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:56:29.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:56:29.764 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:56:29.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:56:29.775 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:56:29.788 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:56:29.788 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:56:29.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:56:29.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:56:29.789 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:56:29.790 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:56:29.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:56:29.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:56:29.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:56:29.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:56:29.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:56:30.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:56:30.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:56:30.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:56:30.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:56:30.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:56:30.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:56:30.095 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:56:30.182 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:56:22
2026-06-04T01:56:30.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87625, datetime.datetime(2026, 6, 4, 1, 56, 22), datetime.datetime(2026, 6, 4, 1, 56, 21), 'salt', 1.67, 100.44, None, 50.91, 123.95, -0.06, 821.29, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:56:30.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:56:30.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:56:30.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:56:21, diff=9.189361s, valid=True
2026-06-04T01:56:30.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:56:30.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:56:30.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:56:12, diff=18.192631s, valid=True
2026-06-04T01:56:30.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:56:30.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:56:30.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:56:19, diff=11.200187s, valid=True
2026-06-04T01:56:30.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:56:30.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:56:30.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:56:30.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:56:30.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:56:30.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:56:30.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:56:12, diff=18.203771s, valid=True
2026-06-04T01:56:30.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:56:30.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:56:30.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:56:30.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105187.204503s, valid=True
2026-06-04T01:56:30.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:56:30.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:56:30.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:56:30.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:56:30.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:56:30.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:56:30.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:56:30.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:56:30.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:56:30.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:56:30.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:56:30.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:56:30.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:56:30.523 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:56:30.808 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:56:31.149 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:56:31.251 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:56:31.251 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:56:31.251 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:56:31.451 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:56:31.451 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:57:01.464 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:57:01.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:57:01.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:57:01.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:57:01.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:57:02.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:57:02.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:57:02.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:57:02.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:57:02.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:57:02.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:57:02.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:57:02.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:57:04.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:57:04.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:57:04.406 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:57:04.407 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:57:04.417 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:57:04.430 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:57:04.430 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:57:04.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:57:04.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:57:04.431 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:57:04.432 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:57:04.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:57:04.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:57:04.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:57:04.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:57:04.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:57:04.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:57:04.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:57:04.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:57:04.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:57:04.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:57:04.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:57:04.765 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:57:04.846 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:56:52
2026-06-04T01:57:04.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87626, datetime.datetime(2026, 6, 4, 1, 56, 52), datetime.datetime(2026, 6, 4, 1, 56, 51), 'salt', 1.73, 100.38, None, 43.22, 118.69, -0.06, 821.17, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:57:04.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:57:04.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:57:04.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:56:51, diff=13.853105s, valid=True
2026-06-04T01:57:04.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:57:04.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:57:04.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:57:12, diff=-7.144061s, valid=True
2026-06-04T01:57:04.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:57:04.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:57:04.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:56:49, diff=15.863532s, valid=True
2026-06-04T01:57:04.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:57:04.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:57:04.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:57:04.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:57:04.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:57:04.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:57:04.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:57:12, diff=-7.132869s, valid=True
2026-06-04T01:57:04.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:57:04.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:57:04.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:57:04.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105221.867911s, valid=True
2026-06-04T01:57:04.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:57:04.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:57:04.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:57:04.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:57:04.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:57:04.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:57:04.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:57:04.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:57:04.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:57:05.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:57:05.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:57:05.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:57:05.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:57:05.214 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:57:05.419 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:57:05.761 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:57:05.863 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:57:05.863 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:57:05.864 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:57:06.054 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:57:06.054 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:57:36.084 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:57:36.084 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:57:36.084 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:57:36.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:57:36.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:57:36.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:57:36.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:57:36.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:57:36.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:57:36.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:57:36.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:57:36.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:57:36.674 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:57:39.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:57:39.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:57:39.061 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:57:39.061 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:57:39.071 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:57:39.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:57:39.084 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:57:39.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:57:39.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:57:39.085 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:57:39.086 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:57:39.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:57:39.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:57:39.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:57:39.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:57:39.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:57:39.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:57:39.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:57:39.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:57:39.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:57:39.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:57:39.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:57:39.418 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:57:39.494 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:57:22
2026-06-04T01:57:39.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87627, datetime.datetime(2026, 6, 4, 1, 57, 22), datetime.datetime(2026, 6, 4, 1, 57, 21), 'salt', 1.77, 100.44, None, 58.5, 124.46, -0.06, 821.05, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:57:39.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:57:39.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:57:39.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:57:21, diff=18.501423s, valid=True
2026-06-04T01:57:39.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:57:39.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:57:39.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:57:12, diff=27.504975s, valid=True
2026-06-04T01:57:39.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:57:39.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:57:39.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:57:19, diff=20.51325s, valid=True
2026-06-04T01:57:39.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:57:39.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:57:39.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:57:39.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:57:39.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:57:39.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:57:39.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:57:12, diff=27.517073s, valid=True
2026-06-04T01:57:39.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:57:39.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:57:39.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:57:39.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105256.517893s, valid=True
2026-06-04T01:57:39.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:57:39.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:57:39.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:57:39.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:57:39.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:57:39.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:57:39.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:57:39.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:57:39.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:57:39.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:57:39.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:57:39.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:57:39.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:57:39.931 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:57:40.156 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:57:40.501 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:57:40.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:57:40.603 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:57:40.603 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:57:40.792 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:57:40.792 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:58:10.806 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:58:10.806 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:58:10.806 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:58:11.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:58:11.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:58:11.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:58:11.545 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:58:11.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:58:11.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:58:11.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:58:11.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:58:11.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:58:11.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:58:13.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:58:13.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:58:13.919 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:58:13.919 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:58:13.929 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:58:13.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:58:13.943 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:58:13.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:58:13.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:58:13.944 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:58:13.944 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:58:13.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:58:14.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:58:14.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:58:14.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:58:14.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:58:14.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:58:14.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:58:14.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:58:14.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:58:14.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:58:14.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:58:14.295 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:58:14.369 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:57:52
2026-06-04T01:58:14.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87628, datetime.datetime(2026, 6, 4, 1, 57, 52), datetime.datetime(2026, 6, 4, 1, 57, 52), 'salt', 1.73, 100.38, None, 53.56, 127.64, -0.06, 821.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:58:14.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:58:14.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:58:14.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:57:52, diff=22.376196s, valid=True
2026-06-04T01:58:14.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:58:14.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:58:14.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:58:12, diff=2.379353s, valid=True
2026-06-04T01:58:14.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:58:14.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:58:14.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:57:50, diff=24.386721s, valid=True
2026-06-04T01:58:14.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:58:14.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:58:14.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:58:14.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:58:14.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:58:14.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:58:14.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:58:12, diff=2.390101s, valid=True
2026-06-04T01:58:14.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:58:14.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:58:14.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:58:14.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105291.390855s, valid=True
2026-06-04T01:58:14.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:58:14.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:58:14.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:58:14.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:58:14.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:58:14.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:58:14.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:58:14.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:58:14.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:58:14.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:58:14.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:58:14.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:58:14.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:58:14.715 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:58:14.921 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:58:15.264 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:58:15.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:58:15.366 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:58:15.366 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:58:15.606 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:58:15.606 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:58:45.629 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:58:45.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:58:45.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:58:45.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:58:45.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:58:46.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:58:46.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:58:46.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:58:46.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:58:46.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:58:46.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:58:46.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:58:46.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:58:48.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:58:48.901 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:58:48.902 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:58:48.902 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:58:48.911 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:58:48.923 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:58:48.924 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:58:48.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:58:48.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:58:48.925 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:58:48.925 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:58:48.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:58:49.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T01:58:49.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:58:49.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T01:58:49.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:58:49.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T01:58:49.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:58:49.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T01:58:49.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:58:49.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:58:49.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:58:49.276 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:58:49.351 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:58:23
2026-06-04T01:58:49.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87629, datetime.datetime(2026, 6, 4, 1, 58, 23), datetime.datetime(2026, 6, 4, 1, 58, 22), 'salt', 1.63, 100.41, None, 45.06, 124.96, -0.06, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T01:58:49.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:58:49.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T01:58:49.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:58:22, diff=27.357288s, valid=True
2026-06-04T01:58:49.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:58:49.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T01:58:49.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:58:12, diff=37.360163s, valid=True
2026-06-04T01:58:49.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:58:49.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T01:58:49.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:58:20, diff=29.366824s, valid=True
2026-06-04T01:58:49.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:58:49.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:58:49.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:58:49.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:58:49.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:58:49.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T01:58:49.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:58:12, diff=37.369902s, valid=True
2026-06-04T01:58:49.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:58:49.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:58:49.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:58:49.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105326.370558s, valid=True
2026-06-04T01:58:49.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:58:49.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:58:49.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:58:49.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:58:49.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:58:49.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:58:49.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:58:49.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:58:49.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:58:49.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:58:49.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:58:49.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:58:49.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:58:49.764 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:58:49.983 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:58:50.329 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:58:50.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:58:50.431 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:58:50.431 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:58:50.693 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:58:50.694 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:59:20.724 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:59:20.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:59:20.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:59:21.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:59:21.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:59:21.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:59:21.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:59:21.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:59:21.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:59:21.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:59:21.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:59:21.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:59:21.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:59:23.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:59:23.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:59:23.783 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:59:23.783 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:59:23.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:59:23.802 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:59:23.803 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:59:23.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:59:23.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:59:23.803 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:59:23.803 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:59:23.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:59:23.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:59:23.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:59:24.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:59:24.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:59:24.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:59:24.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:59:24.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:59:24.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:59:24.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:59:24.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:59:24.119 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:59:24.202 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:59:23
2026-06-04T01:59:24.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87631, datetime.datetime(2026, 6, 4, 1, 59, 23), datetime.datetime(2026, 6, 4, 1, 59, 23), 'salt', 1.67, 100.35, None, 42.34, 119.58, -0.05, 821.29, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:59:24.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:59:24.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:59:24.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:59:23, diff=1.210308s, valid=True
2026-06-04T01:59:24.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:59:24.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:59:24.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:59:12, diff=12.213707s, valid=True
2026-06-04T01:59:24.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:59:24.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:59:24.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:59:20, diff=4.22148s, valid=True
2026-06-04T01:59:24.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:59:24.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:59:24.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:59:24.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:59:24.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:59:24.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:59:24.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:59:12, diff=12.225135s, valid=True
2026-06-04T01:59:24.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:59:24.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:59:24.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:59:24.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105361.225926s, valid=True
2026-06-04T01:59:24.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:59:24.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:59:24.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:59:24.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:59:24.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:59:24.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:59:24.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:59:24.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:59:24.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:59:24.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:59:24.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:59:24.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:59:24.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:59:24.547 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:59:24.753 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:59:25.096 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:59:25.198 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T01:59:25.198 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T01:59:25.198 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T01:59:25.455 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T01:59:25.456 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T01:59:55.485 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T01:59:55.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T01:59:55.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T01:59:55.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T01:59:55.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T01:59:56.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T01:59:56.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T01:59:56.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T01:59:56.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T01:59:56.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T01:59:56.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T01:59:56.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T01:59:56.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T01:59:58.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T01:59:58.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T01:59:58.505 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T01:59:58.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T01:59:58.515 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T01:59:58.528 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T01:59:58.529 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T01:59:58.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T01:59:58.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T01:59:58.530 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T01:59:58.530 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T01:59:58.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T01:59:58.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T01:59:58.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T01:59:58.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T01:59:58.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:59:58.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:59:58.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T01:59:58.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T01:59:58.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T01:59:58.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T01:59:58.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T01:59:58.887 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T01:59:58.968 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 01:59:54
2026-06-04T01:59:58.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87632, datetime.datetime(2026, 6, 4, 1, 59, 54), datetime.datetime(2026, 6, 4, 1, 59, 53), 'salt', 1.7, 100.35, None, 40.26, 139.17, -0.05, 821.29, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T01:59:58.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T01:59:58.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T01:59:58.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:59:53, diff=5.975864s, valid=True
2026-06-04T01:59:58.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T01:59:58.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:59:58.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:00:12, diff=-13.020654s, valid=True
2026-06-04T01:59:58.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T01:59:58.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T01:59:58.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 01:59:51, diff=7.987555s, valid=True
2026-06-04T01:59:58.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T01:59:58.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:59:58.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T01:59:58.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T01:59:58.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T01:59:58.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T01:59:58.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:00:12, diff=-13.008706s, valid=True
2026-06-04T01:59:58.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T01:59:58.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T01:59:58.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T01:59:58.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105395.992109s, valid=True
2026-06-04T01:59:58.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T01:59:58.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T01:59:58.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T01:59:58.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T01:59:58.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T01:59:59.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T01:59:59.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T01:59:59.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T01:59:59.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T01:59:59.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T01:59:59.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T01:59:59.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T01:59:59.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T01:59:59.380 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T01:59:59.586 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T01:59:59.936 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:00:00.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:00:00.043 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:00:00.043 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:00:00.194 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:00:00.194 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:00:30.197 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:00:30.197 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:00:30.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:00:30.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:00:30.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:00:30.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:00:30.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:00:30.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:00:30.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:00:30.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:00:30.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:00:30.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:00:30.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:00:33.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:00:33.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:00:33.188 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:00:33.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:00:33.199 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:00:33.211 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:00:33.212 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:00:33.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:00:33.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:00:33.213 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:00:33.213 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:00:33.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:00:33.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:00:33.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:00:33.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:00:33.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:00:33.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:00:33.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:00:33.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:00:33.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:00:33.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:00:33.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:00:33.564 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:00:33.642 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:00:24
2026-06-04T02:00:33.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87633, datetime.datetime(2026, 6, 4, 2, 0, 24), datetime.datetime(2026, 6, 4, 2, 0, 23), 'salt', 1.73, 100.35, None, 35.28, 124.75, -0.05, 821.17, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:00:33.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:00:33.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:00:33.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:00:23, diff=10.6496s, valid=True
2026-06-04T02:00:33.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:00:33.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:00:33.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:00:12, diff=21.653084s, valid=True
2026-06-04T02:00:33.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:00:33.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:00:33.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:00:22, diff=11.661227s, valid=True
2026-06-04T02:00:33.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:00:33.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:00:33.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:00:33.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:00:33.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:00:33.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:00:33.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:00:12, diff=21.664968s, valid=True
2026-06-04T02:00:33.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:00:33.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:00:33.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:00:33.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105430.665775s, valid=True
2026-06-04T02:00:33.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:00:33.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:00:33.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:00:33.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:00:33.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:00:33.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:00:33.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:00:33.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:00:33.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:00:33.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:00:33.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:00:33.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:00:33.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:00:33.988 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:00:34.196 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:00:34.540 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:00:34.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:00:34.642 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:00:34.642 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:00:34.899 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:00:34.900 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:01:04.929 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:01:04.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:01:04.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:01:05.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:01:05.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:01:05.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:01:05.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:01:05.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:01:05.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:01:05.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:01:05.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:01:05.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:01:05.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:01:08.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:01:08.113 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:01:08.114 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:01:08.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:01:08.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:01:08.138 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:01:08.138 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:01:08.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:01:08.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:01:08.140 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:01:08.140 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:01:08.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:01:08.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:01:08.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:01:08.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:01:08.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:01:08.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:01:08.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:01:08.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:01:08.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:01:08.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:01:08.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:01:08.491 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:01:08.566 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:00:54
2026-06-04T02:01:08.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87634, datetime.datetime(2026, 6, 4, 2, 0, 54), datetime.datetime(2026, 6, 4, 2, 0, 53), 'salt', 1.77, 100.41, None, 47.21, 121.97, -0.06, 820.99, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:01:08.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:01:08.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:01:08.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:00:53, diff=15.574183s, valid=True
2026-06-04T02:01:08.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:01:08.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:01:08.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:01:12, diff=-3.422334s, valid=True
2026-06-04T02:01:08.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:01:08.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:01:08.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:00:52, diff=16.585853s, valid=True
2026-06-04T02:01:08.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:01:08.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:01:08.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:01:08.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:01:08.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:01:08.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:01:08.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:01:12, diff=-3.410415s, valid=True
2026-06-04T02:01:08.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:01:08.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:01:08.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:01:08.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105465.590395s, valid=True
2026-06-04T02:01:08.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:01:08.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:01:08.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:01:08.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:01:08.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:01:08.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:01:08.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:01:08.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:01:08.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:01:08.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:01:08.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:01:08.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:01:08.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:01:08.912 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:01:09.140 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:01:09.481 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:01:09.580 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:01:09.580 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:01:09.580 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:01:09.766 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:01:09.766 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:01:39.780 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:01:39.780 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:01:39.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:01:40.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:01:40.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:01:40.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:01:40.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:01:40.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:01:40.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:01:40.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:01:40.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:01:40.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:01:40.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:01:42.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:01:42.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:01:42.841 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:01:42.842 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:01:42.853 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:01:42.865 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:01:42.866 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:01:42.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:01:42.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:01:42.867 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:01:42.867 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:01:42.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:01:42.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:01:42.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:01:43.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:01:43.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:01:43.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:01:43.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:01:43.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:01:43.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:01:43.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:01:43.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:01:43.174 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:01:43.247 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:01:24
2026-06-04T02:01:43.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87635, datetime.datetime(2026, 6, 4, 2, 1, 24), datetime.datetime(2026, 6, 4, 2, 1, 24), 'salt', 1.77, 100.41, None, 56.77, 119.91, -0.06, 821.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:01:43.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:01:43.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:01:43.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:01:24, diff=19.254518s, valid=True
2026-06-04T02:01:43.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:01:43.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:01:43.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:01:12, diff=31.257817s, valid=True
2026-06-04T02:01:43.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:01:43.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:01:43.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:01:23, diff=20.265396s, valid=True
2026-06-04T02:01:43.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:01:43.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:01:43.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:01:43.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:01:43.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:01:43.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:01:43.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:01:12, diff=31.26889s, valid=True
2026-06-04T02:01:43.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:01:43.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:01:43.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:01:43.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105500.26966s, valid=True
2026-06-04T02:01:43.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:01:43.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:01:43.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:01:43.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:01:43.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:01:43.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:01:43.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:01:43.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:01:43.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:01:43.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:01:43.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:01:43.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:01:43.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:01:43.589 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:01:43.793 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:01:44.196 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:01:44.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:01:44.297 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:01:44.298 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:01:44.484 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:01:44.484 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:02:14.515 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:02:14.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:02:14.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:02:14.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:02:15.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:02:15.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:02:15.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:02:15.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:02:15.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:02:15.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:02:15.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:02:15.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:02:15.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:02:17.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:02:17.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:02:17.763 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:02:17.763 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:02:17.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:02:17.786 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:02:17.786 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:02:17.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:02:17.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:02:17.787 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:02:17.788 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:02:17.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:02:17.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:02:17.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:02:18.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:02:18.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:02:18.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:02:18.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:02:18.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:02:18.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:02:18.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:02:18.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:02:18.142 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:02:18.218 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:01:55
2026-06-04T02:02:18.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87636, datetime.datetime(2026, 6, 4, 2, 1, 55), datetime.datetime(2026, 6, 4, 2, 1, 54), 'salt', 1.73, 100.44, None, 53.59, 129.21, -0.07, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:02:18.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:02:18.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:02:18.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:01:54, diff=24.225526s, valid=True
2026-06-04T02:02:18.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:02:18.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:02:18.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:02:12, diff=6.22915s, valid=True
2026-06-04T02:02:18.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:02:18.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:02:18.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:01:53, diff=25.237243s, valid=True
2026-06-04T02:02:18.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:02:18.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:02:18.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:02:18.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:02:18.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:02:18.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:02:18.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:02:12, diff=6.240996s, valid=True
2026-06-04T02:02:18.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:02:18.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:02:18.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:02:18.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105535.241802s, valid=True
2026-06-04T02:02:18.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:02:18.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:02:18.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:02:18.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:02:18.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:02:18.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:02:18.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:02:18.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:02:18.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:02:18.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:02:18.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:02:18.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:02:18.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:02:18.563 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:02:18.770 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:02:19.117 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:02:19.221 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:02:19.221 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:02:19.222 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:02:19.301 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:02:19.301 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:02:49.332 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:02:49.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:02:49.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:02:49.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:02:49.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:02:49.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:02:49.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:02:49.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:02:49.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:02:49.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:02:49.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:02:49.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:02:49.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:02:52.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:02:52.343 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:02:52.344 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:02:52.344 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:02:52.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:02:52.368 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:02:52.368 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:02:52.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:02:52.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:02:52.370 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:02:52.370 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:02:52.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:02:52.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T02:02:52.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:02:52.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T02:02:52.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:02:52.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T02:02:52.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:02:52.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T02:02:52.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:02:52.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:02:52.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:02:52.749 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:02:52.824 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:02:25
2026-06-04T02:02:52.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87637, datetime.datetime(2026, 6, 4, 2, 2, 25), datetime.datetime(2026, 6, 4, 2, 2, 24), 'salt', 1.73, 100.41, None, 48.55, 120.89, -0.06, 821.02, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:02:52.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:02:52.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T02:02:52.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:02:24, diff=28.832205s, valid=True
2026-06-04T02:02:52.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:02:52.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T02:02:52.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:02:12, diff=40.835807s, valid=True
2026-06-04T02:02:52.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:02:52.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T02:02:52.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:02:23, diff=29.844248s, valid=True
2026-06-04T02:02:52.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:02:52.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:02:52.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:02:52.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:02:52.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:02:52.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T02:02:52.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:02:12, diff=40.848132s, valid=True
2026-06-04T02:02:52.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:02:52.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:02:52.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:02:52.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105569.848972s, valid=True
2026-06-04T02:02:52.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:02:52.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:02:52.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:02:52.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:02:52.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:02:52.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:02:52.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:02:52.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:02:52.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:02:52.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:02:53.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:02:53.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:02:53.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:02:53.170 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:02:53.448 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:02:53.788 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:02:53.890 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:02:53.890 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:02:53.890 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:02:54.166 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:02:54.166 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:03:24.195 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:03:24.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:03:24.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:03:24.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:03:24.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:03:24.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:03:24.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:03:24.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:03:24.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:03:24.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:03:24.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:03:24.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:03:24.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:03:27.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:03:27.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:03:27.177 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:03:27.177 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:03:27.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:03:27.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:03:27.202 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:03:27.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:03:27.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:03:27.203 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:03:27.203 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:03:27.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:03:27.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:03:27.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:03:27.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:03:27.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:03:27.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:03:27.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:03:27.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:03:27.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:03:27.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:03:27.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:03:27.558 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:03:27.638 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:03:25
2026-06-04T02:03:27.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87639, datetime.datetime(2026, 6, 4, 2, 3, 25), datetime.datetime(2026, 6, 4, 2, 3, 25), 'salt', 1.63, 100.31, None, 39.2, 120.89, -0.05, 821.29, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:03:27.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:03:27.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:03:27.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:03:25, diff=2.645969s, valid=True
2026-06-04T02:03:27.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:03:27.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:03:27.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:03:12, diff=15.64948s, valid=True
2026-06-04T02:03:27.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:03:27.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:03:27.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:03:24, diff=3.657682s, valid=True
2026-06-04T02:03:27.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:03:27.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:03:27.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:03:27.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:03:27.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:03:27.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:03:27.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:03:12, diff=15.66143s, valid=True
2026-06-04T02:03:27.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:03:27.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:03:27.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:03:27.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105604.662284s, valid=True
2026-06-04T02:03:27.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:03:27.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:03:27.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:03:27.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:03:27.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:03:27.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:03:27.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:03:27.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:03:27.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:03:27.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:03:27.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:03:27.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:03:27.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:03:27.985 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:03:28.198 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:03:28.542 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:03:28.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:03:28.646 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:03:28.646 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:03:28.827 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:03:28.827 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:03:58.858 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:03:58.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:03:58.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:03:59.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:03:59.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:03:59.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:03:59.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:03:59.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:03:59.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:03:59.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:03:59.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:03:59.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:03:59.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:04:01.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:04:01.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:04:01.750 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:04:01.750 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:04:01.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:04:01.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:04:01.774 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:04:01.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:04:01.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:04:01.775 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:04:01.775 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:04:01.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:04:01.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:04:01.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:04:02.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:04:02.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:04:02.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:04:02.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:04:02.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:04:02.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:04:02.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:04:02.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:04:02.109 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:04:02.179 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:03:56
2026-06-04T02:04:02.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87640, datetime.datetime(2026, 6, 4, 2, 3, 56), datetime.datetime(2026, 6, 4, 2, 3, 55), 'salt', 1.77, 100.38, None, 38.25, 114.57, -0.05, 821.17, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:04:02.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:04:02.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:04:02.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:03:55, diff=7.18761s, valid=True
2026-06-04T02:04:02.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:04:02.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:04:02.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:04:12, diff=-9.80887s, valid=True
2026-06-04T02:04:02.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:04:02.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:04:02.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:03:54, diff=8.199317s, valid=True
2026-06-04T02:04:02.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:04:02.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:04:02.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:04:02.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:04:02.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:04:02.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:04:02.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:04:12, diff=-9.796918s, valid=True
2026-06-04T02:04:02.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:04:02.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:04:02.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:04:02.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105639.203912s, valid=True
2026-06-04T02:04:02.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:04:02.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:04:02.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:04:02.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:04:02.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:04:02.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:04:02.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:04:02.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:04:02.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:04:02.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:04:02.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:04:02.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:04:02.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:04:02.602 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:04:02.807 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:04:03.150 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:04:03.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:04:03.252 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:04:03.252 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:04:03.508 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:04:03.508 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:04:33.525 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:04:33.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:04:33.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:04:34.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:04:34.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:04:34.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:04:34.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:04:34.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:04:34.427 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:04:34.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:04:34.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:04:34.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:04:34.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:04:37.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:04:37.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:04:37.433 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:04:37.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:04:37.443 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:04:37.456 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:04:37.456 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:04:37.457 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:04:37.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:04:37.458 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:04:37.458 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:04:37.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:04:37.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:04:37.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:04:37.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:04:37.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:04:37.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:04:37.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:04:37.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:04:37.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:04:37.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:04:37.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:04:37.789 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:04:37.859 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:04:26
2026-06-04T02:04:37.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87641, datetime.datetime(2026, 6, 4, 2, 4, 26), datetime.datetime(2026, 6, 4, 2, 4, 25), 'salt', 1.73, 100.38, None, 50.63, 133.25, -0.06, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:04:37.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:04:37.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:04:37.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:04:25, diff=12.868225s, valid=True
2026-06-04T02:04:37.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:04:37.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:04:37.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:04:12, diff=25.871103s, valid=True
2026-06-04T02:04:37.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:04:37.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:04:37.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:04:24, diff=13.877774s, valid=True
2026-06-04T02:04:37.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:04:37.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:04:37.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:04:37.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:04:37.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:04:37.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:04:37.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:04:12, diff=25.880838s, valid=True
2026-06-04T02:04:37.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:04:37.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:04:37.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:04:37.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105674.881482s, valid=True
2026-06-04T02:04:37.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:04:37.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:04:37.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:04:37.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:04:37.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:04:37.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:04:37.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:04:37.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:04:37.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:04:38.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:04:38.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:04:38.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:04:38.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:04:38.203 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:04:38.464 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:04:38.833 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:04:38.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:04:38.938 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:04:38.938 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:04:39.158 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:04:39.158 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:05:09.176 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:05:09.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:05:09.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:05:09.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:05:09.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:05:09.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:05:09.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:05:09.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:05:09.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:05:09.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:05:09.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:05:09.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:05:09.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:05:12.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:05:12.169 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:05:12.170 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:05:12.170 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:05:12.180 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:05:12.198 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:05:12.198 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:05:12.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:05:12.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:05:12.200 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:05:12.200 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:05:12.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:05:12.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:05:12.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:05:12.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:05:12.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:05:12.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:05:12.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:05:12.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:05:12.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:05:12.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:05:12.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:05:12.553 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:05:12.628 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:04:57
2026-06-04T02:05:12.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87642, datetime.datetime(2026, 6, 4, 2, 4, 57), datetime.datetime(2026, 6, 4, 2, 4, 55), 'salt', 1.7, 100.34, None, 48.55, 118.66, -0.05, 821.11, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:05:12.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:05:12.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:05:12.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:04:55, diff=17.636047s, valid=True
2026-06-04T02:05:12.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:05:12.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:05:12.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:05:12, diff=0.639525s, valid=True
2026-06-04T02:05:12.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:05:12.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:05:12.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:04:54, diff=18.647694s, valid=True
2026-06-04T02:05:12.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:05:12.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:05:12.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:05:12.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:05:12.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:05:12.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:05:12.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:05:12, diff=0.651554s, valid=True
2026-06-04T02:05:12.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:05:12.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:05:12.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:05:12.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105709.652378s, valid=True
2026-06-04T02:05:12.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:05:12.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:05:12.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:05:12.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:05:12.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:05:12.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:05:12.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:05:12.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:05:12.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:05:12.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:05:12.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:05:12.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:05:13.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:05:13.045 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:05:13.252 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:05:13.594 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:05:13.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:05:13.697 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:05:13.697 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:05:13.951 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:05:13.951 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:05:43.965 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:05:43.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:05:43.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:05:44.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:05:44.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:05:44.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:05:44.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:05:44.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:05:44.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:05:44.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:05:44.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:05:44.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:05:44.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:05:47.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:05:47.249 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:05:47.250 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:05:47.250 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:05:47.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:05:47.272 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:05:47.273 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:05:47.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:05:47.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:05:47.274 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:05:47.274 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:05:47.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:05:47.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:05:47.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:05:47.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:05:47.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:05:47.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:05:47.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:05:47.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:05:47.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:05:47.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:05:47.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:05:47.632 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:05:47.703 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:05:28
2026-06-04T02:05:47.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87643, datetime.datetime(2026, 6, 4, 2, 5, 28), datetime.datetime(2026, 6, 4, 2, 5, 27), 'salt', 1.63, 100.38, None, 55.04, 117.11, -0.06, 821.11, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:05:47.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:05:47.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:05:47.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:05:27, diff=20.710513s, valid=True
2026-06-04T02:05:47.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:05:47.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:05:47.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:05:12, diff=35.713795s, valid=True
2026-06-04T02:05:47.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:05:47.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:05:47.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:05:24, diff=23.721487s, valid=True
2026-06-04T02:05:47.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:05:47.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:05:47.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:05:47.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:05:47.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:05:47.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:05:47.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:05:12, diff=35.724996s, valid=True
2026-06-04T02:05:47.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:05:47.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:05:47.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:05:47.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105744.725857s, valid=True
2026-06-04T02:05:47.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:05:47.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:05:47.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:05:47.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:05:47.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:05:47.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:05:47.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:05:47.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:05:47.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:05:47.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:05:47.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:05:47.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:05:48.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:05:48.047 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:05:48.257 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:05:48.598 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:05:48.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:05:48.699 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:05:48.699 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:05:48.788 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:05:48.789 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:06:18.819 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:06:18.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:06:18.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:06:19.132 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:06:19.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:06:19.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:06:19.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:06:19.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:06:19.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:06:19.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:06:19.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:06:19.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:06:19.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:06:22.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:06:22.266 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:06:22.267 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:06:22.267 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:06:22.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:06:22.291 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:06:22.292 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:06:22.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:06:22.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:06:22.293 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:06:22.293 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:06:22.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:06:22.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T02:06:22.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:06:22.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T02:06:22.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:06:22.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:06:22.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:06:22.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:06:22.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:06:22.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:06:22.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:06:22.633 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:06:22.707 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:05:58
2026-06-04T02:06:22.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87644, datetime.datetime(2026, 6, 4, 2, 5, 58), datetime.datetime(2026, 6, 4, 2, 5, 57), 'salt', 1.77, 100.41, None, 51.65, 127.33, -0.06, 820.99, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:06:22.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:06:22.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T02:06:22.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:05:57, diff=25.712999s, valid=True
2026-06-04T02:06:22.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:06:22.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:06:22.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:06:12, diff=10.715822s, valid=True
2026-06-04T02:06:22.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:06:22.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T02:06:22.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:05:55, diff=27.722292s, valid=True
2026-06-04T02:06:22.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:06:22.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:06:22.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:06:22.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:06:22.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:06:22.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:06:22.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:06:12, diff=10.725279s, valid=True
2026-06-04T02:06:22.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:06:22.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:06:22.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:06:22.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105779.725922s, valid=True
2026-06-04T02:06:22.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:06:22.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:06:22.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:06:22.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:06:22.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:06:22.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:06:22.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:06:22.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:06:22.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:06:22.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:06:22.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:06:23.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:06:23.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:06:23.108 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:06:23.314 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:06:23.655 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:06:23.757 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:06:23.757 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:06:23.757 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:06:24.009 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:06:24.009 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:06:54.017 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:06:54.017 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:06:54.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:06:54.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:06:54.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:06:54.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:06:54.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:06:54.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:06:54.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:06:54.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:06:54.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:06:54.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:06:54.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:06:57.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:06:57.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:06:57.289 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:06:57.289 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:06:57.300 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:06:57.313 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:06:57.313 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:06:57.314 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:06:57.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:06:57.314 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:06:57.315 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:06:57.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:06:57.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T02:06:57.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:06:57.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T02:06:57.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:06:57.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T02:06:57.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:06:57.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T02:06:57.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:06:57.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:06:57.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:06:57.648 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:06:57.719 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:06:28
2026-06-04T02:06:57.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87645, datetime.datetime(2026, 6, 4, 2, 6, 28), datetime.datetime(2026, 6, 4, 2, 6, 28), 'salt', 1.7, 100.38, None, 47.67, 125.05, -0.05, 821.35, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:06:57.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:06:57.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T02:06:57.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:06:28, diff=29.727123s, valid=True
2026-06-04T02:06:57.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:06:57.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T02:06:57.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:06:12, diff=45.730606s, valid=True
2026-06-04T02:06:57.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:06:57.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T02:06:57.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:06:25, diff=32.738759s, valid=True
2026-06-04T02:06:57.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:06:57.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:06:57.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:06:57.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:06:57.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:06:57.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T02:06:57.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:06:12, diff=45.742513s, valid=True
2026-06-04T02:06:57.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:06:57.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:06:57.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:06:57.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105814.743336s, valid=True
2026-06-04T02:06:57.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:06:57.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:06:57.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:06:57.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:06:57.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:06:57.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:06:57.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:06:57.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:06:57.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:06:57.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:06:57.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:06:57.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:06:58.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:06:58.062 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:06:58.268 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:06:58.610 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:06:58.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:06:58.711 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:06:58.712 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:06:58.867 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:06:58.868 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:07:28.898 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:07:28.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:07:28.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:07:29.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:07:29.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:07:29.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:07:29.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:07:29.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:07:29.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:07:29.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:07:29.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:07:29.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:07:29.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:07:31.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:07:32.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:07:32.005 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:07:32.005 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:07:32.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:07:32.028 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:07:32.029 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:07:32.029 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:07:32.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:07:32.030 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:07:32.030 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:07:32.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:07:32.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:07:32.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:07:32.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:07:32.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:07:32.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:07:32.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:07:32.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:07:32.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:07:32.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:07:32.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:07:32.361 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:07:32.432 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:07:29
2026-06-04T02:07:32.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87647, datetime.datetime(2026, 6, 4, 2, 7, 29), datetime.datetime(2026, 6, 4, 2, 7, 28), 'salt', 1.7, 100.38, None, 35.18, 124.21, -0.05, 821.17, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:07:32.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:07:32.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:07:32.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:07:28, diff=4.439639s, valid=True
2026-06-04T02:07:32.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:07:32.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:07:32.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:07:12, diff=20.44319s, valid=True
2026-06-04T02:07:32.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:07:32.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:07:32.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:07:26, diff=6.451349s, valid=True
2026-06-04T02:07:32.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:07:32.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:07:32.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:07:32.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:07:32.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:07:32.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:07:32.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:07:12, diff=20.455087s, valid=True
2026-06-04T02:07:32.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:07:32.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:07:32.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:07:32.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105849.455891s, valid=True
2026-06-04T02:07:32.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:07:32.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:07:32.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:07:32.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:07:32.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:07:32.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:07:32.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:07:32.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:07:32.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:07:32.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:07:32.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:07:32.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:07:32.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:07:32.774 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:07:32.982 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:07:33.322 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:07:33.425 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:07:33.425 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:07:33.425 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:07:33.612 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:07:33.612 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:08:03.643 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:08:03.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:08:03.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:08:03.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:08:03.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:08:04.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:08:04.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:08:04.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:08:04.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:08:04.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:08:04.221 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:08:04.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:08:04.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:08:06.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:08:06.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:08:06.527 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:08:06.527 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:08:06.537 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:08:06.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:08:06.549 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:08:06.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:08:06.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:08:06.549 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:08:06.549 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:08:06.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:08:06.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:08:06.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:08:06.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:08:06.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:08:06.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:08:06.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:08:06.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:08:06.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:08:06.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:08:06.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:08:06.823 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:08:06.894 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:07:59
2026-06-04T02:08:06.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87648, datetime.datetime(2026, 6, 4, 2, 7, 59), datetime.datetime(2026, 6, 4, 2, 7, 58), 'salt', 1.73, 100.34, None, 52.46, 125.66, -0.05, 821.05, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:08:06.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:08:06.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:08:06.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:07:58, diff=8.901906s, valid=True
2026-06-04T02:08:06.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:08:06.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:08:06.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:08:12, diff=-5.094835s, valid=True
2026-06-04T02:08:06.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:08:06.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:08:06.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:07:56, diff=10.912725s, valid=True
2026-06-04T02:08:06.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:08:06.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:08:06.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:08:06.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:08:06.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:08:06.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:08:06.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:08:12, diff=-5.08379s, valid=True
2026-06-04T02:08:06.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:08:06.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:08:06.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:08:06.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105883.916985s, valid=True
2026-06-04T02:08:06.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:08:06.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:08:06.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:08:06.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:08:06.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:08:06.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:08:06.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:08:06.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:08:07.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:08:07.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:08:07.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:08:07.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:08:07.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:08:07.233 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:08:07.438 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:08:07.833 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:08:07.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:08:07.938 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:08:07.938 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:08:08.192 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:08:08.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:08:38.221 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:08:38.221 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:08:38.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:08:38.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:08:38.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:08:38.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:08:38.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:08:38.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:08:38.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:08:38.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:08:38.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:08:38.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:08:38.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:08:41.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:08:41.207 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:08:41.208 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:08:41.209 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:08:41.219 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:08:41.232 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:08:41.233 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:08:41.233 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:08:41.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:08:41.234 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:08:41.234 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:08:41.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:08:41.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:08:41.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:08:41.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:08:41.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:08:41.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:08:41.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:08:41.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:08:41.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:08:41.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:08:41.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:08:41.570 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:08:41.643 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:08:29
2026-06-04T02:08:41.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87649, datetime.datetime(2026, 6, 4, 2, 8, 29), datetime.datetime(2026, 6, 4, 2, 8, 28), 'salt', 1.7, 100.41, None, 48.37, 117.63, -0.06, 820.99, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:08:41.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:08:41.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:08:41.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:08:28, diff=13.650917s, valid=True
2026-06-04T02:08:41.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:08:41.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:08:41.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:08:12, diff=29.654429s, valid=True
2026-06-04T02:08:41.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:08:41.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:08:41.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:08:26, diff=15.662779s, valid=True
2026-06-04T02:08:41.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:08:41.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:08:41.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:08:41.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:08:41.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:08:41.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:08:41.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:08:12, diff=29.666546s, valid=True
2026-06-04T02:08:41.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:08:41.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:08:41.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:08:41.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105918.66736s, valid=True
2026-06-04T02:08:41.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:08:41.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:08:41.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:08:41.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:08:41.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:08:41.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:08:41.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:08:41.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:08:41.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:08:41.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:08:41.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:08:41.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:08:41.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:08:41.989 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:08:42.195 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:08:42.535 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:08:42.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:08:42.637 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:08:42.637 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:08:42.792 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:08:42.792 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:09:12.822 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:09:12.822 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:09:12.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:09:13.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:09:13.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:09:13.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:09:13.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:09:13.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:09:13.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:09:13.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:09:13.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:09:13.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:09:13.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:09:15.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:09:15.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:09:15.714 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:09:15.714 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:09:15.725 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:09:15.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:09:15.738 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:09:15.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:09:15.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:09:15.739 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:09:15.739 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:09:15.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:09:15.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:09:15.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:09:15.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:09:15.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:09:16.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:09:16.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:09:16.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:09:16.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:09:16.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:09:16.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:09:16.078 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:09:16.149 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:08:59
2026-06-04T02:09:16.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87650, datetime.datetime(2026, 6, 4, 2, 8, 59), datetime.datetime(2026, 6, 4, 2, 8, 59), 'salt', 1.67, 100.41, None, 43.96, 122.47, -0.06, 820.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:09:16.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:09:16.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:09:16.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:08:59, diff=17.15683s, valid=True
2026-06-04T02:09:16.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:09:16.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:09:16.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:09:12, diff=4.16023s, valid=True
2026-06-04T02:09:16.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:09:16.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:09:16.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:08:57, diff=19.168243s, valid=True
2026-06-04T02:09:16.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:09:16.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:09:16.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:09:16.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:09:16.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:09:16.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:09:16.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:09:12, diff=4.171912s, valid=True
2026-06-04T02:09:16.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:09:16.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:09:16.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:09:16.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105953.17272s, valid=True
2026-06-04T02:09:16.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:09:16.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:09:16.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:09:16.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:09:16.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:09:16.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:09:16.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:09:16.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:09:16.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:09:16.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:09:16.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:09:16.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:09:16.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:09:16.572 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:09:16.778 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:09:17.121 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:09:17.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:09:17.223 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:09:17.223 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:09:17.412 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:09:17.412 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:09:47.434 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:09:47.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:09:47.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:09:47.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:09:47.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:09:47.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:09:47.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:09:48.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:09:48.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:09:48.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:09:48.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:09:48.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:09:48.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:09:50.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:09:50.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:09:50.459 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:09:50.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:09:50.467 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:09:50.480 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:09:50.481 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:09:50.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:09:50.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:09:50.482 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:09:50.482 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:09:50.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:09:50.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:09:50.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:09:50.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:09:50.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:09:50.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:09:50.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:09:50.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:09:50.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:09:50.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:09:50.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:09:50.815 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:09:50.884 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:09:30
2026-06-04T02:09:50.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87651, datetime.datetime(2026, 6, 4, 2, 9, 30), datetime.datetime(2026, 6, 4, 2, 9, 29), 'salt', 1.77, 100.44, None, 44.32, 120.94, -0.06, 820.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:09:50.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:09:50.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:09:50.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:09:29, diff=21.892252s, valid=True
2026-06-04T02:09:50.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:09:50.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:09:50.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:09:12, diff=38.895954s, valid=True
2026-06-04T02:09:50.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:09:50.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:09:50.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:09:27, diff=23.904326s, valid=True
2026-06-04T02:09:50.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:09:50.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:09:50.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:09:50.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:09:50.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:09:50.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:09:50.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:09:12, diff=38.908119s, valid=True
2026-06-04T02:09:50.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:09:50.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:09:50.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:09:50.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=105987.908941s, valid=True
2026-06-04T02:09:50.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:09:50.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:09:50.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:09:50.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:09:50.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:09:50.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:09:50.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:09:50.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:09:50.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:09:51.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:09:51.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:09:51.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:09:51.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:09:51.234 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:09:51.441 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:09:51.786 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:09:51.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:09:51.889 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:09:51.889 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:09:52.160 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:09:52.161 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:10:22.191 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:10:22.191 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:10:22.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:10:22.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:10:22.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:10:22.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:10:22.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:10:22.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:10:22.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:10:22.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:10:22.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:10:22.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:10:22.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:10:25.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:10:25.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:10:25.229 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:10:25.229 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:10:25.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:10:25.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:10:25.254 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:10:25.254 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:10:25.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:10:25.255 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:10:25.255 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:10:25.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:10:25.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T02:10:25.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:10:25.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T02:10:25.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:10:25.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:10:25.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:10:25.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:10:25.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:10:25.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:10:25.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:10:25.593 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:10:25.665 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:10:00
2026-06-04T02:10:25.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87652, datetime.datetime(2026, 6, 4, 2, 10), datetime.datetime(2026, 6, 4, 2, 9, 59), 'salt', 1.73, 100.41, None, 46.33, 123.88, -0.06, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:10:25.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:10:25.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T02:10:25.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:09:59, diff=26.673126s, valid=True
2026-06-04T02:10:25.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:10:25.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:10:25.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:10:12, diff=13.676645s, valid=True
2026-06-04T02:10:25.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:10:25.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T02:10:25.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:09:57, diff=28.684715s, valid=True
2026-06-04T02:10:25.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:10:25.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:10:25.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:10:25.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:10:25.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:10:25.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:10:25.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:10:12, diff=13.688458s, valid=True
2026-06-04T02:10:25.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:10:25.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:10:25.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:10:25.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106022.689285s, valid=True
2026-06-04T02:10:25.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:10:25.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:10:25.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:10:25.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:10:25.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:10:25.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:10:25.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:10:25.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:10:25.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:10:25.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:10:25.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:10:25.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:10:26.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:10:26.080 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:10:26.287 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:10:26.633 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:10:26.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:10:26.736 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:10:26.736 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:10:26.950 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:10:26.950 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:10:56.980 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:10:56.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:10:56.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:10:57.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:10:57.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:10:57.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:10:57.547 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:10:57.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:10:57.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:10:57.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:10:57.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:10:57.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:10:57.587 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:11:00.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:11:00.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:11:00.012 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:11:00.012 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:11:00.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:11:00.032 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:11:00.033 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:11:00.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:11:00.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:11:00.033 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:11:00.034 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:11:00.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:11:00.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T02:11:00.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:11:00.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T02:11:00.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:11:00.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T02:11:00.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:11:00.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T02:11:00.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:11:00.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:11:00.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:11:00.314 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:11:00.385 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:10:30
2026-06-04T02:11:00.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87653, datetime.datetime(2026, 6, 4, 2, 10, 30), datetime.datetime(2026, 6, 4, 2, 10, 29), 'salt', 1.73, 100.44, None, 41.25, 119.67, -0.07, 821.05, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:11:00.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:11:00.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T02:11:00.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:10:29, diff=31.39228s, valid=True
2026-06-04T02:11:00.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:11:00.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T02:11:00.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:10:12, diff=48.39551s, valid=True
2026-06-04T02:11:00.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:11:00.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T02:11:00.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:10:27, diff=33.40317s, valid=True
2026-06-04T02:11:00.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:11:00.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:11:00.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:11:00.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:11:00.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:11:00.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T02:11:00.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:10:12, diff=48.406586s, valid=True
2026-06-04T02:11:00.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:11:00.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:11:00.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:11:00.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106057.407341s, valid=True
2026-06-04T02:11:00.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:11:00.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:11:00.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:11:00.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:11:00.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:11:00.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:11:00.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:11:00.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:11:00.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:11:00.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:11:00.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:11:00.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:11:00.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:11:00.725 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:11:00.946 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:11:01.312 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:11:01.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:11:01.415 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:11:01.415 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:11:01.571 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:11:01.571 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:11:31.601 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:11:31.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:11:31.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:11:31.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:11:31.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:11:32.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:11:32.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:11:32.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:11:32.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:11:32.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:11:32.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:11:32.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:11:32.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:11:34.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:11:34.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:11:34.678 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:11:34.678 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:11:34.686 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:11:34.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:11:34.698 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:11:34.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:11:34.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:11:34.698 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:11:34.698 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:11:34.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:11:34.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:11:34.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:11:34.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:11:34.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:11:34.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:11:34.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:11:34.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:11:34.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:11:34.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:11:34.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:11:34.981 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:11:35.052 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:11:31
2026-06-04T02:11:35.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87655, datetime.datetime(2026, 6, 4, 2, 11, 31), datetime.datetime(2026, 6, 4, 2, 11, 30), 'salt', 1.73, 100.44, None, 49.89, 129.68, -0.07, 820.86, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:11:35.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:11:35.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:11:35.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:11:30, diff=5.05986s, valid=True
2026-06-04T02:11:35.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:11:35.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:11:35.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:11:12, diff=23.063153s, valid=True
2026-06-04T02:11:35.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:11:35.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:11:35.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:11:28, diff=7.070859s, valid=True
2026-06-04T02:11:35.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:11:35.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:11:35.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:11:35.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:11:35.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:11:35.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:11:35.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:11:12, diff=23.074332s, valid=True
2026-06-04T02:11:35.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:11:35.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:11:35.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:11:35.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106092.075097s, valid=True
2026-06-04T02:11:35.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:11:35.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:11:35.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:11:35.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:11:35.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:11:35.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:11:35.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:11:35.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:11:35.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:11:35.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:11:35.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:11:35.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:11:35.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:11:35.459 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:11:35.664 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:11:36.005 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:11:36.107 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:11:36.107 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:11:36.107 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:11:36.303 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:11:36.303 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:12:06.333 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:12:06.333 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:12:06.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:12:06.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:12:06.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:12:06.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:12:06.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:12:06.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:12:06.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:12:06.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:12:06.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:12:06.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:12:06.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:12:09.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:12:09.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:12:09.501 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:12:09.501 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:12:09.512 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:12:09.524 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:12:09.525 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:12:09.525 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:12:09.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:12:09.526 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:12:09.526 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:12:09.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:12:09.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:12:09.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:12:09.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:12:09.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:12:09.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:12:09.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:12:09.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:12:09.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:12:09.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:12:09.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:12:09.862 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:12:09.952 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:12:01
2026-06-04T02:12:09.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87656, datetime.datetime(2026, 6, 4, 2, 12, 1), datetime.datetime(2026, 6, 4, 2, 12), 'salt', 1.7, 100.41, None, 45.48, 116.97, -0.06, 821.11, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:12:09.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:12:09.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:12:09.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:12:00, diff=9.959365s, valid=True
2026-06-04T02:12:09.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:12:09.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:12:09.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:12:12, diff=-2.037502s, valid=True
2026-06-04T02:12:09.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:12:09.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:12:09.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:11:59, diff=10.970984s, valid=True
2026-06-04T02:12:09.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:12:09.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:12:09.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:12:09.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:12:09.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:12:09.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:12:09.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:12:12, diff=-2.025511s, valid=True
2026-06-04T02:12:09.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:12:09.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:12:09.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:12:09.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106126.975275s, valid=True
2026-06-04T02:12:09.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:12:09.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:12:09.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:12:09.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:12:09.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:12:10.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:12:10.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:12:10.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:12:10.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:12:10.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:12:10.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:12:10.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:12:10.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:12:10.310 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:12:10.551 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:12:10.942 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:12:11.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:12:11.046 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:12:11.046 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:12:11.226 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:12:11.227 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:12:41.253 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:12:41.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:12:41.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:12:41.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:12:41.726 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:12:42.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:12:42.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:12:42.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:12:42.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:12:42.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:12:42.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:12:42.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:12:42.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:12:44.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:12:44.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:12:44.476 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:12:44.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:12:44.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:12:44.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:12:44.506 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:12:44.506 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:12:44.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:12:44.507 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:12:44.507 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:12:44.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:12:44.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:12:44.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:12:44.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:12:44.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:12:44.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:12:44.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:12:44.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:12:44.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:12:44.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:12:44.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:12:44.833 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:12:44.905 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:12:31
2026-06-04T02:12:44.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87657, datetime.datetime(2026, 6, 4, 2, 12, 31), datetime.datetime(2026, 6, 4, 2, 12, 31), 'salt', 1.7, 100.41, None, 48.65, 121.83, -0.06, 820.99, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:12:44.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:12:44.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:12:44.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:12:31, diff=13.912297s, valid=True
2026-06-04T02:12:44.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:12:44.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:12:44.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:12:12, diff=32.915848s, valid=True
2026-06-04T02:12:44.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:12:44.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:12:44.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:12:29, diff=15.92395s, valid=True
2026-06-04T02:12:44.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:12:44.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:12:44.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:12:44.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:12:44.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:12:44.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:12:44.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:12:12, diff=32.927638s, valid=True
2026-06-04T02:12:44.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:12:44.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:12:44.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:12:44.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106161.92844s, valid=True
2026-06-04T02:12:44.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:12:44.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:12:44.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:12:44.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:12:44.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:12:44.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:12:44.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:12:44.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:12:45.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:12:45.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:12:45.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:12:45.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:12:45.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:12:45.248 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:12:45.455 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:12:45.798 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:12:45.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:12:45.900 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:12:45.900 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:12:46.085 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:12:46.085 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:13:16.085 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:13:16.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:13:16.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:13:16.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:13:16.244 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:13:16.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:13:16.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:13:16.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:13:16.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:13:16.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:13:16.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:13:16.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:13:16.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:13:18.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:13:18.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:13:18.936 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:13:18.936 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:13:18.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:13:18.960 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:13:18.961 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:13:18.961 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:13:18.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:13:18.962 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:13:18.962 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:13:18.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:13:19.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:13:19.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:13:19.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:13:19.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:13:19.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T02:13:19.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:13:19.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T02:13:19.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:13:19.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:13:19.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:13:19.294 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:13:19.366 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:13:01
2026-06-04T02:13:19.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87658, datetime.datetime(2026, 6, 4, 2, 13, 1), datetime.datetime(2026, 6, 4, 2, 13, 1), 'salt', 1.63, 100.34, None, 49.61, 120.82, -0.05, 820.99, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:13:19.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:13:19.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:13:19.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:13:01, diff=18.37416s, valid=True
2026-06-04T02:13:19.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:13:19.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T02:13:19.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:12:12, diff=67.377762s, valid=True
2026-06-04T02:13:19.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:13:19.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:13:19.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:12:59, diff=20.386185s, valid=True
2026-06-04T02:13:19.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:13:19.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:13:19.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:13:19.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:13:19.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:13:19.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T02:13:19.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:12:12, diff=67.390092s, valid=True
2026-06-04T02:13:19.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:13:19.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:13:19.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:13:19.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106196.390947s, valid=True
2026-06-04T02:13:19.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:13:19.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:13:19.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:13:19.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:13:19.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:13:19.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:13:19.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:13:19.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:13:19.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:13:19.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:13:19.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:13:19.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:13:19.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:13:19.718 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:13:19.932 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:13:20.342 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:13:20.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:13:20.444 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:13:20.444 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:13:20.640 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:13:20.640 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:13:50.641 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:13:50.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:13:50.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:13:50.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:13:50.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:13:51.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:13:51.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:13:51.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:13:51.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:13:51.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:13:51.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:13:51.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:13:51.105 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:13:53.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:13:53.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:13:53.500 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:13:53.500 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:13:53.510 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:13:53.522 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:13:53.523 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:13:53.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:13:53.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:13:53.524 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:13:53.524 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:13:53.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:13:53.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:13:53.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:13:53.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:13:53.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:13:53.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T02:13:53.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:13:53.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T02:13:53.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:13:53.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:13:53.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:13:53.855 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:13:53.926 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:13:32
2026-06-04T02:13:53.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87659, datetime.datetime(2026, 6, 4, 2, 13, 32), datetime.datetime(2026, 6, 4, 2, 13, 31), 'salt', 1.67, 100.44, None, 37.47, 123.2, -0.06, 821.11, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:13:53.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:13:53.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:13:53.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:13:31, diff=22.933831s, valid=True
2026-06-04T02:13:53.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:13:53.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T02:13:53.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:12:12, diff=101.937342s, valid=True
2026-06-04T02:13:53.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:13:53.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:13:53.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:13:29, diff=24.945469s, valid=True
2026-06-04T02:13:53.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:13:53.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:13:53.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:13:53.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:13:53.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:13:53.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T02:13:53.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:12:12, diff=101.949204s, valid=True
2026-06-04T02:13:53.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:13:53.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:13:53.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:13:53.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106230.950023s, valid=True
2026-06-04T02:13:53.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:13:53.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:13:53.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:13:53.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:13:53.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:13:54.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:13:54.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:13:54.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:13:54.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:13:54.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:13:54.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:13:54.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:13:54.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:13:54.269 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:13:54.476 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:13:54.816 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:13:54.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:13:54.918 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:13:54.918 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:13:55.108 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:13:55.108 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:14:25.138 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:14:25.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:14:25.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:14:25.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:14:25.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:14:25.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:14:25.944 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:14:25.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:14:25.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:14:25.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:14:25.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:14:25.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:14:25.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:14:28.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:14:28.395 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:14:28.396 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:14:28.396 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:14:28.406 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:14:28.419 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:14:28.419 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:14:28.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:14:28.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:14:28.420 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:14:28.421 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:14:28.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:14:28.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T02:14:28.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:14:28.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T02:14:28.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:14:28.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:14:28.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:14:28.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:14:28.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:14:28.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:14:28.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:14:28.750 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:14:28.825 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:14:03
2026-06-04T02:14:28.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87660, datetime.datetime(2026, 6, 4, 2, 14, 3), datetime.datetime(2026, 6, 4, 2, 14, 1), 'salt', 1.67, 100.34, None, 45.76, 122.61, -0.05, 820.99, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:14:28.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:14:28.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T02:14:28.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:14:01, diff=27.832915s, valid=True
2026-06-04T02:14:28.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:14:28.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:14:28.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:12:12, diff=136.836465s, valid=True
2026-06-04T02:14:28.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:14:28.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T02:14:28.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:13:59, diff=29.844561s, valid=True
2026-06-04T02:14:28.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:14:28.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:14:28.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:14:28.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:14:28.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:14:28.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:14:28.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:12:12, diff=136.848249s, valid=True
2026-06-04T02:14:28.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:14:28.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:14:28.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:14:28.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106265.849099s, valid=True
2026-06-04T02:14:28.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:14:28.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:14:28.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:14:28.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:14:28.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:14:28.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:14:28.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:14:28.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:14:28.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:14:28.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:14:29.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:14:29.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:14:29.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:14:29.168 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:14:29.446 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:14:29.787 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:14:29.892 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:14:29.893 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:14:29.893 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:14:30.080 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:14:30.080 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:15:00.110 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:15:00.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:15:00.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:15:00.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:15:00.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:15:00.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:15:00.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:15:00.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:15:00.671 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:15:00.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:15:00.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:15:00.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:15:00.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:15:03.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:15:03.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:15:03.105 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:15:03.106 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:15:03.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:15:03.129 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:15:03.129 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:15:03.130 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:15:03.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:15:03.131 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:15:03.131 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:15:03.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:15:03.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T02:15:03.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:15:03.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T02:15:03.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:15:03.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:15:03.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:15:03.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:15:03.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:15:03.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:15:03.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:15:03.413 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:15:03.482 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:14:33
2026-06-04T02:15:03.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87661, datetime.datetime(2026, 6, 4, 2, 14, 33), datetime.datetime(2026, 6, 4, 2, 14, 32), 'salt', 1.63, 100.41, None, 46.36, 122.0, -0.06, 821.23, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:15:03.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:15:03.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T02:15:03.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:14:32, diff=31.489215s, valid=True
2026-06-04T02:15:03.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:15:03.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:15:03.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:12:12, diff=171.492479s, valid=True
2026-06-04T02:15:03.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:15:03.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T02:15:03.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:14:30, diff=33.499938s, valid=True
2026-06-04T02:15:03.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:15:03.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:15:03.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:15:03.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:15:03.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:15:03.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:15:03.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:12:12, diff=171.503566s, valid=True
2026-06-04T02:15:03.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:15:03.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:15:03.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:15:03.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106300.504333s, valid=True
2026-06-04T02:15:03.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:15:03.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:15:03.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:15:03.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:15:03.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:15:03.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:15:03.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:15:03.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:15:03.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:15:03.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:15:03.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:15:03.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:15:03.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:15:03.831 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:15:04.058 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:15:04.412 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:15:04.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:15:04.515 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:15:04.515 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:15:06.831 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:15:06.831 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:15:36.861 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:15:36.862 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:15:36.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:15:37.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:15:37.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:15:37.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:15:37.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:15:37.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:15:37.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:15:37.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:15:37.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:15:37.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:15:37.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:15:39.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:15:39.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:15:39.936 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:15:39.936 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:15:39.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:15:39.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:15:39.957 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:15:39.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:15:39.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:15:39.957 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:15:39.957 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:15:39.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:15:40.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:15:40.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:15:40.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:15:40.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:15:40.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:15:40.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:15:40.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:15:40.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:15:40.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:15:40.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:15:40.260 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:15:40.330 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:15:33
2026-06-04T02:15:40.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87663, datetime.datetime(2026, 6, 4, 2, 15, 33), datetime.datetime(2026, 6, 4, 2, 15, 33), 'salt', 1.67, 100.44, None, 50.52, 127.4, -0.06, 820.8, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:15:40.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:15:40.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:15:40.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:15:33, diff=7.337386s, valid=True
2026-06-04T02:15:40.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:15:40.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:15:40.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:16:12, diff=-31.659314s, valid=True
2026-06-04T02:15:40.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:15:40.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:15:40.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:15:30, diff=10.348332s, valid=True
2026-06-04T02:15:40.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:15:40.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:15:40.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:15:40.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:15:40.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:15:40.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:15:40.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:16:12, diff=-31.648045s, valid=True
2026-06-04T02:15:40.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:15:40.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:15:40.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:15:40.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106337.352727s, valid=True
2026-06-04T02:15:40.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:15:40.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:15:40.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:15:40.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:15:40.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:15:40.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:15:40.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:15:40.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:15:40.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:15:40.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:15:40.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:15:40.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:15:40.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:15:40.744 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:15:40.949 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:15:41.292 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:15:41.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:15:41.394 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:15:41.394 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:15:41.596 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:15:41.596 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:16:11.626 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:16:11.626 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:16:11.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:16:11.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:16:11.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:16:12.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:16:12.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:16:12.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:16:12.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:16:12.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:16:12.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:16:12.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:16:12.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:16:14.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:16:14.856 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:16:14.857 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:16:14.857 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:16:14.868 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:16:14.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:16:14.881 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:16:14.882 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:16:14.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:16:14.883 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:16:14.883 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:16:14.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:16:15.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:16:15.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:16:15.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:16:15.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:16:15.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:16:15.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:16:15.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:16:15.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:16:15.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:16:15.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:16:15.228 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:16:15.300 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:16:04
2026-06-04T02:16:15.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87664, datetime.datetime(2026, 6, 4, 2, 16, 4), datetime.datetime(2026, 6, 4, 2, 16, 3), 'salt', 1.5, 100.28, None, 50.45, 120.75, -0.04, 821.05, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:16:15.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:16:15.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:16:15.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:16:03, diff=12.307725s, valid=True
2026-06-04T02:16:15.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:16:15.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:16:15.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:16:12, diff=3.311211s, valid=True
2026-06-04T02:16:15.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:16:15.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:16:15.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:16:00, diff=15.319541s, valid=True
2026-06-04T02:16:15.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:16:15.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:16:15.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:16:15.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:16:15.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:16:15.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:16:15.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:16:12, diff=3.323295s, valid=True
2026-06-04T02:16:15.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:16:15.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:16:15.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:16:15.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106372.324168s, valid=True
2026-06-04T02:16:15.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:16:15.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:16:15.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:16:15.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:16:15.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:16:15.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:16:15.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:16:15.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:16:15.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:16:15.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:16:15.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:16:15.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:16:15.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:16:15.650 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:16:15.864 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:16:16.210 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:16:16.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:16:16.313 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:16:16.314 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:16:16.508 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:16:16.508 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:16:46.529 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:16:46.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:16:46.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:16:46.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:16:46.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:16:47.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:16:47.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:16:47.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:16:47.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:16:47.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:16:47.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:16:47.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:16:47.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:16:49.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:16:49.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:16:49.524 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:16:49.525 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:16:49.535 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:16:49.549 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:16:49.549 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:16:49.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:16:49.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:16:49.550 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:16:49.551 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:16:49.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:16:49.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:16:49.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:16:49.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:16:49.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:16:49.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:16:49.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:16:49.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:16:49.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:16:49.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:16:49.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:16:49.900 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:16:49.982 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:16:34
2026-06-04T02:16:49.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87665, datetime.datetime(2026, 6, 4, 2, 16, 34), datetime.datetime(2026, 6, 4, 2, 16, 33), 'salt', 1.6, 100.38, None, 46.61, 126.06, -0.05, 820.99, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:16:49.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:16:49.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:16:49.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:16:33, diff=16.988539s, valid=True
2026-06-04T02:16:49.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:16:49.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:16:49.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:17:12, diff=-22.008542s, valid=True
2026-06-04T02:16:49.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:16:49.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:16:49.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:16:31, diff=18.998175s, valid=True
2026-06-04T02:16:49.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:16:49.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:16:49.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:16:49.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:16:49.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:16:49.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:16:50.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:17:12, diff=-21.998741s, valid=True
2026-06-04T02:16:50.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:16:50.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:16:50.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:16:50.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106407.001918s, valid=True
2026-06-04T02:16:50.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:16:50.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:16:50.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:16:50.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:16:50.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:16:50.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:16:50.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:16:50.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:16:50.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:16:50.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:16:50.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:16:50.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:16:50.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:16:50.391 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:16:50.597 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:16:50.939 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:16:51.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:16:51.041 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:16:51.041 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:16:51.232 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:16:51.232 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:17:21.246 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:17:21.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:17:21.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:17:21.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:17:21.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:17:21.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:17:21.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:17:21.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:17:21.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:17:21.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:17:21.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:17:21.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:17:21.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:17:24.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:17:24.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:17:24.318 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:17:24.319 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:17:24.331 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:17:24.344 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:17:24.344 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:17:24.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:17:24.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:17:24.345 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:17:24.346 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:17:24.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:17:24.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:17:24.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:17:24.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:17:24.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:17:24.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:17:24.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:17:24.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:17:24.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:17:24.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:17:24.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:17:24.670 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:17:24.742 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:17:04
2026-06-04T02:17:24.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87666, datetime.datetime(2026, 6, 4, 2, 17, 4), datetime.datetime(2026, 6, 4, 2, 17, 4), 'salt', 1.73, 100.41, None, 41.49, 129.0, -0.06, 821.05, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:17:24.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:17:24.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:17:24.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:17:04, diff=20.749832s, valid=True
2026-06-04T02:17:24.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:17:24.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:17:24.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:17:12, diff=12.753222s, valid=True
2026-06-04T02:17:24.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:17:24.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:17:24.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:17:01, diff=23.761433s, valid=True
2026-06-04T02:17:24.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:17:24.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:17:24.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:17:24.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:17:24.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:17:24.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:17:24.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:17:12, diff=12.765061s, valid=True
2026-06-04T02:17:24.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:17:24.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:17:24.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:17:24.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106441.765848s, valid=True
2026-06-04T02:17:24.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:17:24.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:17:24.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:17:24.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:17:24.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:17:24.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:17:24.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:17:24.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:17:24.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:17:24.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:17:24.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:17:24.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:17:25.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:17:25.086 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:17:25.293 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:17:25.633 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:17:25.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:17:25.735 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:17:25.735 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:17:25.934 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:17:25.934 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:17:55.937 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:17:55.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:17:55.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:17:56.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:17:56.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:17:56.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:17:56.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:17:56.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:17:56.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:17:56.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:17:56.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:17:56.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:17:56.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:17:58.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:17:58.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:17:58.966 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:17:58.966 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:17:58.976 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:17:58.988 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:17:58.989 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:17:58.989 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:17:58.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:17:58.989 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:17:58.989 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:17:58.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:17:59.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T02:17:59.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:17:59.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T02:17:59.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:17:59.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:17:59.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:17:59.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:17:59.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:17:59.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:17:59.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:17:59.297 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:17:59.410 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:17:35
2026-06-04T02:17:59.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87667, datetime.datetime(2026, 6, 4, 2, 17, 35), datetime.datetime(2026, 6, 4, 2, 17, 34), 'salt', 1.67, 100.38, None, 53.1, 145.07, -0.05, 820.99, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:17:59.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:17:59.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T02:17:59.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:17:34, diff=25.418006s, valid=True
2026-06-04T02:17:59.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:17:59.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:17:59.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:18:12, diff=-12.578496s, valid=True
2026-06-04T02:17:59.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:17:59.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T02:17:59.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:17:31, diff=28.429703s, valid=True
2026-06-04T02:17:59.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:17:59.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:17:59.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:17:59.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:17:59.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:17:59.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:17:59.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:18:12, diff=-12.566513s, valid=True
2026-06-04T02:17:59.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:17:59.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:17:59.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:17:59.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106476.434327s, valid=True
2026-06-04T02:17:59.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:17:59.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:17:59.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:17:59.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:17:59.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:17:59.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:17:59.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:17:59.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:17:59.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:17:59.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:17:59.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:17:59.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:17:59.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:17:59.823 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:18:00.052 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:18:00.403 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:18:00.506 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:18:00.506 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:18:00.506 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:18:00.764 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:18:00.764 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:18:30.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:18:30.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:18:30.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:18:31.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:18:31.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:18:31.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:18:31.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:18:31.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:18:31.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:18:31.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:18:31.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:18:31.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:18:31.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:18:33.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:18:33.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:18:33.838 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:18:33.838 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:18:33.847 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:18:33.860 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:18:33.860 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:18:33.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:18:33.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:18:33.861 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:18:33.862 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:18:33.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:18:34.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T02:18:34.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:18:34.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T02:18:34.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:18:34.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:18:34.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:18:34.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:18:34.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:18:34.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:18:34.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:18:34.209 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:18:34.280 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:18:05
2026-06-04T02:18:34.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87668, datetime.datetime(2026, 6, 4, 2, 18, 5), datetime.datetime(2026, 6, 4, 2, 18, 4), 'salt', 1.7, 100.41, None, 54.55, 130.76, -0.06, 820.99, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:18:34.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:18:34.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T02:18:34.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:18:04, diff=30.287861s, valid=True
2026-06-04T02:18:34.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:18:34.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:18:34.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:18:12, diff=22.291339s, valid=True
2026-06-04T02:18:34.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:18:34.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T02:18:34.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:18:02, diff=32.299535s, valid=True
2026-06-04T02:18:34.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:18:34.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:18:34.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:18:34.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:18:34.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:18:34.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:18:34.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:18:12, diff=22.303356s, valid=True
2026-06-04T02:18:34.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:18:34.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:18:34.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:18:34.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106511.304186s, valid=True
2026-06-04T02:18:34.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:18:34.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:18:34.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:18:34.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:18:34.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:18:34.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:18:34.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:18:34.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:18:34.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:18:34.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:18:34.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:18:34.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:18:34.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:18:34.624 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:18:34.830 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:18:35.175 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:18:35.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:18:35.276 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:18:35.276 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:18:35.523 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:18:35.523 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:19:05.554 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:19:05.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:19:05.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:19:05.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:19:05.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:19:06.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:19:06.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:19:06.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:19:06.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:19:06.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:19:06.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:19:06.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:19:06.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:19:08.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:19:08.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:19:08.658 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:19:08.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:19:08.670 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:19:08.683 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:19:08.683 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:19:08.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:19:08.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:19:08.685 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:19:08.685 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:19:08.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:19:08.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:19:08.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:19:08.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:19:08.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:19:09.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:19:09.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:19:09.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:19:09.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:19:09.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:19:09.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:19:09.050 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:19:09.122 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:19:05
2026-06-04T02:19:09.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87670, datetime.datetime(2026, 6, 4, 2, 19, 5), datetime.datetime(2026, 6, 4, 2, 19, 5), 'salt', 1.63, 100.35, None, 45.06, 118.69, -0.05, 821.05, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:19:09.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:19:09.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:19:09.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:19:05, diff=4.129686s, valid=True
2026-06-04T02:19:09.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:19:09.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:19:09.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:19:12, diff=-2.866817s, valid=True
2026-06-04T02:19:09.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:19:09.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:19:09.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:19:02, diff=7.141646s, valid=True
2026-06-04T02:19:09.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:19:09.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:19:09.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:19:09.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:19:09.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:19:09.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:19:09.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:19:12, diff=-2.854598s, valid=True
2026-06-04T02:19:09.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:19:09.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:19:09.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:19:09.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106546.146226s, valid=True
2026-06-04T02:19:09.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:19:09.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:19:09.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:19:09.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:19:09.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:19:09.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:19:09.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:19:09.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:19:09.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:19:09.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:19:09.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:19:09.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:19:09.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:19:09.466 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:19:09.672 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:19:10.032 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:19:10.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:19:10.141 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:19:10.141 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:19:10.325 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:19:10.326 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:19:40.356 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:19:40.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:19:40.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:19:40.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:19:40.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:19:41.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:19:41.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:19:41.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:19:41.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:19:41.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:19:41.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:19:41.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:19:41.128 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:19:43.719 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:19:43.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:19:43.727 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:19:43.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:19:43.738 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:19:43.751 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:19:43.752 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:19:43.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:19:43.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:19:43.753 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:19:43.753 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:19:43.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:19:43.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:19:43.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:19:44.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:19:44.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:19:44.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:19:44.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:19:44.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:19:44.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:19:44.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:19:44.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:19:44.131 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:19:44.204 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:19:35
2026-06-04T02:19:44.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87671, datetime.datetime(2026, 6, 4, 2, 19, 35), datetime.datetime(2026, 6, 4, 2, 19, 35), 'salt', 1.6, 100.31, None, 44.0, 123.24, -0.05, 821.05, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:19:44.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:19:44.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:19:44.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:19:35, diff=9.212275s, valid=True
2026-06-04T02:19:44.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:19:44.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:19:44.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:20:12, diff=-27.784257s, valid=True
2026-06-04T02:19:44.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:19:44.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:19:44.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:19:32, diff=12.223907s, valid=True
2026-06-04T02:19:44.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:19:44.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:19:44.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:19:44.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:19:44.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:19:44.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:19:44.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:20:12, diff=-27.772398s, valid=True
2026-06-04T02:19:44.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:19:44.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:19:44.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:19:44.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106581.228409s, valid=True
2026-06-04T02:19:44.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:19:44.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:19:44.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:19:44.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:19:44.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:19:44.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:19:44.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:19:44.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:19:44.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:19:44.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:19:44.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:19:44.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:19:44.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:19:44.555 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:19:44.764 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:19:45.163 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:19:45.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:19:45.266 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:19:45.266 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:19:45.455 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:19:45.455 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:20:15.480 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:20:15.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:20:15.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:20:15.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:20:15.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:20:16.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:20:16.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:20:16.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:20:16.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:20:16.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:20:16.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:20:16.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:20:16.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:20:18.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:20:18.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:20:18.656 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:20:18.656 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:20:18.667 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:20:18.679 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:20:18.679 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:20:18.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:20:18.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:20:18.681 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:20:18.681 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:20:18.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:20:18.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:20:18.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:20:18.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:20:18.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:20:18.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:20:18.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:20:19.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:20:19.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:20:19.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:20:19.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:20:19.028 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:20:19.115 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:20:06
2026-06-04T02:20:19.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87672, datetime.datetime(2026, 6, 4, 2, 20, 6), datetime.datetime(2026, 6, 4, 2, 20, 5), 'salt', 1.63, 100.34, None, 51.58, 122.44, -0.05, 821.11, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:20:19.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:20:19.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:20:19.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:20:05, diff=14.122534s, valid=True
2026-06-04T02:20:19.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:20:19.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:20:19.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:20:12, diff=7.126041s, valid=True
2026-06-04T02:20:19.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:20:19.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:20:19.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:20:02, diff=17.134128s, valid=True
2026-06-04T02:20:19.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:20:19.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:20:19.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:20:19.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:20:19.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:20:19.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:20:19.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:20:12, diff=7.137847s, valid=True
2026-06-04T02:20:19.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:20:19.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:20:19.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:20:19.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106616.138662s, valid=True
2026-06-04T02:20:19.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:20:19.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:20:19.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:20:19.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:20:19.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:20:19.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:20:19.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:20:19.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:20:19.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:20:19.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:20:19.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:20:19.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:20:19.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:20:19.460 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:20:19.665 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:20:20.032 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:20:20.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:20:20.137 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:20:20.137 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:20:20.373 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:20:20.373 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:20:50.380 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:20:50.380 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:20:50.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:20:50.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:20:50.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:20:51.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:20:51.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:20:51.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:20:51.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:20:51.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:20:51.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:20:51.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:20:51.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:20:53.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:20:53.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:20:53.591 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:20:53.591 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:20:53.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:20:53.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:20:53.613 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:20:53.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:20:53.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:20:53.614 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:20:53.614 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:20:53.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:20:53.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:20:53.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:20:53.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:20:53.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:20:53.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:20:53.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:20:53.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:20:53.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:20:53.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:20:53.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:20:53.953 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:20:54.024 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:20:36
2026-06-04T02:20:54.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87673, datetime.datetime(2026, 6, 4, 2, 20, 36), datetime.datetime(2026, 6, 4, 2, 20, 35), 'salt', 1.67, 100.44, None, 56.52, 126.86, -0.06, 821.11, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:20:54.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:20:54.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:20:54.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:20:35, diff=19.032385s, valid=True
2026-06-04T02:20:54.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:20:54.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:20:54.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:21:12, diff=-17.964061s, valid=True
2026-06-04T02:20:54.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:20:54.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:20:54.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:20:33, diff=21.044165s, valid=True
2026-06-04T02:20:54.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:20:54.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:20:54.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:20:54.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:20:54.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:20:54.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:20:54.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:21:12, diff=-17.952084s, valid=True
2026-06-04T02:20:54.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:20:54.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:20:54.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:20:54.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106651.048704s, valid=True
2026-06-04T02:20:54.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:20:54.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:20:54.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:20:54.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:20:54.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:20:54.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:20:54.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:20:54.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:20:54.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:20:54.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:20:54.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:20:54.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:20:54.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:20:54.441 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:20:54.647 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:20:54.989 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:20:55.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:20:55.091 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:20:55.091 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:20:55.278 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:20:55.278 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:21:25.290 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:21:25.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:21:25.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:21:25.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:21:25.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:21:25.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:21:25.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:21:26.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:21:26.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:21:26.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:21:26.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:21:26.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:21:26.034 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:21:28.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:21:28.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:21:28.505 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:21:28.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:21:28.516 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:21:28.529 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:21:28.530 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:21:28.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:21:28.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:21:28.531 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:21:28.531 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:21:28.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:21:28.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:21:28.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:21:28.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:21:28.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:21:28.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:21:28.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:21:28.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:21:28.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:21:28.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:21:28.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:21:28.862 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:21:28.935 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:21:06
2026-06-04T02:21:28.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87674, datetime.datetime(2026, 6, 4, 2, 21, 6), datetime.datetime(2026, 6, 4, 2, 21, 5), 'salt', 1.67, 100.38, None, 53.63, 137.38, -0.05, 820.93, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:21:28.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:21:28.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:21:28.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:21:05, diff=23.941742s, valid=True
2026-06-04T02:21:28.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:21:28.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:21:28.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:21:12, diff=16.944598s, valid=True
2026-06-04T02:21:28.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:21:28.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:21:28.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:21:03, diff=25.951202s, valid=True
2026-06-04T02:21:28.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:21:28.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:21:28.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:21:28.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:21:28.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:21:28.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:21:28.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:21:12, diff=16.954287s, valid=True
2026-06-04T02:21:28.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:21:28.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:21:28.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:21:28.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106685.954947s, valid=True
2026-06-04T02:21:28.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:21:28.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:21:28.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:21:28.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:21:28.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:21:29.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:21:29.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:21:29.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:21:29.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:21:29.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:21:29.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:21:29.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:21:29.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:21:29.272 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:21:29.479 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:21:29.822 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:21:29.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:21:29.937 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:21:29.937 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:21:31.468 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:21:31.469 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:22:01.498 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:22:01.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:22:01.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:22:01.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:22:01.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:22:02.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:22:02.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:22:02.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:22:02.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:22:02.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:22:02.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:22:02.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:22:02.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:22:04.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:22:04.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:22:04.304 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:22:04.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:22:04.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:22:04.327 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:22:04.328 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:22:04.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:22:04.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:22:04.329 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:22:04.329 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:22:04.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:22:04.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T02:22:04.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:22:04.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T02:22:04.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:22:04.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:22:04.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:22:04.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:22:04.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:22:04.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:22:04.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:22:04.669 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:22:04.744 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:21:36
2026-06-04T02:22:04.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87675, datetime.datetime(2026, 6, 4, 2, 21, 36), datetime.datetime(2026, 6, 4, 2, 21, 36), 'salt', 1.67, 100.38, None, 56.66, 126.79, -0.05, 820.74, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:22:04.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:22:04.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T02:22:04.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:21:36, diff=28.752252s, valid=True
2026-06-04T02:22:04.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:22:04.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:22:04.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:22:12, diff=-7.244174s, valid=True
2026-06-04T02:22:04.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:22:04.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T02:22:04.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:21:33, diff=31.764346s, valid=True
2026-06-04T02:22:04.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:22:04.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:22:04.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:22:04.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:22:04.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:22:04.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:22:04.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:22:12, diff=-7.231882s, valid=True
2026-06-04T02:22:04.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:22:04.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:22:04.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:22:04.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106721.768941s, valid=True
2026-06-04T02:22:04.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:22:04.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:22:04.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:22:04.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:22:04.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:22:04.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:22:04.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:22:04.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:22:04.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:22:04.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:22:04.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:22:05.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:22:05.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:22:05.156 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:22:05.361 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:22:05.701 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:22:05.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:22:05.804 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:22:05.804 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:22:06.063 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:22:06.063 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:22:36.092 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:22:36.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:22:36.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:22:36.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:22:36.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:22:36.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:22:36.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:22:36.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:22:36.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:22:36.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:22:36.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:22:36.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:22:36.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:22:39.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:22:39.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:22:39.176 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:22:39.177 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:22:39.186 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:22:39.199 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:22:39.199 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:22:39.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:22:39.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:22:39.201 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:22:39.201 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:22:39.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:22:39.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:22:39.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:22:39.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:22:39.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:22:39.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:22:39.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:22:39.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:22:39.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:22:39.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:22:39.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:22:39.541 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:22:39.622 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:22:37
2026-06-04T02:22:39.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87677, datetime.datetime(2026, 6, 4, 2, 22, 37), datetime.datetime(2026, 6, 4, 2, 22, 36), 'salt', 1.63, 100.51, None, 53.28, 127.66, -0.08, 821.29, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:22:39.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:22:39.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:22:39.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:22:36, diff=3.630275s, valid=True
2026-06-04T02:22:39.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:22:39.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:22:39.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:23:12, diff=-32.366227s, valid=True
2026-06-04T02:22:39.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:22:39.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:22:39.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:22:34, diff=5.642096s, valid=True
2026-06-04T02:22:39.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:22:39.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:22:39.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:22:39.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:22:39.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:22:39.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:22:39.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:23:12, diff=-32.354151s, valid=True
2026-06-04T02:22:39.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:22:39.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:22:39.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:22:39.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106756.646657s, valid=True
2026-06-04T02:22:39.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:22:39.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:22:39.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:22:39.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:22:39.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:22:39.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:22:39.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:22:39.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:22:39.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:22:39.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:22:39.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:22:39.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:22:39.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:22:39.980 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:22:40.205 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:22:40.551 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:22:40.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:22:40.655 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:22:40.655 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:22:41.043 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:22:41.043 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:23:11.073 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:23:11.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:23:11.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:23:11.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:23:11.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:23:11.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:23:11.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:23:11.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:23:11.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:23:11.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:23:11.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:23:11.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:23:11.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:23:14.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:23:14.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:23:14.219 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:23:14.220 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:23:14.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:23:14.243 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:23:14.243 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:23:14.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:23:14.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:23:14.244 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:23:14.244 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:23:14.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:23:14.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:23:14.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:23:14.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:23:14.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:23:14.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:23:14.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:23:14.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:23:14.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:23:14.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:23:14.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:23:14.594 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:23:14.666 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:23:07
2026-06-04T02:23:14.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87678, datetime.datetime(2026, 6, 4, 2, 23, 7), datetime.datetime(2026, 6, 4, 2, 23, 7), 'salt', 1.63, 100.38, None, 56.59, 123.88, -0.06, 821.05, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:23:14.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:23:14.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:23:14.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:23:07, diff=7.672749s, valid=True
2026-06-04T02:23:14.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:23:14.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:23:14.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:23:12, diff=2.675533s, valid=True
2026-06-04T02:23:14.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:23:14.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:23:14.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:23:04, diff=10.68193s, valid=True
2026-06-04T02:23:14.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:23:14.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:23:14.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:23:14.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:23:14.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:23:14.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:23:14.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:23:12, diff=2.684915s, valid=True
2026-06-04T02:23:14.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:23:14.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:23:14.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:23:14.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106791.685568s, valid=True
2026-06-04T02:23:14.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:23:14.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:23:14.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:23:14.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:23:14.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:23:14.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:23:14.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:23:14.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:23:14.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:23:14.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:23:14.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:23:14.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:23:15.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:23:15.070 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:23:15.275 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:23:15.617 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:23:15.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:23:15.719 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:23:15.719 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:23:15.904 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:23:15.904 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:23:45.907 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:23:45.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:23:45.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:23:46.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:23:46.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:23:46.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:23:46.444 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:23:46.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:23:46.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:23:46.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:23:46.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:23:46.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:23:46.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:23:48.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:23:48.908 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:23:48.909 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:23:48.909 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:23:48.919 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:23:48.932 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:23:48.932 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:23:48.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:23:48.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:23:48.934 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:23:48.934 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:23:48.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:23:49.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:23:49.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:23:49.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:23:49.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:23:49.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:23:49.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:23:49.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:23:49.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:23:49.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:23:49.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:23:49.272 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:23:49.343 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:23:38
2026-06-04T02:23:49.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87679, datetime.datetime(2026, 6, 4, 2, 23, 38), datetime.datetime(2026, 6, 4, 2, 23, 37), 'salt', 1.6, 100.48, None, 43.68, 123.92, -0.07, 821.11, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:23:49.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:23:49.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:23:49.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:23:37, diff=12.35006s, valid=True
2026-06-04T02:23:49.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:23:49.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:23:49.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:24:12, diff=-22.646571s, valid=True
2026-06-04T02:23:49.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:23:49.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:23:49.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:23:35, diff=14.361232s, valid=True
2026-06-04T02:23:49.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:23:49.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:23:49.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:23:49.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:23:49.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:23:49.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:23:49.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:24:12, diff=-22.635175s, valid=True
2026-06-04T02:23:49.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:23:49.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:23:49.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:23:49.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106826.365597s, valid=True
2026-06-04T02:23:49.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:23:49.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:23:49.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:23:49.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:23:49.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:23:49.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:23:49.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:23:49.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:23:49.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:23:49.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:23:49.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:23:49.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:23:49.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:23:49.685 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:23:49.896 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:23:50.266 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:23:50.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:23:50.368 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:23:50.368 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:23:50.457 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:23:50.457 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:24:20.487 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:24:20.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:24:20.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:24:20.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:24:20.806 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:24:21.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:24:21.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:24:21.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:24:21.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:24:21.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:24:21.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:24:21.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:24:21.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:24:23.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:24:23.801 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:24:23.802 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:24:23.802 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:24:23.812 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:24:23.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:24:23.826 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:24:23.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:24:23.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:24:23.827 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:24:23.827 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:24:23.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:24:23.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:24:23.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:24:24.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:24:24.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:24:24.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:24:24.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:24:24.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:24:24.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:24:24.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:24:24.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:24:24.163 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:24:24.234 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:24:08
2026-06-04T02:24:24.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87680, datetime.datetime(2026, 6, 4, 2, 24, 8), datetime.datetime(2026, 6, 4, 2, 24, 7), 'salt', 1.67, 100.48, None, 43.72, 119.32, -0.06, 821.11, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:24:24.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:24:24.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:24:24.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:24:07, diff=17.241766s, valid=True
2026-06-04T02:24:24.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:24:24.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:24:24.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:24:12, diff=12.24527s, valid=True
2026-06-04T02:24:24.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:24:24.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:24:24.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:24:05, diff=19.253395s, valid=True
2026-06-04T02:24:24.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:24:24.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:24:24.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:24:24.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:24:24.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:24:24.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:24:24.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:24:12, diff=12.257139s, valid=True
2026-06-04T02:24:24.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:24:24.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:24:24.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:24:24.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106861.257971s, valid=True
2026-06-04T02:24:24.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:24:24.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:24:24.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:24:24.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:24:24.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:24:24.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:24:24.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:24:24.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:24:24.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:24:24.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:24:24.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:24:24.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:24:24.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:24:24.581 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:24:24.791 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:24:25.131 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:24:25.233 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:24:25.233 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:24:25.233 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:24:25.490 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:24:25.490 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:24:55.520 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:24:55.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:24:55.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:24:55.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:24:55.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:24:55.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:24:55.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:24:55.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:24:55.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:24:55.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:24:55.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:24:55.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:24:55.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:24:58.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:24:58.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:24:58.422 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:24:58.422 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:24:58.434 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:24:58.447 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:24:58.447 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:24:58.448 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:24:58.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:24:58.448 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:24:58.448 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:24:58.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:24:58.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:24:58.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:24:58.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:24:58.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:24:58.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:24:58.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:24:58.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:24:58.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:24:58.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:24:58.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:24:58.777 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:24:58.849 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:24:38
2026-06-04T02:24:58.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87681, datetime.datetime(2026, 6, 4, 2, 24, 38), datetime.datetime(2026, 6, 4, 2, 24, 37), 'salt', 1.63, 100.44, None, 50.52, 125.12, -0.07, 820.93, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:24:58.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:24:58.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:24:58.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:24:37, diff=21.855935s, valid=True
2026-06-04T02:24:58.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:24:58.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:24:58.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:25:12, diff=-13.141009s, valid=True
2026-06-04T02:24:58.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:24:58.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:24:58.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:24:35, diff=23.865744s, valid=True
2026-06-04T02:24:58.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:24:58.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:24:58.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:24:58.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:24:58.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:24:58.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:24:58.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:25:12, diff=-13.131246s, valid=True
2026-06-04T02:24:58.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:24:58.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:24:58.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:24:58.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106895.869403s, valid=True
2026-06-04T02:24:58.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:24:58.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:24:58.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:24:58.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:24:58.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:24:58.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:24:58.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:24:58.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:24:58.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:24:59.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:24:59.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:24:59.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:24:59.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:24:59.181 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:24:59.385 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:24:59.784 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:24:59.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:24:59.891 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:24:59.891 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:25:00.079 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:25:00.080 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:25:30.109 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:25:30.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:25:30.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:25:30.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:25:30.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:25:30.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:25:30.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:25:30.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:25:30.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:25:30.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:25:30.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:25:30.719 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:25:30.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:25:33.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:25:33.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:25:33.224 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:25:33.225 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:25:33.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:25:33.248 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:25:33.249 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:25:33.249 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:25:33.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:25:33.250 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:25:33.250 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:25:33.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:25:33.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T02:25:33.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:25:33.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T02:25:33.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:25:33.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:25:33.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:25:33.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:25:33.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:25:33.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:25:33.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:25:33.543 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:25:33.623 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:25:08
2026-06-04T02:25:33.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87682, datetime.datetime(2026, 6, 4, 2, 25, 8), datetime.datetime(2026, 6, 4, 2, 25, 8), 'salt', 1.73, 100.48, None, 42.09, 122.16, -0.07, 820.86, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:25:33.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:25:33.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T02:25:33.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:25:08, diff=25.630362s, valid=True
2026-06-04T02:25:33.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:25:33.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:25:33.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:25:12, diff=21.633764s, valid=True
2026-06-04T02:25:33.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:25:33.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T02:25:33.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:25:05, diff=28.641477s, valid=True
2026-06-04T02:25:33.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:25:33.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:25:33.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:25:33.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:25:33.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:25:33.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:25:33.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:25:12, diff=21.645063s, valid=True
2026-06-04T02:25:33.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:25:33.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:25:33.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:25:33.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106930.64586s, valid=True
2026-06-04T02:25:33.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:25:33.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:25:33.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:25:33.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:25:33.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:25:33.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:25:33.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:25:33.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:25:33.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:25:33.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:25:33.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:25:33.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:25:33.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:25:33.966 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:25:34.171 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:25:34.512 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:25:34.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:25:34.614 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:25:34.614 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:25:34.700 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:25:34.700 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:26:04.704 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:26:04.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:26:04.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:26:04.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:26:05.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:26:05.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:26:05.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:26:05.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:26:05.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:26:05.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:26:05.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:26:05.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:26:05.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:26:07.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:26:07.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:26:07.567 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:26:07.567 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:26:07.578 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:26:07.591 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:26:07.591 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:26:07.592 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:26:07.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:26:07.593 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:26:07.593 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:26:07.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:26:07.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T02:26:07.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:26:07.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T02:26:07.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:26:07.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:26:07.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:26:07.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:26:07.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:26:07.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:26:07.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:26:07.916 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:26:07.987 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:25:39
2026-06-04T02:26:07.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87683, datetime.datetime(2026, 6, 4, 2, 25, 39), datetime.datetime(2026, 6, 4, 2, 25, 38), 'salt', 1.73, 100.44, None, 40.72, 128.55, -0.07, 820.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:26:07.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:26:07.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T02:26:07.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:25:38, diff=29.994982s, valid=True
2026-06-04T02:26:07.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:26:07.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:26:07.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:26:12, diff=-4.001708s, valid=True
2026-06-04T02:26:07.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:26:07.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T02:26:08.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:25:36, diff=32.006121s, valid=True
2026-06-04T02:26:08.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:26:08.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:26:08.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:26:08.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:26:08.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:26:08.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:26:08.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:26:12, diff=-3.990395s, valid=True
2026-06-04T02:26:08.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:26:08.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:26:08.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:26:08.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106965.010355s, valid=True
2026-06-04T02:26:08.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:26:08.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:26:08.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:26:08.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:26:08.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:26:08.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:26:08.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:26:08.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:26:08.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:26:08.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:26:08.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:26:08.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:26:08.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:26:08.331 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:26:08.612 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:26:08.960 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:26:09.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:26:09.062 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:26:09.062 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:26:09.251 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:26:09.252 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:26:39.272 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:26:39.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:26:39.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:26:39.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:26:39.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:26:39.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:26:39.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:26:39.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:26:39.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:26:39.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:26:39.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:26:39.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:26:39.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:26:42.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:26:42.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:26:42.159 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:26:42.159 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:26:42.170 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:26:42.182 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:26:42.183 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:26:42.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:26:42.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:26:42.184 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:26:42.184 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:26:42.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:26:42.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:26:42.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:26:42.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:26:42.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:26:42.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:26:42.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:26:42.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:26:42.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:26:42.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:26:42.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:26:42.494 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:26:42.578 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:26:39
2026-06-04T02:26:42.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87685, datetime.datetime(2026, 6, 4, 2, 26, 39), datetime.datetime(2026, 6, 4, 2, 26, 38), 'salt', 1.73, 100.48, None, 49.89, 121.34, -0.07, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:26:42.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:26:42.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:26:42.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:26:38, diff=4.585481s, valid=True
2026-06-04T02:26:42.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:26:42.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:26:42.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:27:12, diff=-29.411129s, valid=True
2026-06-04T02:26:42.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:26:42.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:26:42.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:26:36, diff=6.596692s, valid=True
2026-06-04T02:26:42.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:26:42.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:26:42.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:26:42.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:26:42.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:26:42.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:26:42.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:27:12, diff=-29.399718s, valid=True
2026-06-04T02:26:42.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:26:42.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:26:42.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:26:42.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=106999.60106s, valid=True
2026-06-04T02:26:42.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:26:42.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:26:42.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:26:42.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:26:42.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:26:42.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:26:42.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:26:42.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:26:42.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:26:42.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:26:42.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:26:42.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:26:42.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:26:42.921 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:26:43.126 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:26:43.467 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:26:43.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:26:43.569 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:26:43.569 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:26:43.813 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:26:43.813 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:27:13.843 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:27:13.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:27:13.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:27:14.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:27:14.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:27:14.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:27:14.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:27:14.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:27:14.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:27:14.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:27:14.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:27:14.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:27:14.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:27:17.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:27:17.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:27:17.227 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:27:17.227 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:27:17.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:27:17.251 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:27:17.252 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:27:17.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:27:17.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:27:17.253 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:27:17.253 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:27:17.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:27:17.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:27:17.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:27:17.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:27:17.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:27:17.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:27:17.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:27:17.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:27:17.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:27:17.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:27:17.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:27:17.640 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:27:17.712 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:27:09
2026-06-04T02:27:17.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87686, datetime.datetime(2026, 6, 4, 2, 27, 9), datetime.datetime(2026, 6, 4, 2, 27, 8), 'salt', 1.63, 100.38, None, 38.88, 129.37, -0.06, 820.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:27:17.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:27:17.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:27:17.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:27:08, diff=9.720566s, valid=True
2026-06-04T02:27:17.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:27:17.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:27:17.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:27:12, diff=5.724206s, valid=True
2026-06-04T02:27:17.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:27:17.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:27:17.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:27:06, diff=11.732723s, valid=True
2026-06-04T02:27:17.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:27:17.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:27:17.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:27:17.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:27:17.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:27:17.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:27:17.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:27:12, diff=5.736545s, valid=True
2026-06-04T02:27:17.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:27:17.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:27:17.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:27:17.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107034.737401s, valid=True
2026-06-04T02:27:17.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:27:17.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:27:17.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:27:17.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:27:17.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:27:17.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:27:17.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:27:17.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:27:17.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:27:17.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:27:17.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:27:17.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:27:18.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:27:18.130 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:27:18.335 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:27:18.675 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:27:18.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:27:18.777 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:27:18.778 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:27:18.964 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:27:18.964 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:27:48.968 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:27:48.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:27:48.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:27:49.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:27:49.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:27:49.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:27:49.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:27:49.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:27:49.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:27:49.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:27:49.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:27:49.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:27:49.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:27:51.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:27:51.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:27:51.992 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:27:51.993 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:27:52.003 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:27:52.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:27:52.016 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:27:52.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:27:52.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:27:52.017 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:27:52.017 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:27:52.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:27:52.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:27:52.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:27:52.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:27:52.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:27:52.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:27:52.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:27:52.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:27:52.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:27:52.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:27:52.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:27:52.379 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:27:52.497 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:27:39
2026-06-04T02:27:52.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87687, datetime.datetime(2026, 6, 4, 2, 27, 39), datetime.datetime(2026, 6, 4, 2, 27, 39), 'salt', 1.63, 100.38, None, 55.92, 120.92, -0.06, 820.99, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:27:52.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:27:52.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:27:52.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:27:39, diff=13.5048s, valid=True
2026-06-04T02:27:52.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:27:52.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:27:52.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:28:12, diff=-19.491524s, valid=True
2026-06-04T02:27:52.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:27:52.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:27:52.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:27:37, diff=15.517121s, valid=True
2026-06-04T02:27:52.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:27:52.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:27:52.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:27:52.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:27:52.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:27:52.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:27:52.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:28:12, diff=-19.478919s, valid=True
2026-06-04T02:27:52.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:27:52.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:27:52.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:27:52.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107069.521937s, valid=True
2026-06-04T02:27:52.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:27:52.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:27:52.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:27:52.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:27:52.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:27:52.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:27:52.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:27:52.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:27:52.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:27:52.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:27:52.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:27:52.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:27:52.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:27:52.853 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:27:53.058 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:27:53.666 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:27:53.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:27:53.768 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:27:53.768 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:27:55.366 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:27:55.366 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:28:25.396 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:28:25.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:28:25.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:28:25.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:28:25.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:28:26.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:28:26.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:28:26.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:28:26.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:28:26.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:28:26.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:28:26.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:28:26.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:28:28.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:28:28.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:28:28.570 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:28:28.571 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:28:28.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:28:28.601 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:28:28.601 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:28:28.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:28:28.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:28:28.603 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:28:28.603 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:28:28.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:28:28.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:28:28.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:28:28.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:28:28.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:28:28.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:28:28.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:28:28.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:28:28.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:28:28.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:28:28.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:28:28.950 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:28:29.021 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:28:10
2026-06-04T02:28:29.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87688, datetime.datetime(2026, 6, 4, 2, 28, 10), datetime.datetime(2026, 6, 4, 2, 28, 9), 'salt', 1.7, 100.44, None, 41.49, 129.16, -0.06, 820.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:28:29.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:28:29.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:28:29.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:28:09, diff=20.028698s, valid=True
2026-06-04T02:28:29.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:28:29.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:28:29.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:28:12, diff=17.032164s, valid=True
2026-06-04T02:28:29.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:28:29.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:28:29.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:28:07, diff=22.040435s, valid=True
2026-06-04T02:28:29.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:28:29.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:28:29.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:28:29.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:28:29.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:28:29.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:28:29.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:28:12, diff=17.044189s, valid=True
2026-06-04T02:28:29.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:28:29.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:28:29.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:28:29.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107106.045001s, valid=True
2026-06-04T02:28:29.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:28:29.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:28:29.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:28:29.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:28:29.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:28:29.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:28:29.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:28:29.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:28:29.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:28:29.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:28:29.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:28:29.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:28:29.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:28:29.432 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:28:29.637 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:28:29.999 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:28:30.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:28:30.104 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:28:30.104 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:28:30.341 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:28:30.341 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:29:00.356 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:29:00.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:29:00.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:29:00.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:29:00.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:29:01.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:29:01.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:29:01.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:29:01.169 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:29:01.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:29:01.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:29:01.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:29:01.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:29:03.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:29:03.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:29:03.709 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:29:03.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:29:03.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:29:03.732 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:29:03.733 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:29:03.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:29:03.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:29:03.734 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:29:03.734 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:29:03.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:29:03.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:29:03.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:29:03.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:29:03.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:29:04.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:29:04.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:29:04.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:29:04.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:29:04.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:29:04.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:29:04.101 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:29:04.186 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:28:40
2026-06-04T02:29:04.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87689, datetime.datetime(2026, 6, 4, 2, 28, 40), datetime.datetime(2026, 6, 4, 2, 28, 39), 'salt', 1.67, 100.48, None, 52.64, 132.9, -0.07, 820.87, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:29:04.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:29:04.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:29:04.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:28:39, diff=25.193251s, valid=True
2026-06-04T02:29:04.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:29:04.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:29:04.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:29:12, diff=-7.803664s, valid=True
2026-06-04T02:29:04.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:29:04.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:29:04.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:28:37, diff=27.20458s, valid=True
2026-06-04T02:29:04.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:29:04.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:29:04.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:29:04.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:29:04.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:29:04.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:29:04.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:29:12, diff=-7.792275s, valid=True
2026-06-04T02:29:04.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:29:04.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:29:04.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:29:04.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107141.208387s, valid=True
2026-06-04T02:29:04.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:29:04.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:29:04.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:29:04.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:29:04.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:29:04.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:29:04.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:29:04.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:29:04.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:29:04.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:29:04.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:29:04.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:29:04.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:29:04.531 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:29:04.741 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:29:05.088 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:29:05.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:29:05.192 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:29:05.192 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:29:05.399 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:29:05.399 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:29:35.430 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:29:35.430 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:29:35.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:29:35.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:29:35.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:29:36.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:29:36.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:29:36.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:29:36.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:29:36.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:29:36.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:29:36.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:29:36.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:29:39.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:29:39.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:29:39.192 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:29:39.193 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:29:39.202 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:29:39.215 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:29:39.215 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:29:39.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:29:39.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:29:39.216 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:29:39.217 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:29:39.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:29:39.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T02:29:39.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:29:39.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T02:29:39.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:29:39.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:29:39.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:29:39.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:29:39.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:29:39.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:29:39.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:29:39.569 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:29:39.642 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:29:10
2026-06-04T02:29:39.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87690, datetime.datetime(2026, 6, 4, 2, 29, 10), datetime.datetime(2026, 6, 4, 2, 29, 10), 'salt', 1.7, 100.55, None, 43.43, 122.96, -0.08, 820.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:29:39.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:29:39.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T02:29:39.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:29:10, diff=29.649412s, valid=True
2026-06-04T02:29:39.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:29:39.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:29:39.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:29:12, diff=27.65288s, valid=True
2026-06-04T02:29:39.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:29:39.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T02:29:39.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:29:07, diff=32.661105s, valid=True
2026-06-04T02:29:39.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:29:39.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:29:39.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:29:39.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:29:39.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:29:39.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:29:39.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:29:12, diff=27.664795s, valid=True
2026-06-04T02:29:39.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:29:39.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:29:39.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:29:39.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107176.665583s, valid=True
2026-06-04T02:29:39.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:29:39.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:29:39.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:29:39.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:29:39.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:29:39.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:29:39.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:29:39.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:29:39.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:29:39.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:29:39.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:29:39.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:29:40.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:29:40.074 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:29:40.284 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:29:40.625 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:29:40.729 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:29:40.729 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:29:40.729 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:29:40.815 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:29:40.815 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:30:10.831 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:30:10.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:30:10.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:30:10.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:30:10.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:30:11.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:30:11.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:30:11.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:30:11.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:30:11.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:30:11.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:30:11.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:30:11.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:30:13.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:30:13.599 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:30:13.600 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:30:13.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:30:13.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:30:13.623 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:30:13.625 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:30:13.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:30:13.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:30:13.626 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:30:13.626 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:30:13.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:30:13.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:30:13.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:30:13.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:30:13.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:30:13.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:30:13.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:30:13.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:30:13.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:30:13.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:30:13.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:30:13.973 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:30:14.046 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:30:11
2026-06-04T02:30:14.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87692, datetime.datetime(2026, 6, 4, 2, 30, 11), datetime.datetime(2026, 6, 4, 2, 30, 10), 'salt', 1.7, 100.41, None, 44.28, 126.95, -0.06, 821.05, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:30:14.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:30:14.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:30:14.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:30:10, diff=4.053462s, valid=True
2026-06-04T02:30:14.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:30:14.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:30:14.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:30:12, diff=2.056959s, valid=True
2026-06-04T02:30:14.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:30:14.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:30:14.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:30:08, diff=6.065027s, valid=True
2026-06-04T02:30:14.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:30:14.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:30:14.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:30:14.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:30:14.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:30:14.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:30:14.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:30:12, diff=2.068723s, valid=True
2026-06-04T02:30:14.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:30:14.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:30:14.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:30:14.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107211.069522s, valid=True
2026-06-04T02:30:14.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:30:14.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:30:14.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:30:14.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:30:14.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:30:14.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:30:14.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:30:14.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:30:14.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:30:14.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:30:14.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:30:14.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:30:14.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:30:14.388 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:30:14.606 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:30:14.947 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:30:15.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:30:15.049 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:30:15.049 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:30:15.317 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:30:15.317 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:30:45.345 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:30:45.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:30:45.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:30:45.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:30:45.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:30:45.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:30:45.933 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:30:45.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:30:45.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:30:45.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:30:45.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:30:45.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:30:45.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:30:48.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:30:48.633 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:30:48.635 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:30:48.635 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:30:48.644 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:30:48.657 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:30:48.657 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:30:48.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:30:48.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:30:48.658 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:30:48.658 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:30:48.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:30:48.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:30:48.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:30:48.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:30:48.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:30:48.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:30:48.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:30:49.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:30:49.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:30:49.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:30:49.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:30:49.018 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:30:49.098 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:30:41
2026-06-04T02:30:49.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87693, datetime.datetime(2026, 6, 4, 2, 30, 41), datetime.datetime(2026, 6, 4, 2, 30, 41), 'salt', 1.77, 100.45, None, 53.17, 118.29, -0.06, 820.99, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:30:49.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:30:49.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:30:49.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:30:41, diff=8.105697s, valid=True
2026-06-04T02:30:49.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:30:49.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:30:49.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:31:12, diff=-22.890654s, valid=True
2026-06-04T02:30:49.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:30:49.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:30:49.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:30:38, diff=11.117753s, valid=True
2026-06-04T02:30:49.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:30:49.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:30:49.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:30:49.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:30:49.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:30:49.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:30:49.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:31:12, diff=-22.87839s, valid=True
2026-06-04T02:30:49.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:30:49.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:30:49.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:30:49.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107246.122434s, valid=True
2026-06-04T02:30:49.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:30:49.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:30:49.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:30:49.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:30:49.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:30:49.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:30:49.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:30:49.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:30:49.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:30:49.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:30:49.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:30:49.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:30:49.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:30:49.441 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:30:49.644 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:30:50.002 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:30:50.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:30:50.109 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:30:50.109 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:30:50.296 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:30:50.296 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:31:20.325 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:31:20.325 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:31:20.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:31:20.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:31:20.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:31:20.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:31:20.882 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:31:20.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:31:20.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:31:20.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:31:20.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:31:20.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:31:20.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:31:23.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:31:23.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:31:23.459 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:31:23.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:31:23.469 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:31:23.482 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:31:23.483 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:31:23.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:31:23.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:31:23.484 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:31:23.484 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:31:23.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:31:23.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:31:23.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:31:23.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:31:23.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:31:23.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:31:23.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:31:23.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:31:23.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:31:23.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:31:23.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:31:23.822 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:31:23.896 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:31:12
2026-06-04T02:31:23.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87694, datetime.datetime(2026, 6, 4, 2, 31, 12), datetime.datetime(2026, 6, 4, 2, 31, 11), 'salt', 1.6, 100.45, None, 37.01, 124.82, -0.06, 820.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:31:23.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:31:23.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:31:23.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:31:11, diff=12.904188s, valid=True
2026-06-04T02:31:23.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:31:23.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:31:23.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:31:12, diff=11.907691s, valid=True
2026-06-04T02:31:23.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:31:23.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:31:23.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:31:08, diff=15.915835s, valid=True
2026-06-04T02:31:23.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:31:23.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:31:23.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:31:23.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:31:23.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:31:23.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:31:23.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:31:12, diff=11.919561s, valid=True
2026-06-04T02:31:23.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:31:23.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:31:23.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:31:23.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107280.920366s, valid=True
2026-06-04T02:31:23.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:31:23.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:31:23.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:31:23.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:31:23.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:31:23.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:31:23.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:31:23.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:31:24.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:31:24.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:31:24.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:31:24.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:31:24.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:31:24.242 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:31:24.443 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:31:24.781 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:31:24.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:31:24.943 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:31:24.943 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:31:25.180 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:31:25.180 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:31:55.210 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:31:55.211 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:31:55.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:31:55.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:31:55.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:31:55.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:31:55.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:31:55.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:31:55.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:31:55.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:31:55.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:31:55.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:31:55.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:31:57.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:31:57.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:31:57.991 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:31:57.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:31:58.002 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:31:58.014 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:31:58.014 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:31:58.015 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:31:58.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:31:58.016 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:31:58.016 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:31:58.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:31:58.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:31:58.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:31:58.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:31:58.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:31:58.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:31:58.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:31:58.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:31:58.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:31:58.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:31:58.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:31:58.356 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:31:58.429 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:31:42
2026-06-04T02:31:58.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87695, datetime.datetime(2026, 6, 4, 2, 31, 42), datetime.datetime(2026, 6, 4, 2, 31, 41), 'salt', 1.7, 100.48, None, 43.72, 124.75, -0.07, 820.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:31:58.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:31:58.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:31:58.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:31:41, diff=17.436548s, valid=True
2026-06-04T02:31:58.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:31:58.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:31:58.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:32:12, diff=-13.559917s, valid=True
2026-06-04T02:31:58.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:31:58.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:31:58.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:31:38, diff=20.448285s, valid=True
2026-06-04T02:31:58.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:31:58.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:31:58.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:31:58.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:31:58.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:31:58.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:31:58.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:32:12, diff=-13.54796s, valid=True
2026-06-04T02:31:58.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:31:58.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:31:58.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:31:58.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107315.452852s, valid=True
2026-06-04T02:31:58.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:31:58.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:31:58.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:31:58.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:31:58.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:31:58.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:31:58.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:31:58.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:31:58.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:31:58.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:31:58.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:31:58.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:31:58.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:31:58.780 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:31:58.983 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:31:59.320 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:31:59.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:31:59.422 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:31:59.422 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:31:59.617 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:31:59.617 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:32:29.647 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:32:29.648 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:32:29.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:32:30.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:32:30.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:32:30.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:32:30.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:32:30.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:32:30.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:32:30.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:32:30.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:32:30.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:32:30.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:32:32.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:32:32.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:32:32.957 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:32:32.957 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:32:32.968 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:32:32.980 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:32:32.981 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:32:32.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:32:32.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:32:32.982 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:32:32.982 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:32:32.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:32:33.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:32:33.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:32:33.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:32:33.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:32:33.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:32:33.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:32:33.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:32:33.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:32:33.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:32:33.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:32:33.353 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:32:33.426 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:32:12
2026-06-04T02:32:33.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87696, datetime.datetime(2026, 6, 4, 2, 32, 12), datetime.datetime(2026, 6, 4, 2, 32, 11), 'salt', 1.77, 100.44, None, 48.34, 126.55, -0.06, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:32:33.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:32:33.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:32:33.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:32:11, diff=22.434019s, valid=True
2026-06-04T02:32:33.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:32:33.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:32:33.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:32:12, diff=21.437495s, valid=True
2026-06-04T02:32:33.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:32:33.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:32:33.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:32:09, diff=24.445603s, valid=True
2026-06-04T02:32:33.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:32:33.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:32:33.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:32:33.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:32:33.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:32:33.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:32:33.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:32:12, diff=21.449347s, valid=True
2026-06-04T02:32:33.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:32:33.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:32:33.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:32:33.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107350.450163s, valid=True
2026-06-04T02:32:33.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:32:33.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:32:33.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:32:33.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:32:33.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:32:33.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:32:33.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:32:33.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:32:33.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:32:33.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:32:33.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:32:33.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:32:33.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:32:33.768 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:32:34.044 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:32:34.389 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:32:34.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:32:34.491 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:32:34.492 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:32:34.746 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:32:34.746 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:33:04.776 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:33:04.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:33:04.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:33:05.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:33:05.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:33:05.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:33:05.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:33:05.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:33:05.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:33:05.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:33:05.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:33:05.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:33:05.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:33:07.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:33:07.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:33:07.713 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:33:07.713 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:33:07.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:33:07.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:33:07.738 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:33:07.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:33:07.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:33:07.739 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:33:07.739 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:33:07.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:33:07.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T02:33:07.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:33:07.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T02:33:07.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:33:08.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:33:08.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:33:08.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:33:08.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:33:08.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:33:08.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:33:08.086 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:33:08.163 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:32:43
2026-06-04T02:33:08.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87697, datetime.datetime(2026, 6, 4, 2, 32, 43), datetime.datetime(2026, 6, 4, 2, 32, 42), 'salt', 1.73, 100.48, None, 44.35, 126.58, -0.07, 820.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:33:08.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:33:08.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T02:33:08.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:32:42, diff=26.17127s, valid=True
2026-06-04T02:33:08.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:33:08.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:33:08.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:33:12, diff=-3.825134s, valid=True
2026-06-04T02:33:08.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:33:08.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T02:33:08.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:32:39, diff=29.183295s, valid=True
2026-06-04T02:33:08.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:33:08.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:33:08.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:33:08.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:33:08.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:33:08.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:33:08.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:33:12, diff=-3.812888s, valid=True
2026-06-04T02:33:08.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:33:08.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:33:08.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:33:08.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107385.187969s, valid=True
2026-06-04T02:33:08.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:33:08.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:33:08.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:33:08.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:33:08.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:33:08.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:33:08.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:33:08.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:33:08.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:33:08.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:33:08.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:33:08.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:33:08.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:33:08.514 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:33:08.723 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:33:09.071 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:33:09.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:33:09.174 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:33:09.174 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:33:09.369 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:33:09.369 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:33:39.385 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:33:39.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:33:39.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:33:39.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:33:39.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:33:40.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:33:40.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:33:40.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:33:40.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:33:40.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:33:40.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:33:40.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:33:40.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:33:42.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:33:42.825 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:33:42.826 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:33:42.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:33:42.836 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:33:42.848 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:33:42.849 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:33:42.849 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:33:42.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:33:42.850 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:33:42.850 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:33:42.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:33:42.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T02:33:42.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:33:43.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T02:33:43.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:33:43.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:33:43.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:33:43.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:33:43.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:33:43.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:33:43.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:33:43.199 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:33:43.272 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:33:13
2026-06-04T02:33:43.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87698, datetime.datetime(2026, 6, 4, 2, 33, 13), datetime.datetime(2026, 6, 4, 2, 33, 12), 'salt', 1.7, 100.48, None, 45.2, 119.34, -0.07, 820.87, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:33:43.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:33:43.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T02:33:43.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:33:12, diff=31.279423s, valid=True
2026-06-04T02:33:43.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:33:43.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:33:43.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:33:12, diff=31.282513s, valid=True
2026-06-04T02:33:43.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:33:43.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T02:33:43.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:33:10, diff=33.289788s, valid=True
2026-06-04T02:33:43.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:33:43.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:33:43.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:33:43.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:33:43.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:33:43.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:33:43.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:33:12, diff=31.293094s, valid=True
2026-06-04T02:33:43.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:33:43.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:33:43.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:33:43.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107420.293814s, valid=True
2026-06-04T02:33:43.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:33:43.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:33:43.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:33:43.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:33:43.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:33:43.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:33:43.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:33:43.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:33:43.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:33:43.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:33:43.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:33:43.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:33:43.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:33:43.682 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:33:43.884 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:33:44.224 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:33:44.325 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:33:44.325 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:33:44.325 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:33:44.483 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:33:44.483 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:34:14.507 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:34:14.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:34:14.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:34:14.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:34:15.012 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:34:15.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:34:15.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:34:15.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:34:15.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:34:15.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:34:15.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:34:15.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:34:15.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:34:17.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:34:17.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:34:17.741 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:34:17.741 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:34:17.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:34:17.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:34:17.766 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:34:17.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:34:17.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:34:17.767 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:34:17.767 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:34:17.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:34:17.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:34:17.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:34:18.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:34:18.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:34:18.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:34:18.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:34:18.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:34:18.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:34:18.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:34:18.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:34:18.104 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:34:18.175 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:34:13
2026-06-04T02:34:18.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87700, datetime.datetime(2026, 6, 4, 2, 34, 13), datetime.datetime(2026, 6, 4, 2, 34, 13), 'salt', 1.77, 100.48, None, 50.6, 131.46, -0.06, 820.99, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:34:18.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:34:18.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:34:18.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:34:13, diff=5.183688s, valid=True
2026-06-04T02:34:18.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:34:18.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:34:18.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:34:12, diff=6.187177s, valid=True
2026-06-04T02:34:18.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:34:18.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:34:18.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:34:10, diff=8.19546s, valid=True
2026-06-04T02:34:18.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:34:18.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:34:18.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:34:18.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:34:18.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:34:18.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:34:18.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:34:12, diff=6.199306s, valid=True
2026-06-04T02:34:18.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:34:18.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:34:18.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:34:18.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107455.200143s, valid=True
2026-06-04T02:34:18.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:34:18.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:34:18.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:34:18.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:34:18.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:34:18.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:34:18.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:34:18.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:34:18.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:34:18.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:34:18.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:34:18.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:34:18.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:34:18.535 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:34:18.738 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:34:19.077 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:34:19.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:34:19.179 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:34:19.179 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:34:19.413 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:34:19.413 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:34:49.414 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:34:49.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:34:49.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:34:49.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:34:49.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:34:50.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:34:50.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:34:50.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:34:50.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:34:50.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:34:50.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:34:50.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:34:50.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:34:52.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:34:52.669 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:34:52.670 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:34:52.670 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:34:52.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:34:52.692 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:34:52.693 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:34:52.694 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:34:52.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:34:52.694 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:34:52.695 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:34:52.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:34:52.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:34:52.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:34:52.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:34:52.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:34:52.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:34:52.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:34:53.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:34:53.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:34:53.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:34:53.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:34:53.034 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:34:53.105 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:34:44
2026-06-04T02:34:53.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87701, datetime.datetime(2026, 6, 4, 2, 34, 44), datetime.datetime(2026, 6, 4, 2, 34, 43), 'salt', 1.73, 100.51, None, 42.97, 114.88, -0.08, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T02:34:53.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:34:53.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:34:53.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:34:43, diff=10.113204s, valid=True
2026-06-04T02:34:53.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:34:53.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:34:53.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:35:12, diff=-18.883328s, valid=True
2026-06-04T02:34:53.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:34:53.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:34:53.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:34:40, diff=13.124806s, valid=True
2026-06-04T02:34:53.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:34:53.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:34:53.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:34:53.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:34:53.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:34:53.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:34:53.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:35:12, diff=-18.871475s, valid=True
2026-06-04T02:34:53.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:34:53.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:34:53.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:34:53.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107490.129336s, valid=True
2026-06-04T02:34:53.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:34:53.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:34:53.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:34:53.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:34:53.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:34:53.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:34:53.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:34:53.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:34:53.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:34:53.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:34:53.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:34:53.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:34:53.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:34:53.520 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:34:53.725 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:34:54.070 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:34:54.172 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:34:54.172 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:34:54.172 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:34:54.372 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:34:54.372 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:35:24.399 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:35:24.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:35:24.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:35:24.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:35:24.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:35:24.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:35:24.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:35:24.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:35:24.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:35:24.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:35:24.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:35:24.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:35:24.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:35:27.117 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:35:27.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:35:27.126 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:35:27.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:35:27.138 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:35:27.151 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:35:27.151 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:35:27.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:35:27.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:35:27.152 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:35:27.153 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:35:27.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:35:27.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:35:27.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:35:27.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:35:27.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:35:27.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:35:27.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:35:27.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:35:27.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:35:27.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:35:27.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:35:27.483 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:35:27.554 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:35:14
2026-06-04T02:35:27.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87702, datetime.datetime(2026, 6, 4, 2, 35, 14), datetime.datetime(2026, 6, 4, 2, 35, 13), 'salt', 1.73, 100.48, None, 39.41, 117.82, -0.07, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T02:35:27.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:35:27.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:35:27.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:35:13, diff=14.561997s, valid=True
2026-06-04T02:35:27.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:35:27.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:35:27.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:35:12, diff=15.565587s, valid=True
2026-06-04T02:35:27.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:35:27.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:35:27.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:35:11, diff=16.574135s, valid=True
2026-06-04T02:35:27.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:35:27.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:35:27.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:35:27.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:35:27.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:35:27.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:35:27.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:35:12, diff=15.578168s, valid=True
2026-06-04T02:35:27.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:35:27.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:35:27.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:35:27.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107524.579011s, valid=True
2026-06-04T02:35:27.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:35:27.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:35:27.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:35:27.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:35:27.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:35:27.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:35:27.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:35:27.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:35:27.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:35:27.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:35:27.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:35:27.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:35:27.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:35:27.911 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:35:28.123 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:35:28.470 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:35:28.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:35:28.573 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:35:28.573 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:35:28.731 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:35:28.731 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:35:58.758 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:35:58.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:35:58.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:35:59.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:35:59.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:35:59.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:35:59.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:35:59.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:35:59.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:35:59.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:35:59.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:35:59.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:35:59.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:36:02.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:36:02.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:36:02.074 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:36:02.074 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:36:02.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:36:02.096 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:36:02.097 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:36:02.097 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:36:02.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:36:02.098 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:36:02.098 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:36:02.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:36:02.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:36:02.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:36:02.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:36:02.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:36:02.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:36:02.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:36:02.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:36:02.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:36:02.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:36:02.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:36:02.508 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:36:02.597 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:35:44
2026-06-04T02:36:02.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87703, datetime.datetime(2026, 6, 4, 2, 35, 44), datetime.datetime(2026, 6, 4, 2, 35, 44), 'salt', 1.73, 100.48, None, 45.8, 120.87, -0.07, 821.05, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T02:36:02.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:36:02.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:36:02.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:35:44, diff=18.603524s, valid=True
2026-06-04T02:36:02.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:36:02.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:36:02.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:36:12, diff=-9.393588s, valid=True
2026-06-04T02:36:02.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:36:02.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:36:02.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:35:41, diff=21.613111s, valid=True
2026-06-04T02:36:02.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:36:02.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:36:02.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:36:02.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:36:02.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:36:02.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:36:02.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:36:12, diff=-9.383848s, valid=True
2026-06-04T02:36:02.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:36:02.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:36:02.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:36:02.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107559.616806s, valid=True
2026-06-04T02:36:02.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:36:02.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:36:02.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:36:02.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:36:02.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:36:02.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:36:02.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:36:02.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:36:02.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:36:02.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:36:02.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:36:02.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:36:02.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:36:02.929 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:36:03.133 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:36:03.474 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:36:03.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:36:03.577 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:36:03.577 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:36:03.731 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:36:03.732 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:36:33.758 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:36:33.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:36:33.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:36:34.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:36:34.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:36:34.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:36:34.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:36:34.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:36:34.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:36:34.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:36:34.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:36:34.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:36:34.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:36:37.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:36:37.026 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:36:37.026 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:36:37.027 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:36:37.037 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:36:37.049 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:36:37.050 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:36:37.050 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:36:37.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:36:37.051 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:36:37.051 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:36:37.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:36:37.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:36:37.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:36:37.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:36:37.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:36:37.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:36:37.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:36:37.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:36:37.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:36:37.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:36:37.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:36:37.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:36:37.459 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:36:15
2026-06-04T02:36:37.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87704, datetime.datetime(2026, 6, 4, 2, 36, 15), datetime.datetime(2026, 6, 4, 2, 36, 14), 'salt', 1.73, 100.44, None, 49.15, 116.1, -0.07, 820.93, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T02:36:37.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:36:37.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:36:37.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:36:14, diff=23.466627s, valid=True
2026-06-04T02:36:37.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:36:37.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:36:37.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:36:12, diff=25.470106s, valid=True
2026-06-04T02:36:37.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:36:37.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:36:37.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:36:11, diff=26.478109s, valid=True
2026-06-04T02:36:37.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:36:37.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:36:37.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:36:37.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:36:37.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:36:37.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:36:37.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:36:12, diff=25.481821s, valid=True
2026-06-04T02:36:37.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:36:37.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:36:37.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:36:37.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107594.482635s, valid=True
2026-06-04T02:36:37.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:36:37.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:36:37.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:36:37.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:36:37.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:36:37.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:36:37.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:36:37.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:36:37.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:36:37.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:36:37.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:36:37.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:36:37.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:36:37.806 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:36:38.010 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:36:38.352 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:36:38.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:36:38.466 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:36:38.466 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:36:38.664 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:36:38.665 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:37:08.695 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:37:08.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:37:08.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:37:08.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:37:08.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:37:09.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:37:09.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:37:09.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:37:09.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:37:09.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:37:09.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:37:09.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:37:09.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:37:11.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:37:11.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:37:11.611 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:37:11.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:37:11.623 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:37:11.636 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:37:11.637 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:37:11.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:37:11.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:37:11.638 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:37:11.638 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:37:11.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:37:11.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T02:37:11.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:37:11.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T02:37:11.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:37:11.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:37:11.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:37:11.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:37:11.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:37:12.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:37:12.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:37:12.001 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:37:12.073 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:36:45
2026-06-04T02:37:12.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87705, datetime.datetime(2026, 6, 4, 2, 36, 45), datetime.datetime(2026, 6, 4, 2, 36, 44), 'salt', 1.77, 100.48, None, 52.64, 121.46, -0.06, 820.86, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T02:37:12.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:37:12.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T02:37:12.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:36:44, diff=28.080567s, valid=True
2026-06-04T02:37:12.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:37:12.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:37:12.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:37:12, diff=0.083975s, valid=True
2026-06-04T02:37:12.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:37:12.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T02:37:12.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:36:42, diff=30.091912s, valid=True
2026-06-04T02:37:12.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:37:12.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:37:12.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:37:12.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:37:12.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:37:12.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:37:12.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:37:12, diff=0.095488s, valid=True
2026-06-04T02:37:12.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:37:12.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:37:12.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:37:12.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107629.096264s, valid=True
2026-06-04T02:37:12.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:37:12.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:37:12.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:37:12.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:37:12.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:37:12.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:37:12.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:37:12.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:37:12.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:37:12.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:37:12.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:37:12.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:37:12.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:37:12.415 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:37:12.610 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:37:12.942 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:37:13.042 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:37:13.042 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:37:13.042 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:37:13.320 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:37:13.320 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:37:43.338 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:37:43.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:37:43.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:37:43.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:37:43.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:37:44.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:37:44.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:37:44.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:37:44.090 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:37:44.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:37:44.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:37:44.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:37:44.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:37:46.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:37:46.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:37:46.466 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:37:46.466 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:37:46.477 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:37:46.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:37:46.490 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:37:46.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:37:46.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:37:46.491 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:37:46.492 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:37:46.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:37:46.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:37:46.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:37:46.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:37:46.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:37:46.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:37:46.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:37:46.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:37:46.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:37:46.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:37:46.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:37:46.840 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:37:46.911 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:37:46
2026-06-04T02:37:46.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87707, datetime.datetime(2026, 6, 4, 2, 37, 46), datetime.datetime(2026, 6, 4, 2, 37, 46), 'salt', 1.8, 100.51, None, 39.02, 128.5, -0.07, 821.17, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:37:46.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:37:46.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:37:46.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:37:46, diff=0.91929s, valid=True
2026-06-04T02:37:46.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:37:46.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:37:46.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:38:12, diff=-25.077236s, valid=True
2026-06-04T02:37:46.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:37:46.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:37:46.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:37:43, diff=3.930995s, valid=True
2026-06-04T02:37:46.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:37:46.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:37:46.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:37:46.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:37:46.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:37:46.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:37:46.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:38:12, diff=-25.065293s, valid=True
2026-06-04T02:37:46.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:37:46.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:37:46.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:37:46.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107663.935484s, valid=True
2026-06-04T02:37:46.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:37:46.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:37:46.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:37:46.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:37:46.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:37:47.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:37:47.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:37:47.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:37:47.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:37:47.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:37:47.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:37:47.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:37:47.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:37:47.257 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:37:47.458 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:37:47.852 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:37:47.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:37:47.955 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:37:47.955 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:37:48.158 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:37:48.159 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:38:18.189 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:38:18.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:38:18.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:38:18.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:38:18.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:38:18.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:38:18.746 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:38:18.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:38:18.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:38:18.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:38:18.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:38:18.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:38:18.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:38:21.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:38:21.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:38:21.201 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:38:21.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:38:21.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:38:21.226 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:38:21.226 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:38:21.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:38:21.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:38:21.228 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:38:21.228 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:38:21.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:38:21.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:38:21.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:38:21.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:38:21.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:38:21.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:38:21.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:38:21.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:38:21.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:38:21.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:38:21.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:38:21.562 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:38:21.633 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:38:17
2026-06-04T02:38:21.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87708, datetime.datetime(2026, 6, 4, 2, 38, 17), datetime.datetime(2026, 6, 4, 2, 38, 16), 'salt', 1.77, 100.48, None, 46.01, 132.0, -0.06, 821.05, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:38:21.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:38:21.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:38:21.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:38:16, diff=5.643328s, valid=True
2026-06-04T02:38:21.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:38:21.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:38:21.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:38:12, diff=9.64709s, valid=True
2026-06-04T02:38:21.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:38:21.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:38:21.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:38:13, diff=8.655668s, valid=True
2026-06-04T02:38:21.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:38:21.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:38:21.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:38:21.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:38:21.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:38:21.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:38:21.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:38:12, diff=9.659571s, valid=True
2026-06-04T02:38:21.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:38:21.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:38:21.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:38:21.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107698.66047s, valid=True
2026-06-04T02:38:21.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:38:21.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:38:21.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:38:21.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:38:21.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:38:21.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:38:21.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:38:21.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:38:21.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:38:21.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:38:21.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:38:21.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:38:21.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:38:21.982 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:38:22.183 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:38:22.517 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:38:22.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:38:22.617 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:38:22.617 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:38:22.811 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:38:22.811 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:38:52.819 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:38:52.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:38:52.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:38:53.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:38:53.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:38:53.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:38:53.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:38:53.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:38:53.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:38:53.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:38:53.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:38:53.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:38:53.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:38:56.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:38:56.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:38:56.013 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:38:56.013 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:38:56.024 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:38:56.043 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:38:56.044 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:38:56.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:38:56.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:38:56.045 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:38:56.045 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:38:56.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:38:56.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:38:56.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:38:56.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:38:56.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:38:56.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:38:56.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:38:56.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:38:56.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:38:56.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:38:56.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:38:56.378 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:38:56.447 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:38:47
2026-06-04T02:38:56.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87709, datetime.datetime(2026, 6, 4, 2, 38, 47), datetime.datetime(2026, 6, 4, 2, 38, 46), 'salt', 1.83, 100.54, None, 49.08, 114.22, -0.08, 821.11, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:38:56.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:38:56.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:38:56.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:38:46, diff=10.455164s, valid=True
2026-06-04T02:38:56.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:38:56.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:38:56.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:39:12, diff=-15.54132s, valid=True
2026-06-04T02:38:56.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:38:56.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:38:56.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:38:43, diff=13.466951s, valid=True
2026-06-04T02:38:56.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:38:56.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:38:56.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:38:56.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:38:56.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:38:56.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:38:56.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:39:12, diff=-15.529245s, valid=True
2026-06-04T02:38:56.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:38:56.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:38:56.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:38:56.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107733.471573s, valid=True
2026-06-04T02:38:56.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:38:56.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:38:56.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:38:56.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:38:56.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:38:56.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:38:56.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:38:56.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:38:56.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:38:56.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:38:56.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:38:56.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:38:56.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:38:56.788 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:38:57.055 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:38:57.386 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:38:57.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:38:57.486 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:38:57.486 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:38:57.672 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:38:57.673 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:39:27.692 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:39:27.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:39:27.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:39:27.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:39:28.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:39:28.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:39:28.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:39:28.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:39:28.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:39:28.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:39:28.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:39:28.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:39:28.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:39:30.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:39:30.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:39:30.673 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:39:30.673 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:39:30.683 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:39:30.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:39:30.701 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:39:30.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:39:30.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:39:30.702 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:39:30.702 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:39:30.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:39:30.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:39:30.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:39:30.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:39:30.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:39:30.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:39:30.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:39:31.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:39:31.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:39:31.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:39:31.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:39:31.032 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:39:31.105 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:39:17
2026-06-04T02:39:31.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87710, datetime.datetime(2026, 6, 4, 2, 39, 17), datetime.datetime(2026, 6, 4, 2, 39, 17), 'salt', 1.77, 100.48, None, 51.19, 120.0, -0.06, 821.11, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:39:31.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:39:31.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:39:31.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:39:17, diff=14.112576s, valid=True
2026-06-04T02:39:31.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:39:31.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:39:31.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:39:12, diff=19.11583s, valid=True
2026-06-04T02:39:31.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:39:31.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:39:31.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:39:13, diff=18.123s, valid=True
2026-06-04T02:39:31.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:39:31.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:39:31.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:39:31.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:39:31.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:39:31.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:39:31.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:39:12, diff=19.126087s, valid=True
2026-06-04T02:39:31.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:39:31.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:39:31.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:39:31.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107768.126743s, valid=True
2026-06-04T02:39:31.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:39:31.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:39:31.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:39:31.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:39:31.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:39:31.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:39:31.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:39:31.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:39:31.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:39:31.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:39:31.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:39:31.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:39:31.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:39:31.444 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:39:31.643 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:39:31.985 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:39:32.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:39:32.085 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:39:32.085 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:39:32.274 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:39:32.275 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:40:02.305 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:40:02.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:40:02.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:40:02.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:40:02.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:40:02.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:40:02.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:40:02.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:40:02.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:40:02.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:40:02.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:40:02.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:40:02.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:40:05.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:40:05.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:40:05.184 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:40:05.184 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:40:05.194 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:40:05.207 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:40:05.208 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:40:05.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:40:05.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:40:05.209 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:40:05.209 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:40:05.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:40:05.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:40:05.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:40:05.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:40:05.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:40:05.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:40:05.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:40:05.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:40:05.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:40:05.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:40:05.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:40:05.604 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:40:05.725 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:39:48
2026-06-04T02:40:05.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87711, datetime.datetime(2026, 6, 4, 2, 39, 48), datetime.datetime(2026, 6, 4, 2, 39, 47), 'salt', 1.73, 100.54, None, 43.01, 118.94, -0.08, 821.11, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:40:05.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:40:05.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:40:05.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:39:47, diff=18.732208s, valid=True
2026-06-04T02:40:05.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:40:05.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:40:05.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:40:12, diff=-6.264478s, valid=True
2026-06-04T02:40:05.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:40:05.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:40:05.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:39:44, diff=21.743426s, valid=True
2026-06-04T02:40:05.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:40:05.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:40:05.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:40:05.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:40:05.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:40:05.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:40:05.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:40:12, diff=-6.253028s, valid=True
2026-06-04T02:40:05.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:40:05.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:40:05.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:40:05.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107802.747755s, valid=True
2026-06-04T02:40:05.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:40:05.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:40:05.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:40:05.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:40:05.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:40:05.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:40:05.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:40:05.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:40:05.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:40:05.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:40:05.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:40:05.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:40:06.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:40:06.143 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:40:06.337 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:40:06.675 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:40:06.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:40:06.775 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:40:06.775 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:40:07.036 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:40:07.037 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:40:37.064 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:40:37.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:40:37.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:40:37.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:40:37.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:40:37.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:40:37.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:40:37.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:40:37.633 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:40:37.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:40:37.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:40:37.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:40:37.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:40:39.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:40:39.949 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:40:39.949 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:40:39.949 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:40:39.959 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:40:39.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:40:39.974 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:40:39.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:40:39.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:40:39.974 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:40:39.974 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:40:39.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:40:40.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:40:40.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:40:40.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:40:40.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:40:40.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:40:40.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:40:40.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:40:40.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:40:40.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:40:40.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:40:40.246 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:40:40.315 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:40:18
2026-06-04T02:40:40.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87712, datetime.datetime(2026, 6, 4, 2, 40, 18), datetime.datetime(2026, 6, 4, 2, 40, 17), 'salt', 1.73, 100.54, None, 46.96, 120.54, -0.08, 820.93, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:40:40.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:40:40.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:40:40.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:40:17, diff=23.321655s, valid=True
2026-06-04T02:40:40.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:40:40.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:40:40.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:40:12, diff=28.32471s, valid=True
2026-06-04T02:40:40.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:40:40.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:40:40.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:40:14, diff=26.331887s, valid=True
2026-06-04T02:40:40.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:40:40.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:40:40.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:40:40.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:40:40.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:40:40.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:40:40.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:40:12, diff=28.335131s, valid=True
2026-06-04T02:40:40.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:40:40.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:40:40.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:40:40.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107837.335846s, valid=True
2026-06-04T02:40:40.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:40:40.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:40:40.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:40:40.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:40:40.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:40:40.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:40:40.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:40:40.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:40:40.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:40:40.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:40:40.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:40:40.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:40:40.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:40:40.652 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:40:40.847 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:40:41.178 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:40:41.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:40:41.279 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:40:41.279 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:40:41.541 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:40:41.541 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:41:11.564 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:41:11.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:41:11.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:41:11.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:41:11.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:41:12.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:41:12.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:41:12.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:41:12.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:41:12.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:41:12.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:41:12.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:41:12.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:41:14.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:41:14.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:41:14.655 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:41:14.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:41:14.666 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:41:14.678 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:41:14.679 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:41:14.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:41:14.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:41:14.680 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:41:14.680 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:41:14.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:41:14.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T02:41:14.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:41:14.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T02:41:14.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:41:14.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:41:14.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:41:15.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:41:15.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:41:15.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:41:15.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:41:15.020 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:41:15.093 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:40:48
2026-06-04T02:41:15.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87713, datetime.datetime(2026, 6, 4, 2, 40, 48), datetime.datetime(2026, 6, 4, 2, 40, 47), 'salt', 1.83, 100.58, None, 45.59, 127.45, -0.08, 821.11, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:41:15.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:41:15.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T02:41:15.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:40:47, diff=28.10025s, valid=True
2026-06-04T02:41:15.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:41:15.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:41:15.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:41:12, diff=3.103669s, valid=True
2026-06-04T02:41:15.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:41:15.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T02:41:15.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:40:44, diff=31.111652s, valid=True
2026-06-04T02:41:15.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:41:15.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:41:15.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:41:15.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:41:15.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:41:15.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:41:15.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:41:12, diff=3.115242s, valid=True
2026-06-04T02:41:15.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:41:15.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:41:15.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:41:15.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107872.116029s, valid=True
2026-06-04T02:41:15.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:41:15.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:41:15.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:41:15.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:41:15.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:41:15.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:41:15.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:41:15.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:41:15.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:41:15.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:41:15.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:41:15.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:41:15.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:41:15.506 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:41:15.703 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:41:16.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:41:16.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:41:16.147 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:41:16.147 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:41:16.340 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:41:16.340 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:41:46.342 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:41:46.343 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:41:46.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:41:46.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:41:46.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:41:46.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:41:46.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:41:46.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:41:46.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:41:46.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:41:46.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:41:46.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:41:46.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:41:49.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:41:49.648 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:41:49.649 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:41:49.650 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:41:49.659 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:41:49.672 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:41:49.673 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:41:49.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:41:49.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:41:49.674 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:41:49.674 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:41:49.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:41:49.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:41:49.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:41:49.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:41:49.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:41:49.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:41:49.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:41:49.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:41:49.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:41:50.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:41:50.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:41:50.003 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:41:50.074 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:41:49
2026-06-04T02:41:50.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87715, datetime.datetime(2026, 6, 4, 2, 41, 49), datetime.datetime(2026, 6, 4, 2, 41, 48), 'salt', 1.83, 100.51, None, 46.11, 124.42, -0.08, 821.05, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:41:50.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:41:50.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:41:50.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:41:48, diff=2.081149s, valid=True
2026-06-04T02:41:50.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:41:50.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:41:50.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:42:12, diff=-21.914531s, valid=True
2026-06-04T02:41:50.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:41:50.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:41:50.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:41:45, diff=5.093516s, valid=True
2026-06-04T02:41:50.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:41:50.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:41:50.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:41:50.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:41:50.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:41:50.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:41:50.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:42:12, diff=-21.902808s, valid=True
2026-06-04T02:41:50.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:41:50.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:41:50.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:41:50.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107907.097979s, valid=True
2026-06-04T02:41:50.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:41:50.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:41:50.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:41:50.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:41:50.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:41:50.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:41:50.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:41:50.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:41:50.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:41:50.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:41:50.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:41:50.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:41:50.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:41:50.427 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:41:50.628 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:41:50.963 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:41:51.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:41:51.065 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:41:51.065 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:41:51.149 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:41:51.149 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:42:21.149 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:42:21.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:42:21.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:42:21.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:42:21.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:42:21.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:42:21.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:42:21.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:42:21.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:42:21.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:42:21.939 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:42:21.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:42:21.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:42:24.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:42:24.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:42:24.419 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:42:24.420 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:42:24.431 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:42:24.443 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:42:24.444 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:42:24.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:42:24.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:42:24.445 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:42:24.445 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:42:24.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:42:24.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:42:24.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:42:24.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:42:24.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:42:24.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:42:24.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:42:24.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:42:24.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:42:24.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:42:24.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:42:24.786 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:42:24.869 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:42:19
2026-06-04T02:42:24.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87716, datetime.datetime(2026, 6, 4, 2, 42, 19), datetime.datetime(2026, 6, 4, 2, 42, 18), 'salt', 1.77, 100.51, None, 41.07, 124.42, -0.07, 821.05, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:42:24.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:42:24.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:42:24.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:42:18, diff=6.876719s, valid=True
2026-06-04T02:42:24.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:42:24.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:42:24.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:42:12, diff=12.880198s, valid=True
2026-06-04T02:42:24.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:42:24.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:42:24.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:42:15, diff=9.888444s, valid=True
2026-06-04T02:42:24.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:42:24.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:42:24.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:42:24.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:42:24.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:42:24.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:42:24.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:42:12, diff=12.892249s, valid=True
2026-06-04T02:42:24.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:42:24.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:42:24.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:42:24.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107941.893074s, valid=True
2026-06-04T02:42:24.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:42:24.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:42:24.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:42:24.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:42:24.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:42:24.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:42:24.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:42:24.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:42:25.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:42:25.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:42:25.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:42:25.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:42:25.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:42:25.280 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:42:25.476 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:42:25.806 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:42:25.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:42:25.910 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:42:25.910 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:42:26.233 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:42:26.234 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:42:56.243 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:42:56.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:42:56.244 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:42:56.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:42:56.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:42:56.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:42:56.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:42:56.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:42:56.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:42:56.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:42:56.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:42:56.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:42:56.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:42:59.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:42:59.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:42:59.306 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:42:59.306 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:42:59.317 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:42:59.330 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:42:59.330 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:42:59.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:42:59.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:42:59.332 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:42:59.332 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:42:59.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:42:59.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:42:59.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:42:59.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:42:59.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:42:59.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:42:59.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:42:59.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:42:59.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:42:59.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:42:59.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:42:59.664 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:42:59.735 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:42:49
2026-06-04T02:42:59.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87717, datetime.datetime(2026, 6, 4, 2, 42, 49), datetime.datetime(2026, 6, 4, 2, 42, 48), 'salt', 1.77, 100.51, None, 41.0, 122.23, -0.07, 821.05, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:42:59.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:42:59.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:42:59.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:42:48, diff=11.743105s, valid=True
2026-06-04T02:42:59.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:42:59.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:42:59.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:43:12, diff=-12.253402s, valid=True
2026-06-04T02:42:59.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:42:59.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:42:59.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:42:45, diff=14.754608s, valid=True
2026-06-04T02:42:59.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:42:59.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:42:59.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:42:59.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:42:59.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:42:59.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:42:59.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:43:12, diff=-12.24161s, valid=True
2026-06-04T02:42:59.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:42:59.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:42:59.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:42:59.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=107976.759218s, valid=True
2026-06-04T02:42:59.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:42:59.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:42:59.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:42:59.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:42:59.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:42:59.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:42:59.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:42:59.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:42:59.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:42:59.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:42:59.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:43:00.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:43:00.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:43:00.097 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:43:00.294 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:43:00.622 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:43:00.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:43:00.721 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:43:00.721 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:43:01.006 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:43:01.006 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:43:31.016 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:43:31.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:43:31.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:43:31.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:43:31.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:43:31.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:43:31.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:43:31.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:43:31.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:43:31.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:43:31.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:43:31.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:43:31.674 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:43:34.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:43:34.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:43:34.245 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:43:34.245 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:43:34.255 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:43:34.267 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:43:34.268 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:43:34.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:43:34.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:43:34.269 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:43:34.270 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:43:34.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:43:34.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:43:34.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:43:34.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:43:34.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:43:34.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:43:34.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:43:34.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T02:43:34.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:43:34.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:43:34.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:43:34.605 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:43:34.677 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:43:19
2026-06-04T02:43:34.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87718, datetime.datetime(2026, 6, 4, 2, 43, 19), datetime.datetime(2026, 6, 4, 2, 43, 19), 'salt', 1.8, 100.48, None, 44.35, 120.78, -0.07, 821.11, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:43:34.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:43:34.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:43:34.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:43:19, diff=15.684597s, valid=True
2026-06-04T02:43:34.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:43:34.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:43:34.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:43:12, diff=22.688048s, valid=True
2026-06-04T02:43:34.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:43:34.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:43:34.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:43:16, diff=18.696116s, valid=True
2026-06-04T02:43:34.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:43:34.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:43:34.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:43:34.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:43:34.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:43:34.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T02:43:34.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:43:12, diff=22.699841s, valid=True
2026-06-04T02:43:34.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:43:34.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:43:34.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:43:34.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108011.700716s, valid=True
2026-06-04T02:43:34.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:43:34.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:43:34.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:43:34.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:43:34.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:43:34.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:43:34.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:43:34.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:43:34.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:43:34.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:43:34.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:43:34.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:43:34.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:43:35.021 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:43:35.216 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:43:35.547 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:43:35.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:43:35.650 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:43:35.650 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:43:35.867 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:43:35.867 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:44:05.898 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:44:05.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:44:05.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:44:06.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:44:06.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:44:06.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:44:06.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:44:06.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:44:06.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:44:06.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:44:06.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:44:06.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:44:06.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:44:09.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:44:09.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:44:09.061 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:44:09.061 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:44:09.069 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:44:09.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:44:09.081 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:44:09.081 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:44:09.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:44:09.082 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:44:09.082 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:44:09.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:44:09.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:44:09.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:44:09.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:44:09.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:44:09.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:44:09.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:44:09.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:44:09.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:44:09.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:44:09.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:44:09.426 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:44:09.498 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:43:50
2026-06-04T02:44:09.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87719, datetime.datetime(2026, 6, 4, 2, 43, 50), datetime.datetime(2026, 6, 4, 2, 43, 49), 'salt', 1.7, 100.54, None, 48.23, 118.57, -0.08, 820.93, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:44:09.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:44:09.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:44:09.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:43:49, diff=20.50541s, valid=True
2026-06-04T02:44:09.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:44:09.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:44:09.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:44:12, diff=-2.491446s, valid=True
2026-06-04T02:44:09.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:44:09.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:44:09.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:43:46, diff=23.516002s, valid=True
2026-06-04T02:44:09.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:44:09.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:44:09.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:44:09.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:44:09.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:44:09.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:44:09.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:44:12, diff=-2.480645s, valid=True
2026-06-04T02:44:09.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:44:09.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:44:09.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:44:09.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108046.520094s, valid=True
2026-06-04T02:44:09.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:44:09.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:44:09.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:44:09.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:44:09.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:44:09.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:44:09.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:44:09.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:44:09.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:44:09.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:44:09.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:44:09.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:44:09.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:44:09.839 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:44:10.054 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:44:10.408 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:44:10.579 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:44:10.579 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:44:10.579 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:44:10.663 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:44:10.663 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:44:40.693 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:44:40.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:44:40.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:44:40.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:44:41.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:44:41.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:44:41.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:44:41.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:44:41.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:44:41.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:44:41.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:44:41.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:44:41.268 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:44:43.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:44:43.674 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:44:43.674 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:44:43.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:44:43.684 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:44:43.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:44:43.824 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:44:43.825 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:44:43.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:44:43.825 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:44:43.825 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:44:43.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:44:43.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T02:44:43.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:44:44.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T02:44:44.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:44:44.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:44:44.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:44:44.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T02:44:44.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:44:44.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:44:44.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:44:44.185 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:44:44.255 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:44:20
2026-06-04T02:44:44.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87720, datetime.datetime(2026, 6, 4, 2, 44, 20), datetime.datetime(2026, 6, 4, 2, 44, 19), 'salt', 1.67, 100.51, None, 52.54, 126.86, -0.07, 820.99, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:44:44.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:44:44.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T02:44:44.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:44:19, diff=25.263249s, valid=True
2026-06-04T02:44:44.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:44:44.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:44:44.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:44:12, diff=32.266781s, valid=True
2026-06-04T02:44:44.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:44:44.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T02:44:44.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:44:16, diff=28.274899s, valid=True
2026-06-04T02:44:44.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:44:44.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:44:44.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:44:44.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:44:44.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:44:44.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T02:44:44.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:44:12, diff=32.278652s, valid=True
2026-06-04T02:44:44.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:44:44.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:44:44.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:44:44.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108081.279451s, valid=True
2026-06-04T02:44:44.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:44:44.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:44:44.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:44:44.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:44:44.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:44:44.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:44:44.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:44:44.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:44:44.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:44:44.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:44:44.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:44:44.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:44:44.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:44:44.601 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:44:44.797 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:44:45.128 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:44:45.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:44:45.228 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:44:45.228 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:44:45.388 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:44:45.388 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:45:15.418 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:45:15.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:45:15.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:45:15.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:45:15.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:45:15.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:45:15.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:45:15.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:45:15.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:45:15.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:45:15.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:45:15.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:45:15.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:45:18.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:45:18.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:45:18.243 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:45:18.243 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:45:18.255 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:45:18.268 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:45:18.269 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:45:18.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:45:18.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:45:18.270 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:45:18.270 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:45:18.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:45:18.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T02:45:18.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:45:18.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T02:45:18.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:45:18.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T02:45:18.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:45:18.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T02:45:18.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:45:18.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:45:18.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:45:18.611 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:45:18.685 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:44:50
2026-06-04T02:45:18.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87721, datetime.datetime(2026, 6, 4, 2, 44, 50), datetime.datetime(2026, 6, 4, 2, 44, 49), 'salt', 1.83, 100.58, None, 50.6, 123.31, -0.08, 821.05, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:45:18.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:45:18.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T02:45:18.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:44:49, diff=29.692483s, valid=True
2026-06-04T02:45:18.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:45:18.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T02:45:18.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:45:12, diff=6.695981s, valid=True
2026-06-04T02:45:18.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:45:18.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T02:45:18.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:44:46, diff=32.704177s, valid=True
2026-06-04T02:45:18.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:45:18.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:45:18.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:45:18.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:45:18.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:45:18.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T02:45:18.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:45:12, diff=6.70791s, valid=True
2026-06-04T02:45:18.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:45:18.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:45:18.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:45:18.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108115.708718s, valid=True
2026-06-04T02:45:18.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:45:18.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:45:18.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:45:18.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:45:18.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:45:18.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:45:18.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:45:18.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:45:18.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:45:18.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:45:18.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:45:18.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:45:18.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:45:19.031 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:45:19.301 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:45:19.632 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:45:19.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:45:19.732 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:45:19.732 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:45:19.819 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:45:19.819 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:45:49.826 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:45:49.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:45:49.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:45:49.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:45:49.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:45:50.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:45:50.169 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:45:50.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:45:50.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:45:50.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:45:50.199 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:45:50.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:45:50.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:45:52.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:45:52.683 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:45:52.684 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:45:52.684 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:45:52.695 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:45:52.710 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:45:52.710 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:45:52.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:45:52.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:45:52.712 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:45:52.712 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:45:52.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:45:52.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:45:52.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:45:52.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:45:52.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:45:52.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:45:52.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:45:53.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:45:53.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:45:53.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:45:53.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:45:53.041 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:45:53.111 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:45:51
2026-06-04T02:45:53.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87723, datetime.datetime(2026, 6, 4, 2, 45, 51), datetime.datetime(2026, 6, 4, 2, 45, 50), 'salt', 1.77, 100.58, None, 44.92, 130.15, -0.08, 821.05, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:45:53.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:45:53.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:45:53.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:45:50, diff=3.118493s, valid=True
2026-06-04T02:45:53.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:45:53.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:45:53.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:46:12, diff=-18.878008s, valid=True
2026-06-04T02:45:53.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:45:53.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:45:53.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:45:47, diff=6.130095s, valid=True
2026-06-04T02:45:53.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:45:53.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:45:53.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:45:53.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:45:53.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:45:53.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:45:53.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:46:12, diff=-18.866192s, valid=True
2026-06-04T02:45:53.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:45:53.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:45:53.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:45:53.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108150.134604s, valid=True
2026-06-04T02:45:53.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:45:53.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:45:53.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:45:53.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:45:53.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:45:53.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:45:53.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:45:53.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:45:53.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:45:53.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:45:53.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:45:53.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:45:53.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:45:53.457 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:45:53.651 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:45:53.982 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:45:54.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:45:54.082 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:45:54.082 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:45:54.293 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:45:54.294 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:46:24.316 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:46:24.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:46:24.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:46:24.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:46:24.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:46:24.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:46:24.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:46:24.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:46:24.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:46:24.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:46:24.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:46:24.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:46:24.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:46:28.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:46:28.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:46:28.103 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:46:28.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:46:28.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:46:28.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:46:28.127 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:46:28.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:46:28.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:46:28.129 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:46:28.129 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:46:28.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:46:28.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:46:28.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:46:28.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:46:28.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:46:28.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:46:28.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:46:28.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:46:28.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:46:28.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:46:28.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:46:28.466 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:46:28.537 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:46:21
2026-06-04T02:46:28.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87724, datetime.datetime(2026, 6, 4, 2, 46, 21), datetime.datetime(2026, 6, 4, 2, 46, 20), 'salt', 1.67, 100.44, None, 37.93, 134.14, -0.06, 821.11, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:46:28.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:46:28.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:46:28.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:46:20, diff=8.545161s, valid=True
2026-06-04T02:46:28.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:46:28.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:46:28.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:46:12, diff=16.548661s, valid=True
2026-06-04T02:46:28.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:46:28.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:46:28.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:46:17, diff=11.556885s, valid=True
2026-06-04T02:46:28.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:46:28.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:46:28.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:46:28.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:46:28.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:46:28.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:46:28.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:46:12, diff=16.560614s, valid=True
2026-06-04T02:46:28.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:46:28.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:46:28.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:46:28.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108185.561427s, valid=True
2026-06-04T02:46:28.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:46:28.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:46:28.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:46:28.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:46:28.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:46:28.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:46:28.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:46:28.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:46:28.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:46:28.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:46:28.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:46:28.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:46:28.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:46:28.954 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:46:29.148 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:46:29.481 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:46:29.581 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:46:29.581 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:46:29.581 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:46:29.771 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:46:29.772 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:46:59.802 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:46:59.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:46:59.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:47:00.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:47:00.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:47:00.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:47:00.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:47:00.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:47:00.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:47:00.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:47:00.314 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:47:00.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:47:00.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:47:03.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:47:03.097 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:47:03.098 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:47:03.098 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:47:03.109 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:47:03.122 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:47:03.122 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:47:03.123 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:47:03.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:47:03.123 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:47:03.124 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:47:03.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:47:03.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:47:03.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:47:03.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:47:03.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:47:03.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:47:03.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:47:03.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:47:03.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:47:03.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:47:03.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:47:03.451 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:47:03.522 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:46:51
2026-06-04T02:47:03.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87725, datetime.datetime(2026, 6, 4, 2, 46, 51), datetime.datetime(2026, 6, 4, 2, 46, 50), 'salt', 1.83, 100.61, None, 39.02, 127.96, -0.09, 821.11, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:47:03.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:47:03.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:47:03.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:46:50, diff=13.529324s, valid=True
2026-06-04T02:47:03.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:47:03.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:47:03.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:47:12, diff=-8.467184s, valid=True
2026-06-04T02:47:03.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:47:03.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:47:03.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:46:47, diff=16.540578s, valid=True
2026-06-04T02:47:03.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:47:03.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:47:03.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:47:03.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:47:03.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:47:03.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:47:03.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:47:12, diff=-8.45581s, valid=True
2026-06-04T02:47:03.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:47:03.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:47:03.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:47:03.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108220.544974s, valid=True
2026-06-04T02:47:03.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:47:03.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:47:03.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:47:03.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:47:03.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:47:03.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:47:03.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:47:03.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:47:03.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:47:03.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:47:03.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:47:03.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:47:03.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:47:03.892 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:47:04.093 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:47:04.425 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:47:04.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:47:04.525 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:47:04.525 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:47:04.715 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:47:04.715 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:47:34.745 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:47:34.746 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:47:34.746 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:47:35.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:47:35.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:47:35.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:47:35.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:47:35.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:47:35.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:47:35.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:47:35.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:47:35.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:47:35.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:47:37.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:47:37.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:47:37.706 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:47:37.706 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:47:37.717 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:47:37.729 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:47:37.730 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:47:37.731 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:47:37.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:47:37.731 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:47:37.732 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:47:37.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:47:37.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:47:37.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:47:37.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:47:37.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:47:37.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:47:37.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:47:38.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:47:38.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:47:38.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:47:38.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:47:38.022 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:47:38.107 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:47:21
2026-06-04T02:47:38.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87726, datetime.datetime(2026, 6, 4, 2, 47, 21), datetime.datetime(2026, 6, 4, 2, 47, 21), 'salt', 1.87, 100.51, None, 43.08, 126.98, -0.07, 821.17, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:47:38.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:47:38.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:47:38.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:47:21, diff=17.113756s, valid=True
2026-06-04T02:47:38.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:47:38.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:47:38.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:47:12, diff=26.116631s, valid=True
2026-06-04T02:47:38.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:47:38.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:47:38.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:47:18, diff=20.123283s, valid=True
2026-06-04T02:47:38.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:47:38.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:47:38.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:47:38.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:47:38.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:47:38.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:47:38.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:47:12, diff=26.126376s, valid=True
2026-06-04T02:47:38.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:47:38.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:47:38.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:47:38.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108255.127042s, valid=True
2026-06-04T02:47:38.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:47:38.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:47:38.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:47:38.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:47:38.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:47:38.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:47:38.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:47:38.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:47:38.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:47:38.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:47:38.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:47:38.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:47:38.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:47:38.532 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:47:38.747 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:47:39.081 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:47:39.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:47:39.182 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:47:39.182 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:47:39.447 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:47:39.447 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:48:09.477 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:48:09.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:48:09.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:48:10.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:48:10.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:48:10.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:48:10.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:48:10.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:48:10.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:48:10.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:48:10.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:48:10.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:48:10.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:48:12.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:48:12.669 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:48:12.670 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:48:12.670 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:48:12.681 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:48:12.693 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:48:12.694 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:48:12.694 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:48:12.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:48:12.695 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:48:12.695 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:48:12.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:48:12.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:48:12.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:48:12.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:48:12.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:48:12.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:48:12.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:48:13.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:48:13.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:48:13.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:48:13.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:48:13.032 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:48:13.105 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:47:52
2026-06-04T02:48:13.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87727, datetime.datetime(2026, 6, 4, 2, 47, 52), datetime.datetime(2026, 6, 4, 2, 47, 51), 'salt', 1.87, 100.54, None, 47.81, 125.45, -0.07, 820.86, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:48:13.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:48:13.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:48:13.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:47:51, diff=22.11202s, valid=True
2026-06-04T02:48:13.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:48:13.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:48:13.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:48:12, diff=1.11507s, valid=True
2026-06-04T02:48:13.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:48:13.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:48:13.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:47:48, diff=25.123745s, valid=True
2026-06-04T02:48:13.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:48:13.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:48:13.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:48:13.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:48:13.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:48:13.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:48:13.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:48:12, diff=1.127083s, valid=True
2026-06-04T02:48:13.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:48:13.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:48:13.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:48:13.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108290.127894s, valid=True
2026-06-04T02:48:13.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:48:13.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:48:13.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:48:13.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:48:13.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:48:13.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:48:13.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:48:13.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:48:13.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:48:13.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:48:13.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:48:13.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:48:13.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:48:13.456 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:48:13.651 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:48:13.984 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:48:14.084 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:48:14.085 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:48:14.085 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:48:14.347 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:48:14.347 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:48:44.370 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:48:44.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:48:44.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:48:44.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:48:44.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:48:44.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:48:44.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:48:44.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:48:44.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:48:44.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:48:44.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:48:44.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:48:44.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:48:47.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:48:47.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:48:47.202 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:48:47.202 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:48:47.212 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:48:47.224 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:48:47.224 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:48:47.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:48:47.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:48:47.226 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:48:47.226 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:48:47.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:48:47.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T02:48:47.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:48:47.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T02:48:47.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:48:47.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:48:47.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:48:47.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:48:47.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:48:47.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:48:47.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:48:47.580 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:48:47.654 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:48:22
2026-06-04T02:48:47.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87728, datetime.datetime(2026, 6, 4, 2, 48, 22), datetime.datetime(2026, 6, 4, 2, 48, 21), 'salt', 1.73, 100.41, None, 42.45, 122.09, -0.06, 820.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:48:47.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:48:47.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T02:48:47.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:48:21, diff=26.661386s, valid=True
2026-06-04T02:48:47.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:48:47.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:48:47.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:48:12, diff=35.664893s, valid=True
2026-06-04T02:48:47.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:48:47.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T02:48:47.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:48:18, diff=29.673106s, valid=True
2026-06-04T02:48:47.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:48:47.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:48:47.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:48:47.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:48:47.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:48:47.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:48:47.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:48:12, diff=35.67685s, valid=True
2026-06-04T02:48:47.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:48:47.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:48:47.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:48:47.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108324.677672s, valid=True
2026-06-04T02:48:47.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:48:47.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:48:47.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:48:47.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:48:47.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:48:47.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:48:47.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:48:47.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:48:47.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:48:47.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:48:47.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:48:47.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:48:48.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:48:48.064 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:48:48.260 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:48:48.594 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:48:48.694 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:48:48.695 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:48:48.695 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:48:48.885 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:48:48.885 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:49:18.895 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:49:18.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:49:18.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:49:19.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:49:19.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:49:19.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:49:19.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:49:19.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:49:19.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:49:19.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:49:19.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:49:19.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:49:19.483 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:49:21.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:49:21.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:49:21.930 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:49:21.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:49:21.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:49:21.960 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:49:21.960 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:49:21.961 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:49:21.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:49:21.962 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:49:21.962 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:49:21.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:49:22.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T02:49:22.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:49:22.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T02:49:22.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:49:22.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:49:22.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:49:22.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:49:22.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:49:22.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:49:22.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:49:22.299 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:49:22.373 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:48:52
2026-06-04T02:49:22.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87729, datetime.datetime(2026, 6, 4, 2, 48, 52), datetime.datetime(2026, 6, 4, 2, 48, 51), 'salt', 1.83, 100.54, None, 49.85, 131.14, -0.08, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:49:22.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:49:22.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T02:49:22.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:48:51, diff=31.380412s, valid=True
2026-06-04T02:49:22.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:49:22.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:49:22.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:49:12, diff=10.383837s, valid=True
2026-06-04T02:49:22.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:49:22.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T02:49:22.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:48:48, diff=34.391928s, valid=True
2026-06-04T02:49:22.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:49:22.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:49:22.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:49:22.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:49:22.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:49:22.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:49:22.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:49:12, diff=10.395655s, valid=True
2026-06-04T02:49:22.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:49:22.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:49:22.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:49:22.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108359.396452s, valid=True
2026-06-04T02:49:22.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:49:22.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:49:22.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:49:22.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:49:22.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:49:22.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:49:22.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:49:22.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:49:22.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:49:22.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:49:22.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:49:22.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:49:22.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:49:22.714 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:49:22.909 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:49:23.241 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:49:23.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:49:23.342 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:49:23.343 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:49:23.499 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:49:23.499 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:49:53.520 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:49:53.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:49:53.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:49:53.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:49:53.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:49:53.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:49:53.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:49:53.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:49:53.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:49:53.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:49:53.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:49:54.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:49:54.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:49:56.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:49:56.450 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:49:56.451 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:49:56.451 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:49:56.461 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:49:56.473 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:49:56.474 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:49:56.474 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:49:56.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:49:56.475 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:49:56.475 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:49:56.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:49:56.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:49:56.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:49:56.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:49:56.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:49:56.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:49:56.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:49:56.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:49:56.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:49:56.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:49:56.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:49:56.811 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:49:56.882 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:49:53
2026-06-04T02:49:56.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87731, datetime.datetime(2026, 6, 4, 2, 49, 53), datetime.datetime(2026, 6, 4, 2, 49, 52), 'salt', 1.77, 100.58, None, 42.27, 126.77, -0.08, 821.11, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:49:56.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:49:56.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:49:56.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:49:52, diff=4.889628s, valid=True
2026-06-04T02:49:56.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:49:56.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:49:56.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:50:12, diff=-15.106889s, valid=True
2026-06-04T02:49:56.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:49:56.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:49:56.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:49:49, diff=7.901178s, valid=True
2026-06-04T02:49:56.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:49:56.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:49:56.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:49:56.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:49:56.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:49:56.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:49:56.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:50:12, diff=-15.095074s, valid=True
2026-06-04T02:49:56.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:49:56.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:49:56.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:49:56.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108393.905733s, valid=True
2026-06-04T02:49:56.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:49:56.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:49:56.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:49:56.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:49:56.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:49:56.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:49:56.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:49:56.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:49:56.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:49:57.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:49:57.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:49:57.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:49:57.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:49:57.224 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:49:57.440 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:49:57.773 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:49:57.874 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:49:57.874 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:49:57.874 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:49:58.096 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:49:58.097 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:50:28.126 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:50:28.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:50:28.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:50:28.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:50:28.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:50:28.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:50:28.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:50:28.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:50:28.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:50:28.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:50:28.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:50:28.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:50:28.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:50:31.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:50:31.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:50:31.408 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:50:31.408 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:50:31.418 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:50:31.431 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:50:31.432 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:50:31.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:50:31.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:50:31.433 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:50:31.433 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:50:31.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:50:31.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:50:31.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:50:31.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:50:31.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:50:31.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:50:31.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:50:31.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:50:31.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:50:31.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:50:31.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:50:31.766 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:50:31.839 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:50:23
2026-06-04T02:50:31.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87732, datetime.datetime(2026, 6, 4, 2, 50, 23), datetime.datetime(2026, 6, 4, 2, 50, 22), 'salt', 1.73, 100.54, None, 48.83, 120.12, -0.08, 821.17, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:50:31.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:50:31.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:50:31.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:50:22, diff=9.846089s, valid=True
2026-06-04T02:50:31.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:50:31.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:50:31.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:50:12, diff=19.849462s, valid=True
2026-06-04T02:50:31.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:50:31.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:50:31.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:50:19, diff=12.857407s, valid=True
2026-06-04T02:50:31.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:50:31.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:50:31.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:50:31.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:50:31.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:50:31.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:50:31.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:50:12, diff=19.861182s, valid=True
2026-06-04T02:50:31.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:50:31.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:50:31.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:50:31.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108428.861992s, valid=True
2026-06-04T02:50:31.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:50:31.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:50:31.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:50:31.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:50:31.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:50:31.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:50:31.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:50:31.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:50:31.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:50:32.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:50:32.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:50:32.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:50:32.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:50:32.187 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:50:32.396 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:50:32.799 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:50:32.905 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:50:32.905 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:50:32.905 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:50:33.160 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:50:33.160 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:51:03.190 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:51:03.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:51:03.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:51:03.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:51:03.792 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:51:04.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:51:04.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:51:04.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:51:04.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:51:04.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:51:04.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:51:04.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:51:04.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:51:06.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:51:06.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:51:06.650 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:51:06.651 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:51:06.661 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:51:06.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:51:06.674 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:51:06.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:51:06.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:51:06.675 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:51:06.675 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:51:06.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:51:06.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:51:06.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:51:06.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:51:06.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:51:06.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:51:06.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:51:06.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:51:06.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:51:06.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:51:06.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:51:06.969 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:51:07.038 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:50:53
2026-06-04T02:51:07.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87733, datetime.datetime(2026, 6, 4, 2, 50, 53), datetime.datetime(2026, 6, 4, 2, 50, 52), 'salt', 1.83, 100.61, None, 48.8, 125.54, -0.09, 820.93, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:51:07.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:51:07.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:51:07.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:50:52, diff=15.045728s, valid=True
2026-06-04T02:51:07.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:51:07.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:51:07.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:51:12, diff=-4.951021s, valid=True
2026-06-04T02:51:07.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:51:07.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:51:07.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:50:49, diff=18.056535s, valid=True
2026-06-04T02:51:07.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:51:07.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:51:07.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:51:07.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:51:07.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:51:07.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:51:07.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:51:12, diff=-4.93998s, valid=True
2026-06-04T02:51:07.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:51:07.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:51:07.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:51:07.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108464.060795s, valid=True
2026-06-04T02:51:07.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:51:07.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:51:07.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:51:07.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:51:07.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:51:07.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:51:07.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:51:07.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:51:07.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:51:07.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:51:07.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:51:07.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:51:07.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:51:07.379 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:51:07.582 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:51:07.920 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:51:08.022 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:51:08.022 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:51:08.022 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:51:08.207 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:51:08.253 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:51:38.283 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:51:38.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:51:38.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:51:38.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:51:38.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:51:38.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:51:38.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:51:39.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:51:39.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:51:39.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:51:39.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:51:39.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:51:39.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:51:41.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:51:41.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:51:41.472 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:51:41.472 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:51:41.482 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:51:41.495 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:51:41.496 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:51:41.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:51:41.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:51:41.497 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:51:41.497 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:51:41.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:51:41.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:51:41.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:51:41.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:51:41.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:51:41.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:51:41.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:51:41.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:51:41.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:51:41.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:51:41.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:51:41.842 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:51:41.913 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:51:23
2026-06-04T02:51:41.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87734, datetime.datetime(2026, 6, 4, 2, 51, 23), datetime.datetime(2026, 6, 4, 2, 51, 23), 'salt', 1.73, 100.44, None, 49.96, 121.74, -0.07, 820.99, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:51:41.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:51:41.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:51:41.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:51:23, diff=18.920751s, valid=True
2026-06-04T02:51:41.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:51:41.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:51:41.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:51:12, diff=29.924238s, valid=True
2026-06-04T02:51:41.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:51:41.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:51:41.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:51:19, diff=22.932561s, valid=True
2026-06-04T02:51:41.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:51:41.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:51:41.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:51:41.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:51:41.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:51:41.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:51:41.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:51:12, diff=29.936306s, valid=True
2026-06-04T02:51:41.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:51:41.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:51:41.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:51:41.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108498.937122s, valid=True
2026-06-04T02:51:41.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:51:41.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:51:41.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:51:41.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:51:41.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:51:42.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:51:42.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:51:42.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:51:42.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:51:42.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:51:42.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:51:42.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:51:42.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:51:42.256 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:51:42.458 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:51:42.867 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:51:42.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:51:42.970 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:51:42.970 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:51:43.161 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:51:43.162 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:52:13.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:52:13.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:52:13.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:52:13.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:52:13.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:52:13.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:52:13.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:52:13.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:52:13.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:52:13.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:52:13.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:52:13.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:52:13.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:52:16.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:52:16.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:52:16.703 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:52:16.703 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:52:16.714 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:52:16.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:52:16.727 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:52:16.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:52:16.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:52:16.728 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:52:16.728 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:52:16.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:52:16.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:52:16.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:52:16.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:52:16.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:52:17.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:52:17.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:52:17.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:52:17.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:52:17.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:52:17.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:52:17.056 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:52:17.126 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:51:54
2026-06-04T02:52:17.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87735, datetime.datetime(2026, 6, 4, 2, 51, 54), datetime.datetime(2026, 6, 4, 2, 51, 53), 'salt', 1.8, 100.58, None, 43.26, 124.7, -0.08, 821.05, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:52:17.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:52:17.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:52:17.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:51:53, diff=24.132451s, valid=True
2026-06-04T02:52:17.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:52:17.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:52:17.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:52:12, diff=5.135359s, valid=True
2026-06-04T02:52:17.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:52:17.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:52:17.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:51:50, diff=27.142196s, valid=True
2026-06-04T02:52:17.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:52:17.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:52:17.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:52:17.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:52:17.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:52:17.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:52:17.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:52:12, diff=5.145399s, valid=True
2026-06-04T02:52:17.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:52:17.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:52:17.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:52:17.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108534.146126s, valid=True
2026-06-04T02:52:17.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:52:17.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:52:17.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:52:17.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:52:17.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:52:17.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:52:17.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:52:17.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:52:17.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:52:17.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:52:17.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:52:17.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:52:17.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:52:17.585 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:52:17.789 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:52:18.131 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:52:18.233 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:52:18.233 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:52:18.233 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:52:18.444 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:52:18.444 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:52:48.458 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:52:48.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:52:48.458 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:52:48.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:52:48.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:52:49.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:52:49.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:52:49.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:52:49.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:52:49.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:52:49.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:52:49.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:52:49.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:52:51.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:52:52.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:52:52.724 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:52:52.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:52:52.734 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:52:52.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:52:52.753 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:52:52.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:52:52.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:52:52.754 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:52:52.755 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:52:52.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:52:52.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T02:52:52.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:52:52.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T02:52:52.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:52:53.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T02:52:53.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:52:53.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T02:52:53.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:52:53.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:52:53.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:52:53.085 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:52:53.159 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:52:24
2026-06-04T02:52:53.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87736, datetime.datetime(2026, 6, 4, 2, 52, 24), datetime.datetime(2026, 6, 4, 2, 52, 23), 'salt', 1.8, 100.54, None, 42.3, 129.84, -0.08, 821.23, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:52:53.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:52:53.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T02:52:53.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:52:23, diff=30.165707s, valid=True
2026-06-04T02:52:53.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:52:53.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T02:52:53.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:52:12, diff=41.168481s, valid=True
2026-06-04T02:52:53.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:52:53.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T02:52:53.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:52:20, diff=33.174894s, valid=True
2026-06-04T02:52:53.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:52:53.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:52:53.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:52:53.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:52:53.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:52:53.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T02:52:53.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:52:12, diff=41.177864s, valid=True
2026-06-04T02:52:53.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:52:53.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:52:53.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:52:53.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108570.178523s, valid=True
2026-06-04T02:52:53.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:52:53.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:52:53.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:52:53.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:52:53.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:52:53.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:52:53.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:52:53.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:52:53.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:52:53.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:52:53.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:52:53.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:52:53.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:52:53.562 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:52:53.768 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:52:54.105 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:52:54.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:52:54.206 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:52:54.206 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:52:55.909 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:52:55.909 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:53:25.922 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:53:25.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:53:25.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:53:26.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:53:26.081 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:53:26.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:53:26.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:53:26.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:53:26.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:53:26.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:53:26.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:53:26.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:53:26.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:53:28.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:53:28.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:53:28.778 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:53:28.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:53:28.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:53:28.803 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:53:28.804 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:53:28.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:53:28.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:53:28.805 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:53:28.805 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:53:28.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:53:28.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:53:28.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:53:29.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:53:29.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:53:29.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:53:29.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:53:29.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:53:29.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:53:29.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:53:29.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:53:29.140 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:53:29.211 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:53:25
2026-06-04T02:53:29.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87738, datetime.datetime(2026, 6, 4, 2, 53, 25), datetime.datetime(2026, 6, 4, 2, 53, 24), 'salt', 1.83, 100.54, None, 51.05, 126.41, -0.08, 820.93, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:53:29.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:53:29.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:53:29.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:53:24, diff=5.219357s, valid=True
2026-06-04T02:53:29.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:53:29.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:53:29.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:53:12, diff=17.22287s, valid=True
2026-06-04T02:53:29.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:53:29.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:53:29.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:53:20, diff=9.231001s, valid=True
2026-06-04T02:53:29.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:53:29.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:53:29.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:53:29.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:53:29.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:53:29.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:53:29.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:53:12, diff=17.234723s, valid=True
2026-06-04T02:53:29.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:53:29.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:53:29.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:53:29.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108606.235521s, valid=True
2026-06-04T02:53:29.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:53:29.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:53:29.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:53:29.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:53:29.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:53:29.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:53:29.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:53:29.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:53:29.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:53:29.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:53:29.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:53:29.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:53:29.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:53:29.554 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:53:29.757 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:53:30.141 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:53:30.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:53:30.243 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:53:30.243 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:53:30.394 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:53:30.395 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:54:00.421 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:54:00.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:54:00.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:54:00.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:54:00.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:54:00.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:54:00.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:54:00.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:54:00.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:54:00.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:54:00.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:54:00.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:54:00.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:54:03.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:54:03.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:54:03.696 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:54:03.696 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:54:03.707 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:54:03.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:54:03.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:54:03.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:54:03.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:54:03.722 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:54:03.722 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:54:03.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:54:03.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:54:03.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:54:03.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:54:03.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:54:04.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:54:04.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:54:04.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:54:04.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:54:04.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:54:04.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:54:04.054 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:54:04.126 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:53:55
2026-06-04T02:54:04.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87739, datetime.datetime(2026, 6, 4, 2, 53, 55), datetime.datetime(2026, 6, 4, 2, 53, 54), 'salt', 1.8, 100.48, None, 53.63, 130.83, -0.07, 820.99, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:54:04.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:54:04.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:54:04.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:53:54, diff=10.133537s, valid=True
2026-06-04T02:54:04.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:54:04.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:54:04.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:54:12, diff=-7.862893s, valid=True
2026-06-04T02:54:04.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:54:04.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:54:04.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:53:51, diff=13.145342s, valid=True
2026-06-04T02:54:04.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:54:04.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:54:04.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:54:04.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:54:04.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:54:04.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:54:04.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:54:12, diff=-7.850889s, valid=True
2026-06-04T02:54:04.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:54:04.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:54:04.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:54:04.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108641.150016s, valid=True
2026-06-04T02:54:04.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:54:04.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:54:04.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:54:04.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:54:04.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:54:04.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:54:04.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:54:04.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:54:04.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:54:04.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:54:04.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:54:04.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:54:04.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:54:04.543 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:54:04.762 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:54:05.103 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:54:05.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:54:05.206 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:54:05.206 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:54:05.392 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:54:05.392 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:54:35.423 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:54:35.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:54:35.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:54:35.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:54:35.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:54:35.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:54:35.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:54:35.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:54:35.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:54:35.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:54:35.993 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:54:35.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:54:35.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:54:38.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:54:38.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:54:38.389 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:54:38.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:54:38.398 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:54:38.417 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:54:38.420 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:54:38.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:54:38.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:54:38.425 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:54:38.426 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:54:38.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:54:38.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:54:38.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:54:38.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:54:38.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:54:38.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:54:38.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:54:38.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:54:38.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:54:38.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:54:38.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:54:38.786 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:54:38.855 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:54:25
2026-06-04T02:54:38.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87740, datetime.datetime(2026, 6, 4, 2, 54, 25), datetime.datetime(2026, 6, 4, 2, 54, 24), 'salt', 1.83, 100.58, None, 53.38, 125.62, -0.08, 820.74, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:54:38.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:54:38.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:54:38.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:54:24, diff=14.863853s, valid=True
2026-06-04T02:54:38.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:54:38.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:54:38.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:54:12, diff=26.866983s, valid=True
2026-06-04T02:54:38.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:54:38.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:54:38.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:54:21, diff=17.8748s, valid=True
2026-06-04T02:54:38.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:54:38.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:54:38.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:54:38.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:54:38.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:54:38.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:54:38.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:54:12, diff=26.879743s, valid=True
2026-06-04T02:54:38.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:54:38.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:54:38.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:54:38.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108675.880468s, valid=True
2026-06-04T02:54:38.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:54:38.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:54:38.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:54:38.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:54:38.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:54:38.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:54:38.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:54:38.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:54:38.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:54:39.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:54:39.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:54:39.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:54:39.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:54:39.209 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:54:39.412 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:54:39.752 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:54:39.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:54:39.859 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:54:39.860 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:54:40.010 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:54:40.010 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:55:10.040 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:55:10.040 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:55:10.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:55:10.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:55:10.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:55:10.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:55:10.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:55:10.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:55:10.387 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:55:10.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:55:10.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:55:10.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:55:10.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:55:12.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:55:12.843 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:55:12.844 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:55:12.844 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:55:12.854 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:55:12.867 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:55:12.867 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:55:12.868 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:55:12.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:55:12.869 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:55:12.869 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:55:12.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:55:13.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:55:13.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:55:13.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:55:13.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:55:13.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:55:13.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:55:13.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:55:13.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:55:13.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:55:13.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:55:13.205 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:55:13.275 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:54:55
2026-06-04T02:55:13.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87741, datetime.datetime(2026, 6, 4, 2, 54, 55), datetime.datetime(2026, 6, 4, 2, 54, 55), 'salt', 1.8, 100.48, None, 40.65, 122.56, -0.07, 820.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:55:13.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:55:13.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:55:13.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:54:55, diff=18.283082s, valid=True
2026-06-04T02:55:13.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:55:13.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:55:13.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:55:12, diff=1.286561s, valid=True
2026-06-04T02:55:13.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:55:13.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:55:13.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:54:51, diff=22.294734s, valid=True
2026-06-04T02:55:13.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:55:13.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:55:13.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:55:13.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:55:13.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:55:13.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:55:13.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:55:12, diff=1.298441s, valid=True
2026-06-04T02:55:13.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:55:13.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:55:13.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:55:13.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108710.29927s, valid=True
2026-06-04T02:55:13.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:55:13.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:55:13.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:55:13.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:55:13.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:55:13.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:55:13.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:55:13.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:55:13.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:55:13.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:55:13.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:55:13.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:55:13.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:55:13.688 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:55:13.893 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:55:14.237 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:55:14.340 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:55:14.340 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:55:14.341 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:55:14.568 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:55:14.568 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:55:44.598 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:55:44.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:55:44.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:55:44.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:55:44.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:55:44.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:55:44.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:55:45.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:55:45.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:55:45.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:55:45.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:55:45.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:55:45.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:55:47.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:55:47.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:55:47.495 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:55:47.495 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:55:47.504 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:55:47.517 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:55:47.517 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:55:47.518 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:55:47.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:55:47.518 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:55:47.518 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:55:47.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:55:47.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:55:47.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:55:47.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:55:47.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:55:47.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:55:47.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:55:47.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:55:47.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:55:47.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:55:47.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:55:47.858 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:55:47.931 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:55:27
2026-06-04T02:55:47.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87742, datetime.datetime(2026, 6, 4, 2, 55, 27), datetime.datetime(2026, 6, 4, 2, 55, 25), 'salt', 1.87, 100.61, None, 42.13, 126.08, -0.08, 820.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:55:47.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:55:47.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:55:47.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:55:25, diff=22.938473s, valid=True
2026-06-04T02:55:47.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:55:47.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:55:47.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:55:12, diff=35.942047s, valid=True
2026-06-04T02:55:47.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:55:47.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:55:47.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:55:21, diff=26.950288s, valid=True
2026-06-04T02:55:47.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:55:47.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:55:47.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:55:47.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:55:47.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:55:47.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:55:47.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:55:12, diff=35.954035s, valid=True
2026-06-04T02:55:47.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:55:47.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:55:47.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:55:47.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108744.954847s, valid=True
2026-06-04T02:55:47.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:55:47.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:55:47.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:55:47.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:55:47.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:55:48.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:55:48.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:55:48.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:55:48.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:55:48.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:55:48.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:55:48.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:55:48.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:55:48.277 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:55:48.482 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:55:48.824 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:55:48.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:55:48.926 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:55:48.926 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:55:49.145 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:55:49.145 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:56:19.175 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:56:19.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:56:19.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:56:19.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:56:19.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:56:19.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:56:19.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:56:19.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:56:19.806 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:56:19.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:56:19.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:56:19.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:56:19.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:56:22.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:56:22.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:56:22.242 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:56:22.243 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:56:22.255 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:56:22.267 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:56:22.268 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:56:22.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:56:22.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:56:22.269 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:56:22.269 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:56:22.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:56:22.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T02:56:22.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:56:22.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T02:56:22.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:56:22.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:56:22.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:56:22.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:56:22.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:56:22.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:56:22.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:56:22.599 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:56:22.669 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:55:57
2026-06-04T02:56:22.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87743, datetime.datetime(2026, 6, 4, 2, 55, 57), datetime.datetime(2026, 6, 4, 2, 55, 56), 'salt', 1.83, 100.64, None, 48.87, 126.84, -0.09, 821.11, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:56:22.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:56:22.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T02:56:22.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:55:56, diff=26.677149s, valid=True
2026-06-04T02:56:22.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:56:22.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:56:22.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:56:12, diff=10.680652s, valid=True
2026-06-04T02:56:22.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:56:22.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T02:56:22.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:55:51, diff=31.688689s, valid=True
2026-06-04T02:56:22.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:56:22.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:56:22.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:56:22.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:56:22.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:56:22.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:56:22.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:56:12, diff=10.692418s, valid=True
2026-06-04T02:56:22.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:56:22.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:56:22.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:56:22.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108779.693236s, valid=True
2026-06-04T02:56:22.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:56:22.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:56:22.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:56:22.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:56:22.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:56:22.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:56:22.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:56:22.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:56:22.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:56:22.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:56:22.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:56:22.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:56:22.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:56:23.015 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:56:23.220 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:56:23.563 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:56:23.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:56:23.666 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:56:23.666 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:56:23.818 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:56:23.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:56:53.828 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:56:53.828 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:56:53.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:56:54.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:56:54.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:56:54.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:56:54.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:56:54.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:56:54.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:56:54.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:56:54.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:56:54.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:56:54.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:56:56.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:56:56.962 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:56:56.963 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:56:56.963 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:56:56.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:56:56.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:56:56.987 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:56:56.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:56:56.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:56:56.988 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:56:56.989 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:56:56.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:56:57.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T02:56:57.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:56:57.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T02:56:57.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:56:57.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T02:56:57.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:56:57.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T02:56:57.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:56:57.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:56:57.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:56:57.339 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:56:57.410 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:56:27
2026-06-04T02:56:57.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87744, datetime.datetime(2026, 6, 4, 2, 56, 27), datetime.datetime(2026, 6, 4, 2, 56, 26), 'salt', 1.93, 100.64, None, 47.88, 143.19, -0.09, 820.99, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:56:57.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:56:57.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T02:56:57.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:56:26, diff=31.417638s, valid=True
2026-06-04T02:56:57.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:56:57.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T02:56:57.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:56:12, diff=45.421132s, valid=True
2026-06-04T02:56:57.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:56:57.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T02:56:57.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:56:22, diff=35.42932s, valid=True
2026-06-04T02:56:57.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:56:57.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:56:57.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:56:57.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:56:57.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:56:57.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T02:56:57.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:56:12, diff=45.433035s, valid=True
2026-06-04T02:56:57.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:56:57.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:56:57.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:56:57.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108814.433856s, valid=True
2026-06-04T02:56:57.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:56:57.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:56:57.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:56:57.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:56:57.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:56:57.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:56:57.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:56:57.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:56:57.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:56:57.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:56:57.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:56:57.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:56:57.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:56:57.755 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:56:57.959 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:56:58.363 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:56:58.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:56:58.465 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:56:58.465 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:56:58.549 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:56:58.550 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:57:28.580 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:57:28.580 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:57:28.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:57:28.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:57:28.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:57:28.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:57:28.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:57:28.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:57:28.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:57:29.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:57:29.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:57:29.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:57:29.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:57:31.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:57:31.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:57:31.496 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:57:31.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:57:31.507 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:57:31.520 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:57:31.520 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:57:31.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:57:31.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:57:31.522 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:57:31.522 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:57:31.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:57:31.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:57:31.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:57:31.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:57:31.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:57:31.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:57:31.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:57:31.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:57:31.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:57:31.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:57:31.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:57:31.875 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:57:31.953 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:57:27
2026-06-04T02:57:31.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87746, datetime.datetime(2026, 6, 4, 2, 57, 27), datetime.datetime(2026, 6, 4, 2, 57, 27), 'salt', 1.87, 100.54, None, 41.32, 118.9, -0.07, 820.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:57:31.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:57:31.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:57:31.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:57:27, diff=4.961446s, valid=True
2026-06-04T02:57:31.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:57:31.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:57:31.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:57:12, diff=19.965106s, valid=True
2026-06-04T02:57:31.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:57:31.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:57:31.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:57:23, diff=8.973652s, valid=True
2026-06-04T02:57:31.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:57:31.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:57:31.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:57:31.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:57:31.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:57:31.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:57:31.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:57:12, diff=19.977511s, valid=True
2026-06-04T02:57:31.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:57:31.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:57:31.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:57:31.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108848.978356s, valid=True
2026-06-04T02:57:31.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:57:31.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:57:31.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:57:31.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:57:31.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:57:32.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:57:32.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:57:32.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:57:32.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:57:32.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:57:32.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:57:32.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:57:32.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:57:32.301 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:57:32.504 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:57:32.865 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:57:32.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:57:32.968 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:57:32.968 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:57:33.055 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:57:33.055 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:58:03.081 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:58:03.081 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:58:03.081 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:58:03.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:58:03.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:58:03.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:58:03.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:58:03.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:58:03.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:58:03.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:58:03.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:58:03.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:58:03.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:58:06.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:58:06.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:58:06.234 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:58:06.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:58:06.246 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:58:06.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:58:06.260 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:58:06.261 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:58:06.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:58:06.261 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:58:06.262 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:58:06.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:58:06.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:58:06.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:58:06.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:58:06.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:58:06.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:58:06.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:58:06.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:58:06.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:58:06.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:58:06.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:58:06.608 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:58:06.680 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:57:58
2026-06-04T02:58:06.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87747, datetime.datetime(2026, 6, 4, 2, 57, 58), datetime.datetime(2026, 6, 4, 2, 57, 57), 'salt', 1.83, 100.61, None, 44.56, 123.01, -0.09, 820.86, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:58:06.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:58:06.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:58:06.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:57:57, diff=9.688374s, valid=True
2026-06-04T02:58:06.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:58:06.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:58:06.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:58:12, diff=-5.308125s, valid=True
2026-06-04T02:58:06.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:58:06.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:58:06.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:57:53, diff=13.700024s, valid=True
2026-06-04T02:58:06.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:58:06.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:58:06.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:58:06.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:58:06.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:58:06.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:58:06.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:58:12, diff=-5.29622s, valid=True
2026-06-04T02:58:06.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:58:06.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:58:06.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:58:06.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108883.704593s, valid=True
2026-06-04T02:58:06.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:58:06.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:58:06.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:58:06.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:58:06.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:58:06.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:58:06.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:58:06.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:58:06.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:58:06.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:58:06.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:58:06.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:58:06.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:58:07.025 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:58:07.303 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:58:07.642 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:58:07.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:58:07.744 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:58:07.744 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:58:07.999 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:58:07.999 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:58:38.030 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:58:38.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:58:38.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:58:38.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:58:38.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:58:38.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:58:38.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:58:38.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:58:38.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:58:38.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:58:38.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:58:38.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:58:38.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:58:41.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:58:41.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:58:41.032 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:58:41.032 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:58:41.043 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:58:41.055 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:58:41.056 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:58:41.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:58:41.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:58:41.057 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:58:41.057 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:58:41.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:58:41.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:58:41.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:58:41.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:58:41.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:58:41.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:58:41.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:58:41.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:58:41.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:58:41.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:58:41.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:58:41.413 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:58:41.487 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:58:28
2026-06-04T02:58:41.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87748, datetime.datetime(2026, 6, 4, 2, 58, 28), datetime.datetime(2026, 6, 4, 2, 58, 27), 'salt', 1.87, 100.51, None, 43.89, 131.3, -0.07, 820.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T02:58:41.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:58:41.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:58:41.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:58:27, diff=14.495602s, valid=True
2026-06-04T02:58:41.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:58:41.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:58:41.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:58:12, diff=29.49919s, valid=True
2026-06-04T02:58:41.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:58:41.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:58:41.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:58:23, diff=18.507334s, valid=True
2026-06-04T02:58:41.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:58:41.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:58:41.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:58:41.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:58:41.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:58:41.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:58:41.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:58:12, diff=29.511098s, valid=True
2026-06-04T02:58:41.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:58:41.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:58:41.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:58:41.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108918.511922s, valid=True
2026-06-04T02:58:41.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:58:41.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:58:41.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:58:41.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:58:41.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:58:41.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:58:41.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:58:41.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:58:41.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:58:41.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:58:41.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:58:41.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:58:41.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:58:41.834 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:58:42.037 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:58:42.375 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:58:42.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:58:42.477 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:58:42.477 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:58:42.561 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:58:42.562 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:59:12.576 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:59:12.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:59:12.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:59:13.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:59:13.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:59:13.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:59:13.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:59:13.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:59:13.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:59:13.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:59:13.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:59:13.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:59:13.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:59:15.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:59:15.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:59:15.712 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:59:15.713 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:59:15.722 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:59:15.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:59:15.735 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:59:15.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:59:15.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:59:15.736 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:59:15.737 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:59:15.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:59:15.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:59:15.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:59:15.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:59:15.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:59:16.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:59:16.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:59:16.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:59:16.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:59:16.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:59:16.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:59:16.075 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:59:16.156 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:58:58
2026-06-04T02:59:16.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87749, datetime.datetime(2026, 6, 4, 2, 58, 58), datetime.datetime(2026, 6, 4, 2, 58, 57), 'salt', 1.83, 100.64, None, 54.05, 129.33, -0.09, 821.05, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:59:16.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:59:16.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:59:16.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:58:57, diff=19.163397s, valid=True
2026-06-04T02:59:16.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:59:16.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:59:16.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:59:12, diff=4.166934s, valid=True
2026-06-04T02:59:16.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:59:16.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:59:16.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:58:53, diff=23.175203s, valid=True
2026-06-04T02:59:16.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:59:16.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:59:16.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:59:16.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:59:16.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:59:16.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:59:16.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:59:12, diff=4.179067s, valid=True
2026-06-04T02:59:16.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:59:16.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:59:16.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:59:16.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108953.179909s, valid=True
2026-06-04T02:59:16.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:59:16.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:59:16.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:59:16.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:59:16.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:59:16.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:59:16.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:59:16.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:59:16.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:59:16.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:59:16.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:59:16.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:59:16.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:59:16.572 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:59:16.774 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:59:17.116 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:59:17.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:59:17.217 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:59:17.217 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:59:18.671 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:59:18.671 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T02:59:48.701 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T02:59:48.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T02:59:48.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T02:59:49.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T02:59:49.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T02:59:49.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T02:59:49.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T02:59:49.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T02:59:49.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T02:59:49.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T02:59:49.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T02:59:49.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T02:59:49.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T02:59:51.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T02:59:51.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T02:59:51.680 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T02:59:51.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T02:59:51.689 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T02:59:51.703 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T02:59:51.703 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T02:59:51.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T02:59:51.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T02:59:51.704 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T02:59:51.705 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T02:59:51.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T02:59:51.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T02:59:51.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T02:59:51.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T02:59:51.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:59:52.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:59:52.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T02:59:52.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T02:59:52.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T02:59:52.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T02:59:52.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T02:59:52.054 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T02:59:52.132 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:59:28
2026-06-04T02:59:52.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87750, datetime.datetime(2026, 6, 4, 2, 59, 28), datetime.datetime(2026, 6, 4, 2, 59, 28), 'salt', 1.77, 100.58, None, 46.93, 135.9, -0.08, 821.11, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T02:59:52.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T02:59:52.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T02:59:52.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:59:28, diff=24.138576s, valid=True
2026-06-04T02:59:52.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T02:59:52.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:59:52.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:59:12, diff=40.141456s, valid=True
2026-06-04T02:59:52.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T02:59:52.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T02:59:52.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:59:23, diff=29.148156s, valid=True
2026-06-04T02:59:52.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T02:59:52.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:59:52.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T02:59:52.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T02:59:52.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T02:59:52.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T02:59:52.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:59:12, diff=40.151229s, valid=True
2026-06-04T02:59:52.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T02:59:52.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T02:59:52.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T02:59:52.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=108989.151898s, valid=True
2026-06-04T02:59:52.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T02:59:52.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T02:59:52.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T02:59:52.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T02:59:52.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T02:59:52.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T02:59:52.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T02:59:52.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T02:59:52.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T02:59:52.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T02:59:52.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T02:59:52.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T02:59:52.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T02:59:52.469 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T02:59:52.673 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:59:53.014 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T02:59:53.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T02:59:53.116 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T02:59:53.116 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T02:59:53.275 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T02:59:53.275 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:00:23.305 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:00:23.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:00:23.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:00:23.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:00:23.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:00:23.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:00:23.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:00:23.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:00:23.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:00:23.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:00:23.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:00:23.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:00:23.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:00:26.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:00:26.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:00:26.360 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:00:26.360 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:00:26.371 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:00:26.383 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:00:26.384 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:00:26.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:00:26.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:00:26.385 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:00:26.385 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:00:26.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:00:26.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T03:00:26.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:00:26.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T03:00:26.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:00:26.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T03:00:26.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:00:26.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T03:00:26.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:00:26.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:00:26.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:00:26.728 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:00:26.801 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 02:59:59
2026-06-04T03:00:26.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87751, datetime.datetime(2026, 6, 4, 2, 59, 59), datetime.datetime(2026, 6, 4, 2, 59, 58), 'salt', 1.77, 100.61, None, 38.28, 127.64, -0.08, 820.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T03:00:26.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:00:26.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T03:00:26.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:59:58, diff=28.809008s, valid=True
2026-06-04T03:00:26.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:00:26.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T03:00:26.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:00:12, diff=14.812507s, valid=True
2026-06-04T03:00:26.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:00:26.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T03:00:26.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 02:59:54, diff=32.820669s, valid=True
2026-06-04T03:00:26.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:00:26.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:00:26.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:00:26.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:00:26.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:00:26.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T03:00:26.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:00:12, diff=14.824426s, valid=True
2026-06-04T03:00:26.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:00:26.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:00:26.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:00:26.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109023.825251s, valid=True
2026-06-04T03:00:26.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:00:26.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:00:26.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:00:26.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:00:26.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:00:26.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:00:26.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:00:26.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:00:26.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:00:26.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:00:27.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:00:27.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:00:27.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:00:27.217 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:00:27.420 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:00:27.766 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:00:27.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:00:27.873 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:00:27.873 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:00:28.290 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:00:28.291 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:00:58.300 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:00:58.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:00:58.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:00:58.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:00:58.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:00:58.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:00:58.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:00:58.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:00:58.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:00:58.719 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:00:58.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:00:58.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:00:58.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:01:01.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:01:01.402 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:01:01.403 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:01:01.404 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:01:01.414 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:01:01.427 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:01:01.428 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:01:01.428 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:01:01.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:01:01.429 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:01:01.429 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:01:01.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:01:01.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:01:01.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:01:01.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:01:01.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:01:01.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T03:01:01.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:01:01.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T03:01:01.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:01:01.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:01:01.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:01:01.797 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:01:01.869 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:00:59
2026-06-04T03:01:01.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87753, datetime.datetime(2026, 6, 4, 3, 0, 59), datetime.datetime(2026, 6, 4, 3, 0, 58), 'salt', 1.87, 100.54, None, 43.05, 121.01, -0.07, 820.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T03:01:01.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:01:01.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:01:01.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:00:58, diff=3.875836s, valid=True
2026-06-04T03:01:01.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:01:01.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T03:01:01.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:01:12, diff=-10.12109s, valid=True
2026-06-04T03:01:01.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:01:01.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:01:01.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:00:54, diff=7.886065s, valid=True
2026-06-04T03:01:01.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:01:01.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:01:01.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:01:01.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:01:01.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:01:01.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T03:01:01.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:01:12, diff=-10.110638s, valid=True
2026-06-04T03:01:01.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:01:01.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:01:01.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:01:01.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109058.890076s, valid=True
2026-06-04T03:01:01.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:01:01.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:01:01.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:01:01.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:01:01.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:01:01.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:01:01.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:01:01.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:01:01.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:01:02.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:01:02.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:01:02.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:01:02.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:01:02.208 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:01:02.423 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:01:02.785 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:01:02.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:01:02.894 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:01:02.894 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:01:03.976 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:01:03.976 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:01:34.003 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:01:34.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:01:34.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:01:34.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:01:34.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:01:34.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:01:34.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:01:34.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:01:34.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:01:34.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:01:34.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:01:34.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:01:34.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:01:36.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:01:36.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:01:36.884 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:01:36.884 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:01:36.893 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:01:36.905 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:01:36.906 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:01:36.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:01:36.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:01:36.907 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:01:36.907 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:01:36.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:01:37.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:01:37.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:01:37.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:01:37.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:01:37.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T03:01:37.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:01:37.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T03:01:37.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:01:37.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:01:37.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:01:37.318 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:01:37.393 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:01:29
2026-06-04T03:01:37.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87754, datetime.datetime(2026, 6, 4, 3, 1, 29), datetime.datetime(2026, 6, 4, 3, 1, 29), 'salt', 1.83, 100.54, None, 42.37, 128.97, -0.08, 820.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T03:01:37.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:01:37.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:01:37.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:01:29, diff=8.398996s, valid=True
2026-06-04T03:01:37.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:01:37.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T03:01:37.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:01:12, diff=25.401858s, valid=True
2026-06-04T03:01:37.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:01:37.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:01:37.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:01:25, diff=12.408459s, valid=True
2026-06-04T03:01:37.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:01:37.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:01:37.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:01:37.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:01:37.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:01:37.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T03:01:37.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:01:12, diff=25.411511s, valid=True
2026-06-04T03:01:37.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:01:37.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:01:37.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:01:37.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109094.412157s, valid=True
2026-06-04T03:01:37.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:01:37.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:01:37.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:01:37.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:01:37.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:01:37.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:01:37.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:01:37.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:01:37.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:01:37.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:01:37.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:01:37.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:01:37.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:01:37.723 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:01:37.930 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:01:38.277 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:01:38.379 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:01:38.379 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:01:38.379 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:01:38.637 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:01:38.638 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:02:08.652 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:02:08.652 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:02:08.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:02:09.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:02:09.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:02:09.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:02:09.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:02:09.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:02:09.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:02:09.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:02:09.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:02:09.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:02:09.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:02:12.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:02:12.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:02:12.689 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:02:12.689 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:02:12.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:02:12.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:02:12.713 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:02:12.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:02:12.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:02:12.714 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:02:12.714 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:02:12.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:02:12.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:02:12.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:02:12.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:02:12.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:02:13.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T03:02:13.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:02:13.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T03:02:13.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:02:13.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:02:13.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:02:13.055 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:02:13.129 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:02:00
2026-06-04T03:02:13.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87755, datetime.datetime(2026, 6, 4, 3, 2), datetime.datetime(2026, 6, 4, 3, 1, 59), 'salt', 1.83, 100.58, None, 44.95, 119.93, -0.08, 820.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T03:02:13.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:02:13.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:02:13.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:01:59, diff=14.136343s, valid=True
2026-06-04T03:02:13.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:02:13.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T03:02:13.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:02:12, diff=1.139508s, valid=True
2026-06-04T03:02:13.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:02:13.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:02:13.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:01:55, diff=18.146592s, valid=True
2026-06-04T03:02:13.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:02:13.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:02:13.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:02:13.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:02:13.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:02:13.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T03:02:13.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:02:12, diff=1.149785s, valid=True
2026-06-04T03:02:13.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:02:13.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:02:13.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:02:13.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109130.150451s, valid=True
2026-06-04T03:02:13.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:02:13.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:02:13.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:02:13.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:02:13.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:02:13.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:02:13.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:02:13.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:02:13.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:02:13.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:02:13.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:02:13.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:02:13.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:02:13.471 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:02:13.674 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:02:14.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:02:14.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:02:14.114 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:02:14.114 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:02:14.308 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:02:14.308 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:02:44.330 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:02:44.330 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:02:44.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:02:44.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:02:44.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:02:44.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:02:44.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:02:44.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:02:44.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:02:44.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:02:44.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:02:44.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:02:44.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:02:47.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:02:47.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:02:47.342 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:02:47.343 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:02:47.352 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:02:47.365 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:02:47.365 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:02:47.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:02:47.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:02:47.367 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:02:47.367 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:02:47.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:02:47.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:02:47.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:02:47.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:02:47.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:02:47.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T03:02:47.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:02:47.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T03:02:47.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:02:47.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:02:47.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:02:47.729 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:02:47.800 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:02:30
2026-06-04T03:02:47.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87756, datetime.datetime(2026, 6, 4, 3, 2, 30), datetime.datetime(2026, 6, 4, 3, 2, 29), 'salt', 1.77, 100.54, None, 50.74, 122.8, -0.07, 820.86, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:02:47.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:02:47.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:02:47.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:02:29, diff=18.807767s, valid=True
2026-06-04T03:02:47.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:02:47.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T03:02:47.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:02:12, diff=35.8112s, valid=True
2026-06-04T03:02:47.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:02:47.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:02:47.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:02:25, diff=22.819167s, valid=True
2026-06-04T03:02:47.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:02:47.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:02:47.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:02:47.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:02:47.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:02:47.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T03:02:47.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:02:12, diff=35.822797s, valid=True
2026-06-04T03:02:47.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:02:47.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:02:47.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:02:47.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109164.823565s, valid=True
2026-06-04T03:02:47.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:02:47.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:02:47.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:02:47.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:02:47.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:02:47.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:02:47.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:02:47.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:02:47.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:02:47.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:02:48.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:02:48.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:02:48.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:02:48.143 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:02:48.347 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:02:48.690 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:02:48.792 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:02:48.792 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:02:48.792 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:02:49.033 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:02:49.033 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:03:19.045 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:03:19.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:03:19.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:03:19.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:03:19.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:03:19.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:03:19.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:03:19.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:03:19.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:03:19.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:03:19.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:03:19.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:03:19.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:03:22.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:03:22.631 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:03:22.632 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:03:22.633 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:03:22.643 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:03:22.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:03:22.656 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:03:22.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:03:22.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:03:22.657 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:03:22.657 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:03:22.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:03:22.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:03:22.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:03:22.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:03:22.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:03:22.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T03:03:22.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:03:22.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T03:03:22.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:03:22.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:03:22.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:03:22.998 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:03:23.084 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:03:00
2026-06-04T03:03:23.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87757, datetime.datetime(2026, 6, 4, 3, 3), datetime.datetime(2026, 6, 4, 3, 2, 59), 'salt', 1.87, 100.64, None, 41.25, 143.19, -0.09, 821.17, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T03:03:23.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:03:23.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:03:23.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:02:59, diff=24.091867s, valid=True
2026-06-04T03:03:23.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:03:23.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T03:03:23.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:03:12, diff=11.095379s, valid=True
2026-06-04T03:03:23.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:03:23.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:03:23.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:02:55, diff=28.10359s, valid=True
2026-06-04T03:03:23.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:03:23.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:03:23.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:03:23.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:03:23.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:03:23.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T03:03:23.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:03:12, diff=11.107333s, valid=True
2026-06-04T03:03:23.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:03:23.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:03:23.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:03:23.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109200.108152s, valid=True
2026-06-04T03:03:23.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:03:23.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:03:23.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:03:23.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:03:23.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:03:23.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:03:23.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:03:23.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:03:23.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:03:23.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:03:23.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:03:23.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:03:23.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:03:23.429 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:03:23.631 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:03:24.027 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:03:24.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:03:24.128 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:03:24.128 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:03:24.314 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:03:24.314 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:03:54.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:03:54.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:03:54.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:03:54.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:03:54.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:03:54.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:03:54.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:03:54.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:03:54.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:03:54.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:03:54.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:03:54.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:03:54.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:03:57.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:03:57.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:03:57.354 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:03:57.354 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:03:57.365 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:03:57.378 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:03:57.378 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:03:57.379 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:03:57.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:03:57.380 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:03:57.380 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:03:57.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:03:57.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T03:03:57.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:03:57.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T03:03:57.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:03:57.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:03:57.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:03:57.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:03:57.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:03:57.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:03:57.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:03:57.724 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:03:57.797 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:03:30
2026-06-04T03:03:57.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87758, datetime.datetime(2026, 6, 4, 3, 3, 30), datetime.datetime(2026, 6, 4, 3, 3, 30), 'salt', 1.83, 100.54, None, 54.58, 121.86, -0.08, 820.86, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:03:57.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:03:57.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T03:03:57.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:03:30, diff=27.804876s, valid=True
2026-06-04T03:03:57.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:03:57.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:03:57.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:03:12, diff=45.808402s, valid=True
2026-06-04T03:03:57.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:03:57.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T03:03:57.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:03:25, diff=32.816718s, valid=True
2026-06-04T03:03:57.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:03:57.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:03:57.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:03:57.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:03:57.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:03:57.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:03:57.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:03:12, diff=45.820454s, valid=True
2026-06-04T03:03:57.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:03:57.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:03:57.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:03:57.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109234.821308s, valid=True
2026-06-04T03:03:57.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:03:57.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:03:57.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:03:57.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:03:57.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:03:57.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:03:57.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:03:57.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:03:57.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:03:57.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:03:58.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:03:58.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:03:58.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:03:58.141 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:03:58.344 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:03:58.682 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:03:58.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:03:58.784 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:03:58.784 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:03:59.025 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:03:59.025 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:04:29.055 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:04:29.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:04:29.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:04:29.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:04:29.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:04:29.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:04:29.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:04:29.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:04:29.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:04:29.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:04:29.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:04:29.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:04:29.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:04:32.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:04:32.267 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:04:32.268 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:04:32.268 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:04:32.279 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:04:32.292 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:04:32.293 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:04:32.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:04:32.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:04:32.294 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:04:32.294 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:04:32.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:04:32.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:04:32.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:04:32.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:04:32.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:04:32.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T03:04:32.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:04:32.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T03:04:32.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:04:32.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:04:32.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:04:32.669 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:04:32.746 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:04:31
2026-06-04T03:04:32.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87760, datetime.datetime(2026, 6, 4, 3, 4, 31), datetime.datetime(2026, 6, 4, 3, 4, 30), 'salt', 1.73, 100.54, None, 45.3, 121.62, -0.08, 820.99, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:04:32.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:04:32.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:04:32.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:04:30, diff=2.753972s, valid=True
2026-06-04T03:04:32.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:04:32.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T03:04:32.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:04:12, diff=20.757492s, valid=True
2026-06-04T03:04:32.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:04:32.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:04:32.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:04:28, diff=4.770259s, valid=True
2026-06-04T03:04:32.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:04:32.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:04:32.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:04:32.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:04:32.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:04:32.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T03:04:32.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:04:12, diff=20.777795s, valid=True
2026-06-04T03:04:32.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:04:32.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:04:32.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:04:32.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109269.778632s, valid=True
2026-06-04T03:04:32.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:04:32.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:04:32.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:04:32.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:04:32.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:04:32.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:04:32.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:04:32.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:04:32.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:04:32.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:04:32.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:04:33.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:04:33.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:04:33.098 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:04:33.377 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:04:33.718 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:04:33.825 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:04:33.825 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:04:33.825 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:04:34.017 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:04:34.017 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:05:04.047 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:05:04.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:05:04.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:05:04.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:05:04.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:05:04.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:05:04.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:05:04.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:05:04.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:05:04.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:05:04.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:05:04.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:05:04.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:05:07.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:05:07.029 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:05:07.030 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:05:07.030 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:05:07.042 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:05:07.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:05:07.055 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:05:07.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:05:07.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:05:07.056 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:05:07.056 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:05:07.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:05:07.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:05:07.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:05:07.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:05:07.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:05:07.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T03:05:07.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:05:07.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T03:05:07.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:05:07.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:05:07.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:05:07.402 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:05:07.475 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:05:01
2026-06-04T03:05:07.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87761, datetime.datetime(2026, 6, 4, 3, 5, 1), datetime.datetime(2026, 6, 4, 3, 5), 'salt', 1.83, 100.61, None, 51.05, 121.93, -0.09, 820.8, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:05:07.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:05:07.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:05:07.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:05:00, diff=7.48294s, valid=True
2026-06-04T03:05:07.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:05:07.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T03:05:07.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:05:12, diff=-4.513586s, valid=True
2026-06-04T03:05:07.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:05:07.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:05:07.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:04:56, diff=11.494647s, valid=True
2026-06-04T03:05:07.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:05:07.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:05:07.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:05:07.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:05:07.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:05:07.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T03:05:07.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:05:12, diff=-4.501624s, valid=True
2026-06-04T03:05:07.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:05:07.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:05:07.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:05:07.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109304.499195s, valid=True
2026-06-04T03:05:07.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:05:07.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:05:07.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:05:07.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:05:07.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:05:07.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:05:07.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:05:07.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:05:07.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:05:07.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:05:07.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:05:07.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:05:07.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:05:07.819 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:05:08.023 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:05:08.367 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:05:08.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:05:08.470 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:05:08.470 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:05:08.722 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:05:08.722 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:05:38.752 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:05:38.753 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:05:38.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:05:38.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:05:38.940 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:05:39.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:05:39.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:05:39.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:05:39.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:05:39.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:05:39.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:05:39.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:05:39.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:05:41.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:05:41.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:05:41.685 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:05:41.685 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:05:41.695 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:05:41.708 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:05:41.709 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:05:41.709 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:05:41.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:05:41.710 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:05:41.710 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:05:41.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:05:41.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:05:41.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:05:41.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:05:41.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:05:42.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T03:05:42.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:05:42.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-06-04T03:05:42.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:05:42.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:05:42.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:05:42.069 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:05:42.144 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:05:31
2026-06-04T03:05:42.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87762, datetime.datetime(2026, 6, 4, 3, 5, 31), datetime.datetime(2026, 6, 4, 3, 5, 31), 'salt', 1.8, 100.61, None, 48.76, 124.98, -0.09, 820.8, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:05:42.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:05:42.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:05:42.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:05:31, diff=11.152156s, valid=True
2026-06-04T03:05:42.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:05:42.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T03:05:42.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:05:12, diff=30.155791s, valid=True
2026-06-04T03:05:42.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:05:42.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:05:42.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:05:26, diff=16.164173s, valid=True
2026-06-04T03:05:42.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:05:42.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:05:42.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:05:42.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:05:42.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:05:42.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-06-04T03:05:42.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:05:12, diff=30.168041s, valid=True
2026-06-04T03:05:42.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:05:42.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:05:42.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:05:42.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109339.168906s, valid=True
2026-06-04T03:05:42.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:05:42.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:05:42.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:05:42.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:05:42.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:05:42.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:05:42.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:05:42.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:05:42.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:05:42.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:05:42.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:05:42.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:05:42.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:05:42.566 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:05:42.771 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:05:43.116 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:05:43.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:05:43.220 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:05:43.221 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:05:44.562 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:05:44.562 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:06:14.586 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:06:14.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:06:14.587 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:06:14.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:06:14.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:06:15.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:06:15.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:06:15.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:06:15.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:06:15.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:06:15.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:06:15.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:06:15.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:06:17.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:06:17.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:06:17.615 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:06:17.615 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:06:17.625 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:06:17.637 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:06:17.637 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:06:17.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:06:17.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:06:17.638 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:06:17.638 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:06:17.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:06:17.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:06:17.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:06:17.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:06:17.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:06:17.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:06:17.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:06:17.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:06:17.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:06:17.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:06:17.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:06:17.925 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:06:17.998 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:06:02
2026-06-04T03:06:17.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87763, datetime.datetime(2026, 6, 4, 3, 6, 2), datetime.datetime(2026, 6, 4, 3, 6, 1), 'salt', 1.8, 100.51, None, 49.68, 121.32, -0.07, 820.93, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:06:17.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:06:17.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:06:18.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:06:01, diff=17.005488s, valid=True
2026-06-04T03:06:18.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:06:18.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:06:18.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:05:12, diff=66.009124s, valid=True
2026-06-04T03:06:18.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:06:18.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:06:18.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:05:57, diff=21.016955s, valid=True
2026-06-04T03:06:18.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:06:18.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:06:18.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:06:18.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:06:18.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:06:18.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:06:18.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:05:12, diff=66.020487s, valid=True
2026-06-04T03:06:18.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:06:18.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:06:18.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:06:18.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109375.021261s, valid=True
2026-06-04T03:06:18.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:06:18.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:06:18.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:06:18.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:06:18.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:06:18.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:06:18.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:06:18.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:06:18.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:06:18.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:06:18.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:06:18.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:06:18.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:06:18.340 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:06:18.546 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:06:18.888 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:06:18.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:06:18.991 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:06:18.991 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:06:19.201 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:06:19.201 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:06:49.215 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:06:49.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:06:49.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:06:49.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:06:49.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:06:49.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:06:49.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:06:49.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:06:49.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:06:49.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:06:49.633 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:06:49.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:06:49.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:06:52.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:06:52.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:06:52.047 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:06:52.047 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:06:52.055 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:06:52.066 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:06:52.067 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:06:52.067 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:06:52.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:06:52.067 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:06:52.067 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:06:52.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:06:52.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:06:52.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:06:52.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:06:52.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:06:52.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:06:52.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:06:52.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:06:52.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:06:52.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:06:52.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:06:52.334 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:06:52.402 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:06:32
2026-06-04T03:06:52.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87764, datetime.datetime(2026, 6, 4, 3, 6, 32), datetime.datetime(2026, 6, 4, 3, 6, 31), 'salt', 1.77, 100.48, None, 45.41, 125.94, -0.06, 820.8, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:06:52.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:06:52.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:06:52.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:06:31, diff=21.409681s, valid=True
2026-06-04T03:06:52.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:06:52.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:06:52.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:05:12, diff=100.412809s, valid=True
2026-06-04T03:06:52.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:06:52.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:06:52.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:06:27, diff=25.420326s, valid=True
2026-06-04T03:06:52.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:06:52.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:06:52.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:06:52.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:06:52.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:06:52.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:06:52.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:05:12, diff=100.42374s, valid=True
2026-06-04T03:06:52.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:06:52.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:06:52.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:06:52.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109409.424466s, valid=True
2026-06-04T03:06:52.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:06:52.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:06:52.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:06:52.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:06:52.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:06:52.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:06:52.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:06:52.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:06:52.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:06:52.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:06:52.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:06:52.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:06:52.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:06:52.815 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:06:53.021 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:06:53.369 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:06:53.473 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:06:53.473 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:06:53.473 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:06:53.711 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:06:53.712 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:07:23.724 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:07:23.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:07:23.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:07:24.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:07:24.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:07:24.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:07:24.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:07:24.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:07:24.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:07:24.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:07:24.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:07:24.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:07:24.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:07:26.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:07:26.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:07:26.804 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:07:26.804 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:07:26.815 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:07:26.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:07:26.829 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:07:26.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:07:26.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:07:26.830 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:07:26.830 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:07:26.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:07:26.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:07:26.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:07:27.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:07:27.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:07:27.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T03:07:27.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:07:27.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T03:07:27.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:07:27.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:07:27.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:07:27.177 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:07:27.252 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:07:02
2026-06-04T03:07:27.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87765, datetime.datetime(2026, 6, 4, 3, 7, 2), datetime.datetime(2026, 6, 4, 3, 7, 1), 'salt', 1.8, 100.54, None, 44.84, 115.91, -0.08, 820.86, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T03:07:27.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:07:27.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:07:27.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:07:01, diff=26.258282s, valid=True
2026-06-04T03:07:27.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:07:27.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T03:07:27.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:05:12, diff=135.261101s, valid=True
2026-06-04T03:07:27.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:07:27.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:07:27.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:06:57, diff=30.267558s, valid=True
2026-06-04T03:07:27.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:07:27.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:07:27.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:07:27.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:07:27.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:07:27.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T03:07:27.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:05:12, diff=135.270532s, valid=True
2026-06-04T03:07:27.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:07:27.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:07:27.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:07:27.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109444.271182s, valid=True
2026-06-04T03:07:27.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:07:27.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:07:27.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:07:27.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:07:27.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:07:27.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:07:27.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:07:27.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:07:27.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:07:27.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:07:27.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:07:27.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:07:27.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:07:27.587 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:07:27.795 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:07:28.142 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:07:28.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:07:28.245 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:07:28.245 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:07:28.331 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:07:28.331 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:07:58.357 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:07:58.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:07:58.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:07:58.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:07:58.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:07:58.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:07:58.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:07:58.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:07:58.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:07:58.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:07:58.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:07:58.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:07:58.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:08:01.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:08:01.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:08:01.316 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:08:01.316 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:08:01.326 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:08:01.339 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:08:01.339 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:08:01.340 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:08:01.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:08:01.340 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:08:01.341 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:08:01.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:08:01.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T03:08:01.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:08:01.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T03:08:01.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:08:01.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:08:01.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:08:01.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:08:01.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:08:01.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:08:01.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:08:01.808 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:08:01.880 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:07:32
2026-06-04T03:08:01.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87766, datetime.datetime(2026, 6, 4, 3, 7, 32), datetime.datetime(2026, 6, 4, 3, 7, 32), 'salt', 1.73, 100.48, None, 45.62, 121.83, -0.07, 820.86, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:08:01.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:08:01.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T03:08:01.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:07:32, diff=29.886345s, valid=True
2026-06-04T03:08:01.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:08:01.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:08:01.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:05:12, diff=169.889175s, valid=True
2026-06-04T03:08:01.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:08:01.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T03:08:01.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:07:27, diff=34.895705s, valid=True
2026-06-04T03:08:01.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:08:01.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:08:01.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:08:01.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:08:01.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:08:01.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:08:01.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:05:12, diff=169.89871s, valid=True
2026-06-04T03:08:01.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:08:01.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:08:01.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:08:01.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109478.899354s, valid=True
2026-06-04T03:08:01.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:08:01.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:08:01.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:08:01.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:08:01.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:08:01.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:08:01.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:08:01.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:08:01.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:08:02.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:08:02.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:08:02.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:08:02.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:08:02.212 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:08:02.418 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:08:02.763 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:08:02.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:08:02.866 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:08:02.866 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:08:03.054 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:08:03.054 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:08:33.059 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:08:33.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:08:33.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:08:33.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:08:33.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:08:33.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:08:33.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:08:33.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:08:33.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:08:33.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:08:33.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:08:33.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:08:33.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:08:35.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:08:35.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:08:35.981 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:08:35.981 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:08:35.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:08:36.003 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:08:36.004 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:08:36.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:08:36.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:08:36.005 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:08:36.005 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:08:36.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:08:36.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:08:36.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:08:36.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:08:36.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:08:36.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:08:36.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:08:36.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:08:36.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:08:36.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:08:36.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:08:36.342 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:08:36.415 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:08:33
2026-06-04T03:08:36.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87768, datetime.datetime(2026, 6, 4, 3, 8, 33), datetime.datetime(2026, 6, 4, 3, 8, 32), 'salt', 1.77, 100.48, None, 49.75, 118.05, -0.06, 820.86, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:08:36.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:08:36.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:08:36.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:08:32, diff=4.423168s, valid=True
2026-06-04T03:08:36.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:08:36.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:08:36.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:05:12, diff=204.426848s, valid=True
2026-06-04T03:08:36.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:08:36.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:08:36.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:08:28, diff=8.43532s, valid=True
2026-06-04T03:08:36.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:08:36.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:08:36.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:08:36.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:08:36.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:08:36.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:08:36.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:05:12, diff=204.439202s, valid=True
2026-06-04T03:08:36.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:08:36.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:08:36.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:08:36.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109513.440056s, valid=True
2026-06-04T03:08:36.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:08:36.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:08:36.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:08:36.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:08:36.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:08:36.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:08:36.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:08:36.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:08:36.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:08:36.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:08:36.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:08:36.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:08:36.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:08:36.764 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:08:36.967 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:08:37.313 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:08:37.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:08:37.415 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:08:37.415 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:08:37.501 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:08:37.501 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:09:07.517 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:09:07.517 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:09:07.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:09:07.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:09:07.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:09:07.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:09:07.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:09:07.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:09:07.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:09:07.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:09:07.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:09:07.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:09:07.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:09:10.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:09:10.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:09:10.563 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:09:10.563 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:09:10.583 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:09:10.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:09:10.601 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:09:10.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:09:10.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:09:10.602 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:09:10.602 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:09:10.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:09:10.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:09:10.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:09:10.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:09:10.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:09:10.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:09:10.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:09:10.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:09:10.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:09:10.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:09:10.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:09:10.930 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:09:11.003 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:09:03
2026-06-04T03:09:11.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87769, datetime.datetime(2026, 6, 4, 3, 9, 3), datetime.datetime(2026, 6, 4, 3, 9, 2), 'salt', 1.73, 100.61, None, 47.35, 124.77, -0.09, 820.8, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:09:11.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:09:11.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:09:11.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:09:02, diff=9.009629s, valid=True
2026-06-04T03:09:11.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:09:11.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:09:11.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:05:12, diff=239.012751s, valid=True
2026-06-04T03:09:11.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:09:11.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:09:11.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:08:58, diff=13.019998s, valid=True
2026-06-04T03:09:11.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:09:11.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:09:11.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:09:11.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:09:11.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:09:11.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:09:11.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:05:12, diff=239.023355s, valid=True
2026-06-04T03:09:11.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:09:11.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:09:11.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:09:11.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109548.024081s, valid=True
2026-06-04T03:09:11.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:09:11.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:09:11.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:09:11.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:09:11.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:09:11.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:09:11.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:09:11.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:09:11.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:09:11.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:09:11.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:09:11.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:09:11.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:09:11.462 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:09:11.671 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:09:12.011 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:09:12.113 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:09:12.113 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:09:12.113 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:09:12.306 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:09:12.306 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:09:42.336 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:09:42.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:09:42.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:09:42.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:09:42.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:09:42.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:09:42.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:09:42.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:09:42.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:09:42.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:09:42.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:09:42.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:09:42.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:09:45.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:09:45.373 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:09:45.373 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:09:45.374 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:09:45.384 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:09:45.400 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:09:45.401 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:09:45.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:09:45.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:09:45.402 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:09:45.402 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:09:45.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:09:45.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:09:45.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:09:45.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:09:45.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:09:45.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:09:45.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:09:45.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:09:45.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:09:45.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:09:45.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:09:45.738 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:09:45.808 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:09:33
2026-06-04T03:09:45.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87770, datetime.datetime(2026, 6, 4, 3, 9, 33), datetime.datetime(2026, 6, 4, 3, 9, 33), 'salt', 1.77, 100.61, None, 53.49, 122.37, -0.08, 820.68, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:09:45.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:09:45.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:09:45.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:09:33, diff=12.815828s, valid=True
2026-06-04T03:09:45.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:09:45.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:09:45.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:10:12, diff=-26.180679s, valid=True
2026-06-04T03:09:45.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:09:45.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:09:45.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:09:28, diff=17.82749s, valid=True
2026-06-04T03:09:45.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:09:45.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:09:45.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:09:45.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:09:45.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:09:45.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:09:45.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:10:12, diff=-26.168775s, valid=True
2026-06-04T03:09:45.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:09:45.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:09:45.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:09:45.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109582.832027s, valid=True
2026-06-04T03:09:45.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:09:45.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:09:45.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:09:45.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:09:45.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:09:45.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:09:45.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:09:45.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:09:45.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:09:45.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:09:46.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:09:46.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:09:46.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:09:46.152 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:09:46.354 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:09:46.752 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:09:46.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:09:46.853 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:09:46.853 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:09:47.123 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:09:47.123 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:10:17.154 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:10:17.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:10:17.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:10:17.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:10:17.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:10:17.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:10:17.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:10:17.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:10:17.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:10:17.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:10:17.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:10:17.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:10:17.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:10:20.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:10:20.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:10:20.152 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:10:20.152 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:10:20.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:10:20.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:10:20.175 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:10:20.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:10:20.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:10:20.175 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:10:20.176 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:10:20.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:10:20.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:10:20.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:10:20.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:10:20.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:10:20.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:10:20.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:10:20.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:10:20.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:10:20.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:10:20.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:10:20.530 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:10:20.601 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:10:04
2026-06-04T03:10:20.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87771, datetime.datetime(2026, 6, 4, 3, 10, 4), datetime.datetime(2026, 6, 4, 3, 10, 3), 'salt', 1.73, 100.58, None, 48.76, 120.52, -0.09, 820.8, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:10:20.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:10:20.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:10:20.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:10:03, diff=17.608769s, valid=True
2026-06-04T03:10:20.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:10:20.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:10:20.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:10:12, diff=8.612239s, valid=True
2026-06-04T03:10:20.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:10:20.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:10:20.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:09:58, diff=22.620354s, valid=True
2026-06-04T03:10:20.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:10:20.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:10:20.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:10:20.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:10:20.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:10:20.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:10:20.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:10:12, diff=8.624098s, valid=True
2026-06-04T03:10:20.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:10:20.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:10:20.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:10:20.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109617.624912s, valid=True
2026-06-04T03:10:20.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:10:20.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:10:20.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:10:20.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:10:20.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:10:20.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:10:20.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:10:20.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:10:20.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:10:20.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:10:20.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:10:20.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:10:20.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:10:20.945 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:10:21.149 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:10:21.488 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:10:21.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:10:21.590 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:10:21.590 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:10:21.839 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:10:21.840 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:10:51.858 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:10:51.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:10:51.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:10:52.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:10:52.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:10:52.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:10:52.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:10:52.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:10:52.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:10:52.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:10:52.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:10:52.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:10:52.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:10:54.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:10:54.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:10:54.728 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:10:54.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:10:54.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:10:54.750 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:10:54.750 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:10:54.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:10:54.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:10:54.752 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:10:54.752 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:10:54.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:10:54.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:10:54.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:10:54.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:10:54.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:10:55.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:10:55.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:10:55.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:10:55.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:10:55.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:10:55.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:10:55.084 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:10:55.158 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:10:34
2026-06-04T03:10:55.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87772, datetime.datetime(2026, 6, 4, 3, 10, 34), datetime.datetime(2026, 6, 4, 3, 10, 33), 'salt', 1.7, 100.51, None, 49.71, 130.31, -0.07, 820.87, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:10:55.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:10:55.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:10:55.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:10:33, diff=22.165295s, valid=True
2026-06-04T03:10:55.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:10:55.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:10:55.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:11:12, diff=-16.831245s, valid=True
2026-06-04T03:10:55.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:10:55.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:10:55.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:10:29, diff=26.176936s, valid=True
2026-06-04T03:10:55.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:10:55.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:10:55.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:10:55.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:10:55.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:10:55.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:10:55.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:11:12, diff=-16.81933s, valid=True
2026-06-04T03:10:55.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:10:55.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:10:55.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:10:55.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109652.181468s, valid=True
2026-06-04T03:10:55.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:10:55.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:10:55.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:10:55.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:10:55.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:10:55.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:10:55.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:10:55.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:10:55.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:10:55.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:10:55.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:10:55.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:10:55.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:10:55.499 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:10:55.775 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:10:56.113 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:10:56.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:10:56.215 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:10:56.215 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:10:56.402 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:10:56.402 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:11:26.432 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:11:26.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:11:26.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:11:26.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:11:26.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:11:26.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:11:26.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:11:26.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:11:26.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:11:26.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:11:26.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:11:26.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:11:26.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:11:29.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:11:29.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:11:29.189 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:11:29.190 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:11:29.200 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:11:29.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:11:29.214 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:11:29.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:11:29.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:11:29.215 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:11:29.215 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:11:29.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:11:29.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:11:29.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:11:29.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:11:29.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:11:29.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:11:29.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:11:29.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:11:29.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:11:29.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:11:29.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:11:29.542 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:11:29.612 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:11:04
2026-06-04T03:11:29.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87773, datetime.datetime(2026, 6, 4, 3, 11, 4), datetime.datetime(2026, 6, 4, 3, 11, 3), 'salt', 1.73, 100.58, None, 45.44, 116.27, -0.09, 820.99, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:11:29.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:11:29.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:11:29.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:11:03, diff=26.619879s, valid=True
2026-06-04T03:11:29.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:11:29.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:11:29.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:11:12, diff=17.623361s, valid=True
2026-06-04T03:11:29.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:11:29.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:11:29.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:10:59, diff=30.63159s, valid=True
2026-06-04T03:11:29.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:11:29.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:11:29.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:11:29.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:11:29.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:11:29.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:11:29.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:11:12, diff=17.635318s, valid=True
2026-06-04T03:11:29.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:11:29.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:11:29.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:11:29.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109686.636138s, valid=True
2026-06-04T03:11:29.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:11:29.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:11:29.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:11:29.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:11:29.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:11:29.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:11:29.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:11:29.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:11:29.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:11:29.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:11:29.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:11:29.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:11:29.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:11:29.971 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:11:30.190 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:11:30.530 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:11:30.631 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:11:30.631 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:11:30.631 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:11:30.852 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:11:30.853 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:12:00.883 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:12:00.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:12:00.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:12:01.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:12:01.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:12:01.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:12:01.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:12:01.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:12:01.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:12:01.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:12:01.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:12:01.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:12:01.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:12:04.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:12:04.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:12:04.253 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:12:04.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:12:04.264 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:12:04.277 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:12:04.277 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:12:04.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:12:04.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:12:04.278 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:12:04.279 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:12:04.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:12:04.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T03:12:04.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:12:04.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T03:12:04.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:12:04.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:12:04.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:12:04.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:12:04.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:12:04.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:12:04.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:12:04.603 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:12:04.671 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:11:34
2026-06-04T03:12:04.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87774, datetime.datetime(2026, 6, 4, 3, 11, 34), datetime.datetime(2026, 6, 4, 3, 11, 34), 'salt', 1.83, 100.54, None, 50.52, 125.05, -0.08, 820.99, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:12:04.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:12:04.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T03:12:04.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:11:34, diff=30.679069s, valid=True
2026-06-04T03:12:04.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:12:04.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:12:04.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:12:12, diff=-7.317446s, valid=True
2026-06-04T03:12:04.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:12:04.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T03:12:04.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:11:29, diff=35.690685s, valid=True
2026-06-04T03:12:04.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:12:04.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:12:04.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:12:04.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:12:04.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:12:04.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:12:04.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:12:12, diff=-7.30561s, valid=True
2026-06-04T03:12:04.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:12:04.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:12:04.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:12:04.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109721.695201s, valid=True
2026-06-04T03:12:04.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:12:04.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:12:04.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:12:04.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:12:04.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:12:04.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:12:04.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:12:04.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:12:04.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:12:04.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:12:04.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:12:04.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:12:04.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:12:05.087 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:12:05.292 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:12:05.632 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:12:05.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:12:05.734 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:12:05.734 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:12:05.926 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:12:05.926 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:12:35.926 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:12:35.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:12:35.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:12:36.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:12:36.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:12:36.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:12:36.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:12:36.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:12:36.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:12:36.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:12:36.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:12:36.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:12:36.507 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:12:38.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:12:38.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:12:38.910 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:12:38.911 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:12:38.920 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:12:38.933 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:12:38.934 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:12:38.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:12:38.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:12:38.935 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:12:38.935 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:12:38.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:12:39.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:12:39.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:12:39.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:12:39.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:12:39.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:12:39.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:12:39.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:12:39.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:12:39.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:12:39.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:12:39.263 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:12:39.336 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:12:35
2026-06-04T03:12:39.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87776, datetime.datetime(2026, 6, 4, 3, 12, 35), datetime.datetime(2026, 6, 4, 3, 12, 34), 'salt', 1.77, 100.58, None, 49.29, 123.15, -0.08, 820.87, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:12:39.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:12:39.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:12:39.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:12:34, diff=5.343465s, valid=True
2026-06-04T03:12:39.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:12:39.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:12:39.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:13:12, diff=-32.653068s, valid=True
2026-06-04T03:12:39.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:12:39.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:12:39.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:12:29, diff=10.35509s, valid=True
2026-06-04T03:12:39.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:12:39.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:12:39.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:12:39.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:12:39.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:12:39.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:12:39.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:13:12, diff=-32.641132s, valid=True
2026-06-04T03:12:39.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:12:39.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:12:39.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:12:39.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109756.359674s, valid=True
2026-06-04T03:12:39.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:12:39.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:12:39.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:12:39.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:12:39.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:12:39.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:12:39.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:12:39.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:12:39.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:12:39.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:12:39.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:12:39.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:12:39.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:12:39.679 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:12:39.887 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:12:40.241 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:12:40.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:12:40.342 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:12:40.342 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:12:40.499 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:12:40.499 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:13:10.528 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:13:10.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:13:10.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:13:10.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:13:10.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:13:11.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:13:11.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:13:11.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:13:11.090 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:13:11.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:13:11.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:13:11.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:13:11.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:13:13.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:13:13.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:13:13.509 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:13:13.510 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:13:13.521 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:13:13.538 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:13:13.539 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:13:13.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:13:13.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:13:13.540 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:13:13.540 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:13:13.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:13:13.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:13:13.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:13:13.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:13:13.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:13:13.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:13:13.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:13:13.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:13:13.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:13:13.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:13:13.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:13:13.872 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:13:13.941 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:13:05
2026-06-04T03:13:13.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87777, datetime.datetime(2026, 6, 4, 3, 13, 5), datetime.datetime(2026, 6, 4, 3, 13, 4), 'salt', 1.63, 100.51, None, 54.41, 114.43, -0.08, 820.74, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:13:13.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:13:13.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:13:13.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:13:04, diff=9.949192s, valid=True
2026-06-04T03:13:13.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:13:13.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:13:13.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:13:12, diff=1.952599s, valid=True
2026-06-04T03:13:13.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:13:13.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:13:13.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:13:04, diff=9.960518s, valid=True
2026-06-04T03:13:13.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:13:13.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:13:13.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:13:13.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:13:13.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:13:13.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:13:13.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:13:12, diff=1.964109s, valid=True
2026-06-04T03:13:13.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:13:13.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:13:13.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:13:13.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109790.9649s, valid=True
2026-06-04T03:13:13.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:13:13.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:13:13.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:13:13.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:13:13.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:13:14.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:13:14.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:13:14.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:13:14.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:13:14.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:13:14.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:13:14.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:13:14.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:13:14.374 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:13:14.581 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:13:14.924 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:13:15.027 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:13:15.027 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:13:15.028 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:13:15.563 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:13:15.563 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:13:45.569 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:13:45.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:13:45.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:13:45.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:13:45.860 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:13:46.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:13:46.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:13:46.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:13:46.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:13:46.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:13:46.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:13:46.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:13:46.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:13:48.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:13:48.905 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:13:48.905 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:13:48.906 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:13:48.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:13:48.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:13:48.927 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:13:48.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:13:48.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:13:48.928 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:13:48.928 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:13:48.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:13:49.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:13:49.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:13:49.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:13:49.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:13:49.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:13:49.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:13:49.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:13:49.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:13:49.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:13:49.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:13:49.253 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:13:49.325 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:13:35
2026-06-04T03:13:49.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87778, datetime.datetime(2026, 6, 4, 3, 13, 35), datetime.datetime(2026, 6, 4, 3, 13, 35), 'salt', 1.77, 100.61, None, 50.21, 127.57, -0.08, 820.74, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:13:49.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:13:49.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:13:49.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:13:35, diff=14.332849s, valid=True
2026-06-04T03:13:49.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:13:49.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:13:49.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:14:12, diff=-22.663665s, valid=True
2026-06-04T03:13:49.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:13:49.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:13:49.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:13:30, diff=19.344537s, valid=True
2026-06-04T03:13:49.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:13:49.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:13:49.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:13:49.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:13:49.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:13:49.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:13:49.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:14:12, diff=-22.651711s, valid=True
2026-06-04T03:13:49.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:13:49.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:13:49.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:13:49.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109826.349111s, valid=True
2026-06-04T03:13:49.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:13:49.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:13:49.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:13:49.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:13:49.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:13:49.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:13:49.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:13:49.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:13:49.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:13:49.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:13:49.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:13:49.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:13:49.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:13:49.670 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:13:49.880 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:13:50.237 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:13:50.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:13:50.338 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:13:50.339 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:13:50.427 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:13:50.428 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:14:20.456 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:14:20.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:14:20.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:14:20.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:14:20.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:14:21.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:14:21.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:14:21.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:14:21.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:14:21.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:14:21.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:14:21.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:14:21.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:14:23.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:14:23.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:14:23.529 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:14:23.530 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:14:23.541 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:14:23.554 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:14:23.554 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:14:23.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:14:23.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:14:23.556 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:14:23.556 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:14:23.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:14:23.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:14:23.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:14:23.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:14:23.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:14:23.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:14:23.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:14:23.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:14:23.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:14:23.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:14:23.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:14:23.959 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:14:24.033 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:14:06
2026-06-04T03:14:24.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87779, datetime.datetime(2026, 6, 4, 3, 14, 6), datetime.datetime(2026, 6, 4, 3, 14, 5), 'salt', 1.7, 100.58, None, 53.14, 121.29, -0.08, 820.68, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:14:24.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:14:24.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:14:24.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:14:05, diff=19.039193s, valid=True
2026-06-04T03:14:24.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:14:24.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:14:24.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:14:12, diff=12.042061s, valid=True
2026-06-04T03:14:24.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:14:24.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:14:24.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:14:00, diff=24.048598s, valid=True
2026-06-04T03:14:24.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:14:24.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:14:24.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:14:24.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:14:24.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:14:24.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:14:24.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:14:12, diff=12.051599s, valid=True
2026-06-04T03:14:24.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:14:24.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:14:24.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:14:24.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109861.052243s, valid=True
2026-06-04T03:14:24.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:14:24.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:14:24.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:14:24.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:14:24.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:14:24.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:14:24.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:14:24.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:14:24.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:14:24.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:14:24.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:14:24.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:14:24.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:14:24.363 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:14:24.584 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:14:24.925 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:14:25.027 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:14:25.027 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:14:25.027 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:14:25.180 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:14:25.180 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:14:55.210 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:14:55.211 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:14:55.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:14:55.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:14:55.525 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:14:55.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:14:55.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:14:55.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:14:55.778 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:14:55.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:14:55.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:14:55.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:14:55.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:14:58.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:14:58.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:14:58.207 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:14:58.207 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:14:58.217 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:14:58.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:14:58.230 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:14:58.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:14:58.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:14:58.231 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:14:58.232 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:14:58.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:14:58.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:14:58.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:14:58.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:14:58.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:14:58.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:14:58.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:14:58.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:14:58.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:14:58.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:14:58.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:14:58.567 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:14:58.643 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:14:36
2026-06-04T03:14:58.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87780, datetime.datetime(2026, 6, 4, 3, 14, 36), datetime.datetime(2026, 6, 4, 3, 14, 35), 'salt', 1.73, 100.61, None, 50.31, 117.96, -0.09, 820.86, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:14:58.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:14:58.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:14:58.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:14:35, diff=23.651079s, valid=True
2026-06-04T03:14:58.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:14:58.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:14:58.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:15:12, diff=-13.345397s, valid=True
2026-06-04T03:14:58.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:14:58.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:14:58.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:14:31, diff=27.662779s, valid=True
2026-06-04T03:14:58.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:14:58.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:14:58.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:14:58.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:14:58.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:14:58.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:14:58.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:15:12, diff=-13.333488s, valid=True
2026-06-04T03:14:58.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:14:58.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:14:58.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:14:58.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109895.667351s, valid=True
2026-06-04T03:14:58.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:14:58.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:14:58.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:14:58.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:14:58.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:14:58.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:14:58.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:14:58.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:14:58.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:14:58.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:14:58.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:14:58.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:14:58.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:14:58.990 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:14:59.193 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:14:59.540 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:14:59.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:14:59.642 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:14:59.642 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:14:59.796 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:14:59.796 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:15:29.815 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:15:29.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:15:29.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:15:30.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:15:30.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:15:30.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:15:30.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:15:30.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:15:30.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:15:30.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:15:30.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:15:30.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:15:30.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:15:33.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:15:33.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:15:33.024 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:15:33.024 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:15:33.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:15:33.046 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:15:33.046 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:15:33.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:15:33.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:15:33.047 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:15:33.048 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:15:33.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:15:33.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T03:15:33.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:15:33.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T03:15:33.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:15:33.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:15:33.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:15:33.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:15:33.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:15:33.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:15:33.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:15:33.372 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:15:33.442 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:15:06
2026-06-04T03:15:33.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87781, datetime.datetime(2026, 6, 4, 3, 15, 6), datetime.datetime(2026, 6, 4, 3, 15, 5), 'salt', 1.63, 100.48, None, 56.42, 123.85, -0.07, 820.93, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:15:33.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:15:33.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T03:15:33.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:15:05, diff=28.45s, valid=True
2026-06-04T03:15:33.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:15:33.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:15:33.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:15:12, diff=21.453443s, valid=True
2026-06-04T03:15:33.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:15:33.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T03:15:33.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:15:01, diff=32.461477s, valid=True
2026-06-04T03:15:33.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:15:33.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:15:33.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:15:33.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:15:33.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:15:33.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:15:33.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:15:12, diff=21.465149s, valid=True
2026-06-04T03:15:33.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:15:33.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:15:33.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:15:33.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109930.465953s, valid=True
2026-06-04T03:15:33.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:15:33.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:15:33.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:15:33.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:15:33.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:15:33.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:15:33.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:15:33.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:15:33.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:15:33.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:15:33.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:15:33.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:15:33.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:15:33.784 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:15:33.988 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:15:34.329 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:15:34.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:15:34.431 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:15:34.431 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:15:34.720 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:15:34.720 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:16:04.749 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:16:04.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:16:04.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:16:05.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:16:05.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:16:05.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:16:05.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:16:05.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:16:05.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:16:05.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:16:05.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:16:05.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:16:05.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:16:07.719 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:16:07.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:16:07.728 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:16:07.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:16:07.739 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:16:07.751 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:16:07.752 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:16:07.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:16:07.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:16:07.753 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:16:07.753 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:16:07.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:16:07.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:16:07.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:16:07.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:16:07.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:16:08.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:16:08.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:16:08.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:16:08.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:16:08.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:16:08.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:16:08.083 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:16:08.155 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:16:07
2026-06-04T03:16:08.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87783, datetime.datetime(2026, 6, 4, 3, 16, 7), datetime.datetime(2026, 6, 4, 3, 16, 6), 'salt', 1.7, 100.51, None, 45.16, 118.05, -0.07, 820.74, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:16:08.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:16:08.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:16:08.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:16:06, diff=2.163082s, valid=True
2026-06-04T03:16:08.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:16:08.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:16:08.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:16:12, diff=-3.833342s, valid=True
2026-06-04T03:16:08.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:16:08.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:16:08.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:16:01, diff=7.175077s, valid=True
2026-06-04T03:16:08.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:16:08.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:16:08.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:16:08.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:16:08.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:16:08.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:16:08.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:16:12, diff=-3.821063s, valid=True
2026-06-04T03:16:08.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:16:08.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:16:08.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:16:08.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109965.179784s, valid=True
2026-06-04T03:16:08.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:16:08.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:16:08.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:16:08.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:16:08.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:16:08.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:16:08.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:16:08.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:16:08.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:16:08.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:16:08.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:16:08.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:16:08.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:16:08.510 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:16:08.716 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:16:09.116 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:16:09.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:16:09.217 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:16:09.217 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:16:09.331 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:16:09.332 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:16:39.362 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:16:39.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:16:39.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:16:39.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:16:39.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:16:39.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:16:39.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:16:39.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:16:39.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:16:39.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:16:39.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:16:39.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:16:39.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:16:42.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:16:42.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:16:42.402 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:16:42.402 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:16:42.412 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:16:42.425 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:16:42.426 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:16:42.426 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:16:42.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:16:42.427 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:16:42.427 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:16:42.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:16:42.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:16:42.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:16:42.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:16:42.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:16:42.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:16:42.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:16:42.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:16:42.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:16:42.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:16:42.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:16:42.774 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:16:42.846 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:16:37
2026-06-04T03:16:42.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87784, datetime.datetime(2026, 6, 4, 3, 16, 37), datetime.datetime(2026, 6, 4, 3, 16, 36), 'salt', 1.73, 100.58, None, 42.45, 124.58, -0.09, 820.74, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T03:16:42.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:16:42.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:16:42.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:16:36, diff=6.853753s, valid=True
2026-06-04T03:16:42.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:16:42.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:16:42.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:17:12, diff=-29.142809s, valid=True
2026-06-04T03:16:42.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:16:42.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:16:42.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:16:32, diff=10.865268s, valid=True
2026-06-04T03:16:42.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:16:42.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:16:42.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:16:42.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:16:42.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:16:42.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:16:42.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:17:12, diff=-29.131029s, valid=True
2026-06-04T03:16:42.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:16:42.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:16:42.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:16:42.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=109999.869794s, valid=True
2026-06-04T03:16:42.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:16:42.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:16:42.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:16:42.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:16:42.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:16:42.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:16:42.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:16:42.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:16:42.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:16:43.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:16:43.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:16:43.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:16:43.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:16:43.189 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:16:43.392 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:16:43.730 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:16:43.831 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:16:43.832 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:16:43.832 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:16:44.030 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:16:44.030 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:17:14.042 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:17:14.042 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:17:14.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:17:14.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:17:14.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:17:14.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:17:14.427 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:17:14.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:17:14.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:17:14.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:17:14.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:17:14.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:17:14.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:17:16.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:17:16.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:17:16.915 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:17:16.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:17:16.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:17:16.938 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:17:16.939 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:17:16.939 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:17:16.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:17:16.940 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:17:16.940 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:17:16.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:17:17.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:17:17.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:17:17.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:17:17.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:17:17.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:17:17.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:17:17.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:17:17.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:17:17.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:17:17.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:17:17.284 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:17:17.366 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:17:07
2026-06-04T03:17:17.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87785, datetime.datetime(2026, 6, 4, 3, 17, 7), datetime.datetime(2026, 6, 4, 3, 17, 6), 'salt', 1.7, 100.54, None, 50.7, 115.07, -0.08, 820.74, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:17:17.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:17:17.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:17:17.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:17:06, diff=11.373392s, valid=True
2026-06-04T03:17:17.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:17:17.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:17:17.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:17:12, diff=5.376862s, valid=True
2026-06-04T03:17:17.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:17:17.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:17:17.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:17:02, diff=15.384977s, valid=True
2026-06-04T03:17:17.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:17:17.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:17:17.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:17:17.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:17:17.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:17:17.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:17:17.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:17:12, diff=5.388667s, valid=True
2026-06-04T03:17:17.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:17:17.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:17:17.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:17:17.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110034.389463s, valid=True
2026-06-04T03:17:17.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:17:17.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:17:17.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:17:17.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:17:17.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:17:17.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:17:17.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:17:17.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:17:17.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:17:17.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:17:17.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:17:17.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:17:17.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:17:17.709 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:17:17.989 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:17:18.330 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:17:18.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:17:18.434 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:17:18.434 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:17:18.514 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:17:18.514 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:17:48.521 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:17:48.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:17:48.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:17:48.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:17:48.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:17:48.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:17:48.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:17:48.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:17:48.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:17:48.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:17:48.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:17:48.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:17:48.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:17:51.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:17:51.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:17:51.385 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:17:51.385 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:17:51.393 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:17:51.405 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:17:51.405 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:17:51.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:17:51.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:17:51.406 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:17:51.406 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:17:51.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:17:51.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:17:51.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:17:51.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:17:51.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:17:51.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:17:51.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:17:51.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:17:51.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:17:51.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:17:51.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:17:51.687 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:17:51.757 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:17:37
2026-06-04T03:17:51.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87786, datetime.datetime(2026, 6, 4, 3, 17, 37), datetime.datetime(2026, 6, 4, 3, 17, 37), 'salt', 1.73, 100.54, None, 44.17, 118.03, -0.08, 820.8, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T03:17:51.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:17:51.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:17:51.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:17:37, diff=14.764224s, valid=True
2026-06-04T03:17:51.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:17:51.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:17:51.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:18:12, diff=-20.232495s, valid=True
2026-06-04T03:17:51.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:17:51.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:17:51.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:17:32, diff=19.775281s, valid=True
2026-06-04T03:17:51.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:17:51.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:17:51.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:17:51.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:17:51.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:17:51.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:17:51.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:18:12, diff=-20.22123s, valid=True
2026-06-04T03:17:51.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:17:51.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:17:51.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:17:51.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110068.779525s, valid=True
2026-06-04T03:17:51.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:17:51.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:17:51.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:17:51.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:17:51.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:17:51.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:17:51.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:17:51.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:17:51.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:17:51.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:17:51.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:17:52.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:17:52.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:17:52.097 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:17:52.300 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:17:52.641 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:17:52.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:17:52.743 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:17:52.743 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:17:53.013 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:17:53.013 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:18:23.023 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:18:23.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:18:23.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:18:23.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:18:23.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:18:23.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:18:23.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:18:23.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:18:23.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:18:23.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:18:23.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:18:23.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:18:23.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:18:26.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:18:26.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:18:26.391 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:18:26.392 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:18:26.402 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:18:26.414 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:18:26.415 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:18:26.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:18:26.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:18:26.416 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:18:26.416 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:18:26.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:18:26.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:18:26.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:18:26.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:18:26.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:18:26.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:18:26.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:18:26.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:18:26.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:18:26.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:18:26.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:18:26.746 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:18:26.816 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:18:08
2026-06-04T03:18:26.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87787, datetime.datetime(2026, 6, 4, 3, 18, 8), datetime.datetime(2026, 6, 4, 3, 18, 7), 'salt', 1.7, 100.51, None, 39.94, 116.69, -0.07, 821.05, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T03:18:26.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:18:26.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:18:26.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:18:07, diff=19.823333s, valid=True
2026-06-04T03:18:26.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:18:26.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:18:26.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:18:12, diff=14.826852s, valid=True
2026-06-04T03:18:26.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:18:26.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:18:26.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:18:02, diff=24.834866s, valid=True
2026-06-04T03:18:26.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:18:26.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:18:26.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:18:26.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:18:26.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:18:26.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:18:26.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:18:12, diff=14.838611s, valid=True
2026-06-04T03:18:26.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:18:26.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:18:26.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:18:26.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110103.839444s, valid=True
2026-06-04T03:18:26.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:18:26.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:18:26.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:18:26.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:18:26.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:18:26.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:18:26.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:18:26.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:18:26.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:18:26.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:18:27.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:18:27.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:18:27.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:18:27.233 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:18:27.435 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:18:27.777 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:18:27.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:18:27.878 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:18:27.878 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:18:27.965 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:18:28.904 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:18:58.924 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:18:58.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:18:58.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:18:59.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:18:59.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:18:59.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:18:59.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:18:59.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:18:59.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:18:59.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:18:59.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:18:59.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:18:59.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:19:02.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:19:02.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:19:02.063 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:19:02.063 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:19:02.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:19:02.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:19:02.086 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:19:02.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:19:02.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:19:02.087 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:19:02.087 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:19:02.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:19:02.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:19:02.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:19:02.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:19:02.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:19:02.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:19:02.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:19:02.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:19:02.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:19:02.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:19:02.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:19:02.430 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:19:02.501 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:18:38
2026-06-04T03:19:02.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87788, datetime.datetime(2026, 6, 4, 3, 18, 38), datetime.datetime(2026, 6, 4, 3, 18, 37), 'salt', 1.67, 100.51, None, 41.85, 128.11, -0.07, 820.86, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T03:19:02.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:19:02.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:19:02.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:18:37, diff=25.508944s, valid=True
2026-06-04T03:19:02.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:19:02.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:19:02.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:19:12, diff=-9.487569s, valid=True
2026-06-04T03:19:02.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:19:02.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:19:02.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:18:32, diff=30.520638s, valid=True
2026-06-04T03:19:02.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:19:02.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:19:02.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:19:02.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:19:02.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:19:02.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:19:02.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:19:12, diff=-9.475614s, valid=True
2026-06-04T03:19:02.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:19:02.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:19:02.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:19:02.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110139.525223s, valid=True
2026-06-04T03:19:02.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:19:02.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:19:02.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:19:02.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:19:02.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:19:02.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:19:02.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:19:02.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:19:02.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:19:02.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:19:02.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:19:02.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:19:02.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:19:02.846 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:19:03.049 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:19:03.389 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:19:03.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:19:03.491 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:19:03.491 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:19:03.726 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:19:03.726 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:19:33.756 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:19:33.757 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:19:33.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:19:34.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:19:34.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:19:34.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:19:34.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:19:34.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:19:34.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:19:34.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:19:34.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:19:34.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:19:34.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:19:36.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:19:36.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:19:36.698 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:19:36.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:19:36.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:19:36.722 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:19:36.723 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:19:36.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:19:36.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:19:36.724 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:19:36.724 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:19:36.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:19:36.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T03:19:36.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:19:36.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T03:19:36.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:19:37.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:19:37.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:19:37.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:19:37.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:19:37.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:19:37.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:19:37.075 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:19:37.160 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:19:08
2026-06-04T03:19:37.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87789, datetime.datetime(2026, 6, 4, 3, 19, 8), datetime.datetime(2026, 6, 4, 3, 19, 7), 'salt', 1.63, 100.58, None, 46.15, 111.12, -0.09, 820.86, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:19:37.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:19:37.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T03:19:37.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:19:07, diff=30.167449s, valid=True
2026-06-04T03:19:37.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:19:37.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:19:37.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:19:12, diff=25.170979s, valid=True
2026-06-04T03:19:37.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:19:37.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T03:19:37.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:19:03, diff=34.179156s, valid=True
2026-06-04T03:19:37.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:19:37.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:19:37.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:19:37.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:19:37.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:19:37.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:19:37.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:19:12, diff=25.182889s, valid=True
2026-06-04T03:19:37.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:19:37.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:19:37.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:19:37.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110174.183711s, valid=True
2026-06-04T03:19:37.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:19:37.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:19:37.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:19:37.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:19:37.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:19:37.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:19:37.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:19:37.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:19:37.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:19:37.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:19:37.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:19:37.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:19:37.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:19:37.575 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:19:37.782 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:19:38.128 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:19:38.235 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:19:38.235 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:19:38.235 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:19:38.503 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:19:38.503 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:20:08.533 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:20:08.533 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:20:08.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:20:09.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:20:09.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:20:09.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:20:09.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:20:09.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:20:09.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:20:09.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:20:09.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:20:09.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:20:09.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:20:11.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:20:11.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:20:11.629 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:20:11.630 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:20:11.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:20:11.651 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:20:11.652 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:20:11.652 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:20:11.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:20:11.653 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:20:11.653 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:20:11.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:20:11.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:20:11.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:20:11.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:20:11.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:20:11.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:20:11.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:20:11.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:20:11.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:20:11.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:20:11.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:20:11.961 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:20:12.032 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:20:09
2026-06-04T03:20:12.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87791, datetime.datetime(2026, 6, 4, 3, 20, 9), datetime.datetime(2026, 6, 4, 3, 20, 8), 'salt', 1.7, 100.51, None, 44.7, 99.68, -0.07, 820.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T03:20:12.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:20:12.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:20:12.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:20:08, diff=4.039051s, valid=True
2026-06-04T03:20:12.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:20:12.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:20:12.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:20:12, diff=0.042394s, valid=True
2026-06-04T03:20:12.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:20:12.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:20:12.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:20:03, diff=9.050226s, valid=True
2026-06-04T03:20:12.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:20:12.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:20:12.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:20:12.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:20:12.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:20:12.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:20:12.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:20:12, diff=0.053842s, valid=True
2026-06-04T03:20:12.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:20:12.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:20:12.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:20:12.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110209.054607s, valid=True
2026-06-04T03:20:12.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:20:12.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:20:12.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:20:12.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:20:12.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:20:12.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:20:12.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:20:12.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:20:12.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:20:12.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:20:12.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:20:12.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:20:12.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:20:12.375 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:20:12.580 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:20:12.922 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:20:13.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:20:13.024 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:20:13.024 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:20:13.109 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:20:13.109 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:20:43.139 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:20:43.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:20:43.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:20:43.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:20:43.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:20:43.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:20:43.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:20:43.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:20:43.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:20:43.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:20:43.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:20:43.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:20:43.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:20:46.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:20:46.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:20:46.105 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:20:46.106 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:20:46.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:20:46.129 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:20:46.130 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:20:46.130 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:20:46.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:20:46.131 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:20:46.131 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:20:46.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:20:46.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:20:46.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:20:46.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:20:46.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:20:46.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:20:46.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:20:46.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:20:46.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:20:46.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:20:46.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:20:46.552 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:20:46.627 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:20:39
2026-06-04T03:20:46.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87792, datetime.datetime(2026, 6, 4, 3, 20, 39), datetime.datetime(2026, 6, 4, 3, 20, 38), 'salt', 1.7, 100.54, None, 45.34, 121.43, -0.08, 820.93, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:20:46.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:20:46.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:20:46.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:20:38, diff=8.633038s, valid=True
2026-06-04T03:20:46.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:20:46.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:20:46.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:21:12, diff=-25.364084s, valid=True
2026-06-04T03:20:46.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:20:46.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:20:46.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:20:33, diff=13.642503s, valid=True
2026-06-04T03:20:46.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:20:46.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:20:46.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:20:46.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:20:46.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:20:46.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:20:46.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:21:12, diff=-25.354467s, valid=True
2026-06-04T03:20:46.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:20:46.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:20:46.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:20:46.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110243.646184s, valid=True
2026-06-04T03:20:46.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:20:46.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:20:46.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:20:46.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:20:46.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:20:46.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:20:46.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:20:46.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:20:46.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:20:46.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:20:46.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:20:46.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:20:46.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:20:46.959 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:20:47.170 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:20:47.510 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:20:47.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:20:47.612 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:20:47.612 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:20:47.700 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:20:47.700 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:21:17.730 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:21:17.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:21:17.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:21:18.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:21:18.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:21:18.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:21:18.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:21:18.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:21:18.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:21:18.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:21:18.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:21:18.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:21:18.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:21:21.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:21:21.081 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:21:21.082 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:21:21.082 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:21:21.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:21:21.107 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:21:21.107 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:21:21.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:21:21.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:21:21.109 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:21:21.109 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:21:21.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:21:21.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:21:21.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:21:21.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:21:21.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:21:21.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:21:21.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:21:21.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:21:21.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:21:21.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:21:21.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:21:21.450 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:21:21.531 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:21:09
2026-06-04T03:21:21.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87793, datetime.datetime(2026, 6, 4, 3, 21, 9), datetime.datetime(2026, 6, 4, 3, 21, 8), 'salt', 1.73, 100.58, None, 47.17, 124.44, -0.08, 820.86, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:21:21.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:21:21.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:21:21.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:21:08, diff=13.537818s, valid=True
2026-06-04T03:21:21.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:21:21.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:21:21.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:21:12, diff=9.54067s, valid=True
2026-06-04T03:21:21.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:21:21.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:21:21.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:21:04, diff=17.54732s, valid=True
2026-06-04T03:21:21.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:21:21.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:21:21.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:21:21.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:21:21.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:21:21.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:21:21.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:21:12, diff=9.550393s, valid=True
2026-06-04T03:21:21.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:21:21.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:21:21.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:21:21.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110278.551187s, valid=True
2026-06-04T03:21:21.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:21:21.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:21:21.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:21:21.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:21:21.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:21:21.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:21:21.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:21:21.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:21:21.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:21:21.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:21:21.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:21:21.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:21:21.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:21:21.880 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:21:22.083 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:21:22.424 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:21:22.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:21:22.526 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:21:22.526 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:21:22.803 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:21:22.803 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:21:52.833 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:21:52.833 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:21:52.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:21:53.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:21:53.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:21:53.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:21:53.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:21:53.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:21:53.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:21:53.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:21:53.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:21:53.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:21:53.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:21:55.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:21:55.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:21:55.788 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:21:55.788 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:21:55.799 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:21:55.812 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:21:55.812 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:21:55.813 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:21:55.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:21:55.813 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:21:55.814 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:21:55.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:21:55.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:21:55.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:21:56.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:21:56.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:21:56.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:21:56.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:21:56.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:21:56.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:21:56.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:21:56.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:21:56.117 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:21:56.186 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:21:39
2026-06-04T03:21:56.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87794, datetime.datetime(2026, 6, 4, 3, 21, 39), datetime.datetime(2026, 6, 4, 3, 21, 39), 'salt', 1.73, 100.54, None, 48.76, 129.98, -0.08, 820.86, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:21:56.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:21:56.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:21:56.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:21:39, diff=17.193302s, valid=True
2026-06-04T03:21:56.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:21:56.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:21:56.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:22:12, diff=-15.803437s, valid=True
2026-06-04T03:21:56.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:21:56.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:21:56.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:21:34, diff=22.204358s, valid=True
2026-06-04T03:21:56.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:21:56.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:21:56.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:21:56.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:21:56.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:21:56.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:21:56.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:22:12, diff=-15.792094s, valid=True
2026-06-04T03:21:56.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:21:56.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:21:56.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:21:56.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110313.208672s, valid=True
2026-06-04T03:21:56.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:21:56.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:21:56.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:21:56.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:21:56.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:21:56.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:21:56.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:21:56.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:21:56.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:21:56.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:21:56.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:21:56.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:21:56.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:21:56.526 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:21:56.731 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:21:57.071 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:21:57.173 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:21:57.173 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:21:57.173 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:21:57.459 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:21:57.459 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:22:27.490 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:22:27.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:22:27.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:22:27.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:22:27.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:22:28.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:22:28.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:22:28.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:22:28.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:22:28.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:22:28.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:22:28.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:22:28.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:22:30.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:22:30.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:22:30.358 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:22:30.358 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:22:30.368 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:22:30.380 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:22:30.381 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:22:30.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:22:30.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:22:30.382 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:22:30.383 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:22:30.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:22:30.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:22:30.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:22:30.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:22:30.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:22:30.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:22:30.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:22:30.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:22:30.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:22:30.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:22:30.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:22:30.718 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:22:30.789 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:22:10
2026-06-04T03:22:30.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87795, datetime.datetime(2026, 6, 4, 3, 22, 10), datetime.datetime(2026, 6, 4, 3, 22, 9), 'salt', 1.7, 100.58, None, 39.91, 120.12, -0.08, 820.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T03:22:30.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:22:30.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:22:30.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:22:09, diff=21.79766s, valid=True
2026-06-04T03:22:30.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:22:30.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:22:30.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:22:12, diff=18.80247s, valid=True
2026-06-04T03:22:30.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:22:30.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:22:30.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:22:04, diff=26.810956s, valid=True
2026-06-04T03:22:30.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:22:30.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:22:30.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:22:30.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:22:30.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:22:30.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:22:30.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:22:12, diff=18.814563s, valid=True
2026-06-04T03:22:30.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:22:30.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:22:30.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:22:30.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110347.815312s, valid=True
2026-06-04T03:22:30.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:22:30.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:22:30.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:22:30.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:22:30.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:22:30.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:22:30.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:22:30.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:22:30.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:22:30.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:22:31.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:22:31.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:22:31.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:22:31.166 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:22:31.388 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:22:31.809 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:22:31.912 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:22:31.912 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:22:31.912 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:22:31.999 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:22:31.999 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:23:02.029 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:23:02.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:23:02.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:23:02.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:23:02.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:23:02.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:23:02.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:23:02.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:23:02.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:23:02.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:23:02.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:23:02.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:23:02.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:23:05.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:23:05.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:23:05.351 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:23:05.351 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:23:05.362 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:23:05.375 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:23:05.375 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:23:05.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:23:05.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:23:05.377 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:23:05.377 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:23:05.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:23:05.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:23:05.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:23:05.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:23:05.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:23:05.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:23:05.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:23:05.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:23:05.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:23:05.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:23:05.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:23:05.730 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:23:05.804 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:22:40
2026-06-04T03:23:05.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87796, datetime.datetime(2026, 6, 4, 3, 22, 40), datetime.datetime(2026, 6, 4, 3, 22, 39), 'salt', 1.7, 100.54, None, 37.51, 114.13, -0.08, 821.05, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T03:23:05.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:23:05.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:23:05.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:22:39, diff=26.812343s, valid=True
2026-06-04T03:23:05.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:23:05.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:23:05.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:23:12, diff=-6.184179s, valid=True
2026-06-04T03:23:05.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:23:05.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:23:05.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:22:34, diff=31.823965s, valid=True
2026-06-04T03:23:05.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:23:05.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:23:05.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:23:05.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:23:05.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:23:05.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:23:05.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:23:12, diff=-6.172204s, valid=True
2026-06-04T03:23:05.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:23:05.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:23:05.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:23:05.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110382.828615s, valid=True
2026-06-04T03:23:05.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:23:05.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:23:05.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:23:05.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:23:05.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:23:05.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:23:05.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:23:05.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:23:05.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:23:05.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:23:06.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:23:06.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:23:06.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:23:06.148 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:23:06.352 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:23:06.690 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:23:06.792 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:23:06.792 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:23:06.792 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:23:07.060 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:23:07.061 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:23:37.080 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:23:37.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:23:37.081 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:23:37.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:23:37.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:23:37.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:23:37.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:23:37.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:23:37.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:23:37.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:23:37.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:23:37.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:23:37.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:23:40.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:23:40.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:23:40.076 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:23:40.076 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:23:40.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:23:40.097 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:23:40.098 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:23:40.098 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:23:40.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:23:40.098 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:23:40.098 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:23:40.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:23:40.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T03:23:40.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:23:40.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T03:23:40.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:23:40.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:23:40.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:23:40.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:23:40.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:23:40.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:23:40.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:23:40.391 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:23:40.461 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:23:10
2026-06-04T03:23:40.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87797, datetime.datetime(2026, 6, 4, 3, 23, 10), datetime.datetime(2026, 6, 4, 3, 23, 9), 'salt', 1.73, 100.58, None, 42.16, 126.39, -0.08, 821.17, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T03:23:40.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:23:40.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T03:23:40.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:23:09, diff=31.468342s, valid=True
2026-06-04T03:23:40.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:23:40.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:23:40.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:23:12, diff=28.471577s, valid=True
2026-06-04T03:23:40.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:23:40.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T03:23:40.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:23:04, diff=36.479164s, valid=True
2026-06-04T03:23:40.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:23:40.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:23:40.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:23:40.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:23:40.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:23:40.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:23:40.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:23:12, diff=28.482667s, valid=True
2026-06-04T03:23:40.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:23:40.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:23:40.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:23:40.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110417.48342s, valid=True
2026-06-04T03:23:40.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:23:40.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:23:40.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:23:40.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:23:40.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:23:40.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:23:40.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:23:40.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:23:40.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:23:40.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:23:40.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:23:40.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:23:40.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:23:40.803 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:23:41.091 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:23:41.430 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:23:41.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:23:41.531 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:23:41.531 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:23:41.684 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:23:41.684 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:24:11.687 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:24:11.687 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:24:11.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:24:12.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:24:12.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:24:12.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:24:12.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:24:12.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:24:12.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:24:12.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:24:12.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:24:12.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:24:12.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:24:15.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:24:15.148 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:24:15.149 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:24:15.149 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:24:15.160 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:24:15.173 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:24:15.173 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:24:15.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:24:15.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:24:15.174 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:24:15.175 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:24:15.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:24:15.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:24:15.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:24:15.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:24:15.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:24:15.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:24:15.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:24:15.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:24:15.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:24:15.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:24:15.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:24:15.520 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:24:15.594 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:24:11
2026-06-04T03:24:15.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87799, datetime.datetime(2026, 6, 4, 3, 24, 11), datetime.datetime(2026, 6, 4, 3, 24, 10), 'salt', 1.7, 100.48, None, 46.89, 123.38, -0.07, 820.99, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:24:15.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:24:15.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:24:15.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:24:10, diff=5.602067s, valid=True
2026-06-04T03:24:15.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:24:15.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:24:15.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:24:12, diff=3.605585s, valid=True
2026-06-04T03:24:15.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:24:15.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:24:15.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:24:05, diff=10.613855s, valid=True
2026-06-04T03:24:15.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:24:15.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:24:15.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:24:15.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:24:15.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:24:15.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:24:15.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:24:12, diff=3.617553s, valid=True
2026-06-04T03:24:15.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:24:15.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:24:15.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:24:15.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110452.618358s, valid=True
2026-06-04T03:24:15.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:24:15.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:24:15.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:24:15.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:24:15.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:24:15.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:24:15.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:24:15.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:24:15.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:24:15.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:24:15.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:24:15.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:24:15.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:24:15.938 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:24:16.141 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:24:16.482 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:24:16.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:24:16.583 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:24:16.584 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:24:16.778 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:24:16.778 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:24:46.808 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:24:46.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:24:46.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:24:47.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:24:47.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:24:47.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:24:47.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:24:47.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:24:47.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:24:47.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:24:47.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:24:47.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:24:47.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:24:49.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:24:49.811 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:24:49.812 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:24:49.812 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:24:49.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:24:49.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:24:49.836 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:24:49.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:24:49.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:24:49.836 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:24:49.836 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:24:49.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:24:49.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:24:49.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:24:50.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:24:50.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:24:50.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:24:50.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:24:50.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:24:50.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:24:50.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:24:50.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:24:50.119 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:24:50.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:24:41
2026-06-04T03:24:50.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87800, datetime.datetime(2026, 6, 4, 3, 24, 41), datetime.datetime(2026, 6, 4, 3, 24, 40), 'salt', 1.67, 100.54, None, 44.21, 116.55, -0.07, 820.74, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T03:24:50.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:24:50.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:24:50.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:24:40, diff=10.201496s, valid=True
2026-06-04T03:24:50.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:24:50.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:24:50.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:25:12, diff=-21.792915s, valid=True
2026-06-04T03:24:50.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:24:50.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:24:50.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:24:36, diff=14.220224s, valid=True
2026-06-04T03:24:50.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:24:50.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:24:50.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:24:50.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:24:50.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:24:50.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:24:50.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:25:12, diff=-21.774564s, valid=True
2026-06-04T03:24:50.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:24:50.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:24:50.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:24:50.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110487.226162s, valid=True
2026-06-04T03:24:50.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:24:50.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:24:50.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:24:50.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:24:50.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:24:50.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:24:50.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:24:50.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:24:50.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:24:50.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:24:50.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:24:50.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:24:50.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:24:50.612 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:24:50.818 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:24:51.157 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:24:51.259 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:24:51.259 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:24:51.259 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:24:51.454 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:24:51.455 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:25:21.462 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:25:21.462 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:25:21.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:25:21.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:25:21.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:25:21.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:25:21.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:25:21.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:25:21.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:25:21.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:25:21.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:25:21.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:25:21.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:25:24.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:25:24.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:25:24.279 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:25:24.279 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:25:24.288 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:25:24.300 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:25:24.300 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:25:24.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:25:24.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:25:24.300 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:25:24.300 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:25:24.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:25:24.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:25:24.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:25:24.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:25:24.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:25:24.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:25:24.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:25:24.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:25:24.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:25:24.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:25:24.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:25:24.564 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:25:24.634 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:25:11
2026-06-04T03:25:24.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87801, datetime.datetime(2026, 6, 4, 3, 25, 11), datetime.datetime(2026, 6, 4, 3, 25, 10), 'salt', 1.6, 100.44, None, 43.57, 134.66, -0.06, 820.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T03:25:24.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:25:24.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:25:24.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:25:10, diff=14.64164s, valid=True
2026-06-04T03:25:24.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:25:24.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:25:24.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:25:12, diff=12.644819s, valid=True
2026-06-04T03:25:24.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:25:24.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:25:24.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:25:06, diff=18.652366s, valid=True
2026-06-04T03:25:24.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:25:24.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:25:24.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:25:24.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:25:24.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:25:24.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:25:24.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:25:12, diff=12.655837s, valid=True
2026-06-04T03:25:24.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:25:24.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:25:24.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:25:24.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110521.656579s, valid=True
2026-06-04T03:25:24.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:25:24.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:25:24.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:25:24.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:25:24.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:25:24.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:25:24.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:25:24.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:25:24.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:25:24.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:25:24.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:25:24.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:25:24.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:25:24.976 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:25:25.181 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:25:25.521 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:25:25.623 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:25:25.623 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:25:25.623 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:25:25.709 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:25:25.709 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:25:55.728 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:25:55.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:25:55.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:25:56.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:25:56.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:25:56.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:25:56.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:25:56.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:25:56.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:25:56.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:25:56.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:25:56.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:25:56.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:25:58.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:25:58.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:25:58.820 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:25:58.820 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:25:58.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:25:58.844 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:25:58.845 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:25:58.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:25:58.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:25:58.845 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:25:58.845 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:25:58.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:25:58.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:25:58.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:25:59.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:25:59.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:25:59.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:25:59.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:25:59.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:25:59.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:25:59.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:25:59.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:25:59.253 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:25:59.327 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:25:41
2026-06-04T03:25:59.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87802, datetime.datetime(2026, 6, 4, 3, 25, 41), datetime.datetime(2026, 6, 4, 3, 25, 41), 'salt', 1.77, 100.58, None, 44.14, 134.38, -0.08, 820.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T03:25:59.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:25:59.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:25:59.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:25:41, diff=18.338688s, valid=True
2026-06-04T03:25:59.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:25:59.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:25:59.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:26:12, diff=-12.656162s, valid=True
2026-06-04T03:25:59.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:25:59.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:25:59.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:25:36, diff=23.356187s, valid=True
2026-06-04T03:25:59.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:25:59.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:25:59.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:25:59.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:25:59.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:25:59.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:25:59.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:26:12, diff=-12.638273s, valid=True
2026-06-04T03:25:59.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:25:59.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:25:59.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:25:59.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110556.362947s, valid=True
2026-06-04T03:25:59.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:25:59.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:25:59.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:25:59.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:25:59.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:25:59.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:25:59.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:25:59.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:25:59.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:25:59.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:25:59.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:25:59.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:25:59.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:25:59.762 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:25:59.981 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:26:00.334 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:26:00.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:26:00.436 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:26:00.436 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:26:00.628 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:26:00.628 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:26:30.654 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:26:30.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:26:30.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:26:30.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:26:30.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:26:31.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:26:31.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:26:31.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:26:31.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:26:31.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:26:31.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:26:31.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:26:31.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:26:33.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:26:33.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:26:33.929 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:26:33.930 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:26:33.941 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:26:33.954 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:26:33.954 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:26:33.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:26:33.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:26:33.956 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:26:33.956 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:26:33.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:26:34.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:26:34.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:26:34.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:26:34.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:26:34.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:26:34.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:26:34.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:26:34.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:26:34.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:26:34.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:26:34.289 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:26:34.364 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:26:12
2026-06-04T03:26:34.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87803, datetime.datetime(2026, 6, 4, 3, 26, 12), datetime.datetime(2026, 6, 4, 3, 26, 11), 'salt', 1.67, 100.51, None, 37.75, 120.94, -0.07, 820.62, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T03:26:34.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:26:34.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:26:34.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:26:11, diff=23.371377s, valid=True
2026-06-04T03:26:34.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:26:34.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:26:34.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:26:12, diff=22.374874s, valid=True
2026-06-04T03:26:34.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:26:34.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:26:34.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:26:06, diff=28.382934s, valid=True
2026-06-04T03:26:34.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:26:34.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:26:34.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:26:34.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:26:34.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:26:34.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:26:34.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:26:12, diff=22.386653s, valid=True
2026-06-04T03:26:34.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:26:34.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:26:34.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:26:34.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110591.387448s, valid=True
2026-06-04T03:26:34.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:26:34.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:26:34.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:26:34.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:26:34.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:26:34.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:26:34.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:26:34.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:26:34.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:26:34.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:26:34.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:26:34.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:26:34.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:26:34.708 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:26:34.934 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:26:35.286 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:26:35.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:26:35.388 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:26:35.388 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:26:35.578 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:26:35.578 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:27:05.585 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:27:05.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:27:05.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:27:05.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:27:05.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:27:06.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:27:06.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:27:06.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:27:06.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:27:06.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:27:06.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:27:06.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:27:06.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:27:08.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:27:08.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:27:08.884 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:27:08.884 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:27:08.895 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:27:08.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:27:08.908 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:27:08.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:27:08.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:27:08.909 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:27:08.909 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:27:08.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:27:09.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T03:27:09.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:27:09.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T03:27:09.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:27:09.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:27:09.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:27:09.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:27:09.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:27:09.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:27:09.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:27:09.314 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:27:09.392 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:26:42
2026-06-04T03:27:09.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87804, datetime.datetime(2026, 6, 4, 3, 26, 42), datetime.datetime(2026, 6, 4, 3, 26, 41), 'salt', 1.7, 100.48, None, 51.72, 129.16, -0.07, 820.8, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:27:09.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:27:09.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T03:27:09.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:26:41, diff=28.398598s, valid=True
2026-06-04T03:27:09.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:27:09.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:27:09.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:27:12, diff=-2.598524s, valid=True
2026-06-04T03:27:09.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:27:09.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T03:27:09.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:26:37, diff=32.408115s, valid=True
2026-06-04T03:27:09.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:27:09.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:27:09.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:27:09.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:27:09.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:27:09.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:27:09.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:27:12, diff=-2.588854s, valid=True
2026-06-04T03:27:09.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:27:09.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:27:09.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:27:09.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110626.411793s, valid=True
2026-06-04T03:27:09.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:27:09.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:27:09.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:27:09.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:27:09.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:27:09.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:27:09.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:27:09.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:27:09.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:27:09.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:27:09.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:27:09.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:27:09.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:27:09.725 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:27:09.959 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:27:10.315 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:27:10.418 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:27:10.418 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:27:10.419 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:27:10.679 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:27:10.679 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:27:40.709 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:27:40.709 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:27:40.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:27:40.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:27:40.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:27:41.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:27:41.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:27:41.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:27:41.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:27:41.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:27:41.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:27:41.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:27:41.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:27:43.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:27:43.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:27:43.667 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:27:43.667 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:27:43.677 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:27:43.689 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:27:43.690 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:27:43.691 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:27:43.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:27:43.692 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:27:43.692 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:27:43.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:27:43.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:27:43.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:27:43.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:27:43.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:27:43.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:27:43.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:27:44.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:27:44.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:27:44.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:27:44.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:27:44.017 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:27:44.097 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:27:42
2026-06-04T03:27:44.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87806, datetime.datetime(2026, 6, 4, 3, 27, 42), datetime.datetime(2026, 6, 4, 3, 27, 42), 'salt', 1.67, 100.61, None, 49.4, 121.69, -0.08, 820.93, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:27:44.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:27:44.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:27:44.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:27:42, diff=2.105076s, valid=True
2026-06-04T03:27:44.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:27:44.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:27:44.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:28:12, diff=-27.891445s, valid=True
2026-06-04T03:27:44.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:27:44.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:27:44.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:27:37, diff=7.116593s, valid=True
2026-06-04T03:27:44.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:27:44.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:27:44.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:27:44.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:27:44.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:27:44.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:27:44.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:28:12, diff=-27.879707s, valid=True
2026-06-04T03:27:44.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:27:44.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:27:44.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:27:44.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110661.121121s, valid=True
2026-06-04T03:27:44.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:27:44.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:27:44.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:27:44.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:27:44.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:27:44.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:27:44.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:27:44.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:27:44.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:27:44.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:27:44.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:27:44.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:27:44.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:27:44.444 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:27:44.672 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:27:45.019 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:27:45.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:27:45.121 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:27:45.121 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:27:45.312 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:27:45.312 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:28:15.339 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:28:15.339 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:28:15.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:28:15.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:28:15.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:28:16.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:28:16.120 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:28:16.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:28:16.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:28:16.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:28:16.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:28:16.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:28:16.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:28:18.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:28:18.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:28:18.932 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:28:18.932 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:28:18.943 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:28:18.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:28:18.957 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:28:18.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:28:18.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:28:18.958 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:28:18.958 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:28:18.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:28:19.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:28:19.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:28:19.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:28:19.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:28:19.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:28:19.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:28:19.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:28:19.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:28:19.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:28:19.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:28:19.307 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:28:19.387 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:28:13
2026-06-04T03:28:19.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87807, datetime.datetime(2026, 6, 4, 3, 28, 13), datetime.datetime(2026, 6, 4, 3, 28, 12), 'salt', 1.7, 100.51, None, 48.41, 124.65, -0.07, 820.74, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T03:28:19.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:28:19.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:28:19.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:28:12, diff=7.394665s, valid=True
2026-06-04T03:28:19.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:28:19.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:28:19.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:28:12, diff=7.39819s, valid=True
2026-06-04T03:28:19.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:28:19.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:28:19.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:28:07, diff=12.406463s, valid=True
2026-06-04T03:28:19.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:28:19.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:28:19.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:28:19.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:28:19.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:28:19.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:28:19.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:28:12, diff=7.410184s, valid=True
2026-06-04T03:28:19.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:28:19.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:28:19.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:28:19.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110696.411015s, valid=True
2026-06-04T03:28:19.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:28:19.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:28:19.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:28:19.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:28:19.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:28:19.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:28:19.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:28:19.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:28:19.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:28:19.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:28:19.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:28:19.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:28:19.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:28:19.737 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:28:19.968 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:28:20.323 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:28:20.425 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:28:20.426 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:28:20.426 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:28:20.579 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:28:20.579 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:28:50.590 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:28:50.591 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:28:50.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:28:50.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:28:50.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:28:50.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:28:50.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:28:51.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:28:51.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:28:51.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:28:51.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:28:51.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:28:51.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:28:53.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:28:53.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:28:53.822 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:28:53.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:28:53.832 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:28:53.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:28:53.846 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:28:53.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:28:53.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:28:53.847 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:28:53.847 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:28:53.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:28:53.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:28:53.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:28:54.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:28:54.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:28:54.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:28:54.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:28:54.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:28:54.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:28:54.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:28:54.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:28:54.196 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:28:54.278 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:28:43
2026-06-04T03:28:54.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87808, datetime.datetime(2026, 6, 4, 3, 28, 43), datetime.datetime(2026, 6, 4, 3, 28, 42), 'salt', 1.67, 100.54, None, 44.95, 114.64, -0.07, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:28:54.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:28:54.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:28:54.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:28:42, diff=12.285474s, valid=True
2026-06-04T03:28:54.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:28:54.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:28:54.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:29:12, diff=-17.710953s, valid=True
2026-06-04T03:28:54.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:28:54.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:28:54.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:28:38, diff=16.297274s, valid=True
2026-06-04T03:28:54.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:28:54.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:28:54.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:28:54.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:28:54.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:28:54.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:28:54.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:29:12, diff=-17.698922s, valid=True
2026-06-04T03:28:54.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:28:54.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:28:54.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:28:54.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110731.301912s, valid=True
2026-06-04T03:28:54.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:28:54.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:28:54.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:28:54.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:28:54.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:28:54.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:28:54.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:28:54.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:28:54.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:28:54.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:28:54.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:28:54.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:28:54.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:28:54.626 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:28:54.905 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:28:55.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:28:55.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:28:55.361 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:28:55.361 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:28:55.573 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:28:55.573 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:29:25.598 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:29:25.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:29:25.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:29:25.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:29:25.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:29:26.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:29:26.147 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:29:26.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:29:26.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:29:26.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:29:26.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:29:26.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:29:26.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:29:28.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:29:28.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:29:28.564 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:29:28.564 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:29:28.574 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:29:28.587 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:29:28.588 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:29:28.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:29:28.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:29:28.589 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:29:28.589 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:29:28.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:29:28.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:29:28.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:29:28.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:29:28.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:29:28.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:29:28.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:29:28.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:29:28.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:29:28.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:29:28.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:29:28.951 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:29:29.025 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:29:13
2026-06-04T03:29:29.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87809, datetime.datetime(2026, 6, 4, 3, 29, 13), datetime.datetime(2026, 6, 4, 3, 29, 12), 'salt', 1.63, 100.48, None, 50.31, 123.17, -0.07, 820.99, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T03:29:29.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:29:29.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:29:29.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:29:12, diff=17.033045s, valid=True
2026-06-04T03:29:29.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:29:29.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:29:29.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:29:12, diff=17.036661s, valid=True
2026-06-04T03:29:29.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:29:29.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:29:29.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:29:08, diff=21.045247s, valid=True
2026-06-04T03:29:29.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:29:29.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:29:29.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:29:29.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:29:29.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:29:29.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:29:29.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:29:12, diff=17.049136s, valid=True
2026-06-04T03:29:29.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:29:29.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:29:29.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:29:29.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110766.049996s, valid=True
2026-06-04T03:29:29.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:29:29.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:29:29.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:29:29.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:29:29.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:29:29.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:29:29.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:29:29.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:29:29.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:29:29.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:29:29.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:29:29.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:29:29.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:29:29.371 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:29:29.605 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:29:29.962 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:29:30.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:29:30.070 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:29:30.070 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:29:30.315 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:29:30.315 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:30:00.331 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:30:00.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:30:00.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:30:00.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:30:00.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:30:00.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:30:00.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:30:00.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:30:00.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:30:00.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:30:00.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:30:00.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:30:00.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:30:03.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:30:03.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:30:03.142 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:30:03.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:30:03.153 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:30:03.165 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:30:03.166 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:30:03.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:30:03.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:30:03.167 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:30:03.167 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:30:03.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:30:03.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:30:03.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:30:03.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:30:03.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:30:03.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:30:03.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:30:03.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:30:03.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:30:03.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:30:03.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:30:03.477 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:30:03.550 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:29:43
2026-06-04T03:30:03.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87810, datetime.datetime(2026, 6, 4, 3, 29, 43), datetime.datetime(2026, 6, 4, 3, 29, 43), 'salt', 1.7, 100.58, None, 49.04, 130.92, -0.08, 820.8, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T03:30:03.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:30:03.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:30:03.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:29:43, diff=20.563865s, valid=True
2026-06-04T03:30:03.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:30:03.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:30:03.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:30:12, diff=-8.429444s, valid=True
2026-06-04T03:30:03.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:30:03.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:30:03.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:29:38, diff=25.586592s, valid=True
2026-06-04T03:30:03.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:30:03.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:30:03.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:30:03.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:30:03.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:30:03.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:30:03.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:30:12, diff=-8.406492s, valid=True
2026-06-04T03:30:03.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:30:03.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:30:03.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:30:03.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110800.594868s, valid=True
2026-06-04T03:30:03.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:30:03.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:30:03.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:30:03.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:30:03.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:30:03.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:30:03.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:30:03.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:30:03.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:30:03.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:30:03.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:30:03.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:30:03.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:30:03.996 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:30:04.218 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:30:04.575 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:30:04.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:30:04.679 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:30:04.679 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:30:04.759 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:30:04.759 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:30:34.786 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:30:34.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:30:34.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:30:35.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:30:35.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:30:35.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:30:35.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:30:35.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:30:35.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:30:35.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:30:35.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:30:35.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:30:35.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:30:38.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:30:38.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:30:38.108 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:30:38.108 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:30:38.117 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:30:38.128 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:30:38.129 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:30:38.129 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:30:38.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:30:38.129 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:30:38.129 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:30:38.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:30:38.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:30:38.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:30:38.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:30:38.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:30:38.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:30:38.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:30:38.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:30:38.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:30:38.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:30:38.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:30:38.426 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:30:38.506 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:30:14
2026-06-04T03:30:38.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87811, datetime.datetime(2026, 6, 4, 3, 30, 14), datetime.datetime(2026, 6, 4, 3, 30, 13), 'salt', 1.6, 100.48, None, 35.81, 120.07, -0.07, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:30:38.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:30:38.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:30:38.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:30:13, diff=25.513466s, valid=True
2026-06-04T03:30:38.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:30:38.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:30:38.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:30:12, diff=26.516986s, valid=True
2026-06-04T03:30:38.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:30:38.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:30:38.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:30:08, diff=30.524969s, valid=True
2026-06-04T03:30:38.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:30:38.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:30:38.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:30:38.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:30:38.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:30:38.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:30:38.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:30:12, diff=26.528588s, valid=True
2026-06-04T03:30:38.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:30:38.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:30:38.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:30:38.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110835.529386s, valid=True
2026-06-04T03:30:38.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:30:38.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:30:38.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:30:38.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:30:38.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:30:38.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:30:38.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:30:38.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:30:38.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:30:38.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:30:38.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:30:38.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:30:38.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:30:38.850 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:30:39.067 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:30:39.415 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:30:39.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:30:39.521 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:30:39.521 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:30:39.707 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:30:39.707 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:31:09.738 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:31:09.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:31:09.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:31:09.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:31:09.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:31:10.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:31:10.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:31:10.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:31:10.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:31:10.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:31:10.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:31:10.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:31:10.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:31:12.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:31:12.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:31:12.674 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:31:12.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:31:12.685 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:31:12.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:31:12.698 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:31:12.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:31:12.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:31:12.699 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:31:12.699 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:31:12.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:31:12.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T03:31:12.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:31:12.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T03:31:12.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:31:13.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:31:13.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:31:13.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:31:13.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:31:13.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:31:13.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:31:13.049 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:31:13.123 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:30:44
2026-06-04T03:31:13.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87812, datetime.datetime(2026, 6, 4, 3, 30, 44), datetime.datetime(2026, 6, 4, 3, 30, 43), 'salt', 1.7, 100.48, None, 40.65, 119.48, -0.07, 820.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T03:31:13.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:31:13.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T03:31:13.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:30:43, diff=30.13094s, valid=True
2026-06-04T03:31:13.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:31:13.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:31:13.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:31:12, diff=1.134396s, valid=True
2026-06-04T03:31:13.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:31:13.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T03:31:13.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:30:38, diff=35.14248s, valid=True
2026-06-04T03:31:13.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:31:13.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:31:13.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:31:13.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:31:13.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:31:13.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:31:13.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:31:12, diff=1.146198s, valid=True
2026-06-04T03:31:13.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:31:13.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:31:13.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:31:13.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110870.147015s, valid=True
2026-06-04T03:31:13.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:31:13.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:31:13.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:31:13.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:31:13.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:31:13.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:31:13.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:31:13.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:31:13.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:31:13.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:31:13.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:31:13.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:31:13.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:31:13.537 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:31:13.750 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:31:14.099 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:31:14.203 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:31:14.203 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:31:14.203 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:31:14.384 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:31:14.384 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:31:44.397 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:31:44.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:31:44.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:31:44.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:31:44.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:31:44.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:31:44.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:31:44.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:31:44.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:31:44.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:31:44.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:31:44.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:31:44.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:31:47.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:31:47.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:31:47.388 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:31:47.388 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:31:47.398 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:31:47.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:31:47.411 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:31:47.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:31:47.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:31:47.412 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:31:47.412 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:31:47.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:31:47.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:31:47.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:31:47.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:31:47.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:31:47.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:31:47.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:31:47.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:31:47.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:31:47.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:31:47.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:31:47.751 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:31:47.832 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:31:44
2026-06-04T03:31:47.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87814, datetime.datetime(2026, 6, 4, 3, 31, 44), datetime.datetime(2026, 6, 4, 3, 31, 44), 'salt', 1.6, 100.44, None, 43.86, 119.93, -0.06, 820.99, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T03:31:47.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:31:47.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:31:47.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:31:44, diff=3.8401s, valid=True
2026-06-04T03:31:47.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:31:47.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:31:47.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:32:12, diff=-24.156415s, valid=True
2026-06-04T03:31:47.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:31:47.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:31:47.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:31:39, diff=8.851859s, valid=True
2026-06-04T03:31:47.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:31:47.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:31:47.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:31:47.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:31:47.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:31:47.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:31:47.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:32:12, diff=-24.144413s, valid=True
2026-06-04T03:31:47.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:31:47.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:31:47.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:31:47.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110904.856401s, valid=True
2026-06-04T03:31:47.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:31:47.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:31:47.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:31:47.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:31:47.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:31:47.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:31:47.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:31:47.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:31:47.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:31:47.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:31:48.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:31:48.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:31:48.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:31:48.184 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:31:48.398 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:31:48.745 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:31:48.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:31:48.847 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:31:48.847 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:31:49.003 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:31:49.003 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:32:19.034 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:32:19.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:32:19.034 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:32:19.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:32:19.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:32:19.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:32:19.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:32:19.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:32:19.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:32:19.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:32:19.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:32:19.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:32:19.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:32:22.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:32:22.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:32:22.011 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:32:22.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:32:22.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:32:22.038 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:32:22.039 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:32:22.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:32:22.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:32:22.040 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:32:22.040 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:32:22.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:32:22.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:32:22.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:32:22.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:32:22.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:32:22.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:32:22.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:32:22.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:32:22.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:32:22.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:32:22.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:32:22.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:32:22.464 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:32:15
2026-06-04T03:32:22.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87815, datetime.datetime(2026, 6, 4, 3, 32, 15), datetime.datetime(2026, 6, 4, 3, 32, 14), 'salt', 1.67, 100.44, None, 45.41, 127.68, -0.06, 820.93, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:32:22.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:32:22.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:32:22.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:32:14, diff=8.471937s, valid=True
2026-06-04T03:32:22.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:32:22.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:32:22.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:32:12, diff=10.475407s, valid=True
2026-06-04T03:32:22.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:32:22.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:32:22.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:32:11, diff=11.493172s, valid=True
2026-06-04T03:32:22.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:32:22.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:32:22.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:32:22.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:32:22.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:32:22.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:32:22.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:32:12, diff=10.501373s, valid=True
2026-06-04T03:32:22.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:32:22.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:32:22.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:32:22.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110939.502282s, valid=True
2026-06-04T03:32:22.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:32:22.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:32:22.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:32:22.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:32:22.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:32:22.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:32:22.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:32:22.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:32:22.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:32:22.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:32:22.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:32:22.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:32:22.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:32:22.892 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:32:23.108 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:32:23.455 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:32:23.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:32:23.557 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:32:23.557 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:32:23.737 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:32:23.737 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:32:53.746 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:32:53.746 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:32:53.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:32:54.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:32:54.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:32:54.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:32:54.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:32:54.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:32:54.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:32:54.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:32:54.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:32:54.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:32:54.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:32:56.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:32:56.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:32:56.713 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:32:56.713 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:32:56.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:32:56.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:32:56.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:32:56.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:32:56.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:32:56.738 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:32:56.738 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:32:56.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:32:56.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:32:56.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:32:56.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:32:56.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:32:57.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:32:57.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:32:57.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:32:57.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:32:57.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:32:57.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:32:57.072 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:32:57.144 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:32:45
2026-06-04T03:32:57.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87816, datetime.datetime(2026, 6, 4, 3, 32, 45), datetime.datetime(2026, 6, 4, 3, 32, 44), 'salt', 1.63, 100.54, None, 44.21, 122.8, -0.08, 820.93, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T03:32:57.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:32:57.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:32:57.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:32:44, diff=13.152174s, valid=True
2026-06-04T03:32:57.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:32:57.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:32:57.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:33:12, diff=-14.8444s, valid=True
2026-06-04T03:32:57.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:32:57.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:32:57.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:32:40, diff=17.163478s, valid=True
2026-06-04T03:32:57.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:32:57.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:32:57.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:32:57.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:32:57.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:32:57.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:32:57.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:33:12, diff=-14.832864s, valid=True
2026-06-04T03:32:57.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:32:57.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:32:57.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:32:57.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=110974.167935s, valid=True
2026-06-04T03:32:57.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:32:57.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:32:57.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:32:57.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:32:57.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:32:57.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:32:57.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:32:57.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:32:57.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:32:57.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:32:57.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:32:57.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:32:57.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:32:57.493 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:32:57.706 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:32:58.054 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:32:58.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:32:58.158 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:32:58.158 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:32:58.345 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:32:58.346 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:33:28.349 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:33:28.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:33:28.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:33:28.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:33:28.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:33:29.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:33:29.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:33:29.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:33:29.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:33:29.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:33:29.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:33:29.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:33:29.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:33:31.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:33:31.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:33:31.433 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:33:31.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:33:31.445 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:33:31.457 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:33:31.458 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:33:31.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:33:31.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:33:31.459 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:33:31.459 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:33:31.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:33:31.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:33:31.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:33:31.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:33:31.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:33:31.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:33:31.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:33:31.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:33:31.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:33:31.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:33:31.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:33:31.785 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:33:31.859 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:33:15
2026-06-04T03:33:31.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87817, datetime.datetime(2026, 6, 4, 3, 33, 15), datetime.datetime(2026, 6, 4, 3, 33, 14), 'salt', 1.7, 100.51, None, 46.04, 136.09, -0.07, 820.86, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:33:31.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:33:31.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:33:31.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:33:14, diff=17.866981s, valid=True
2026-06-04T03:33:31.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:33:31.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:33:31.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:33:12, diff=19.870489s, valid=True
2026-06-04T03:33:31.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:33:31.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:33:31.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:33:10, diff=21.878726s, valid=True
2026-06-04T03:33:31.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:33:31.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:33:31.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:33:31.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:33:31.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:33:31.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:33:31.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:33:12, diff=19.882451s, valid=True
2026-06-04T03:33:31.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:33:31.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:33:31.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:33:31.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111008.883273s, valid=True
2026-06-04T03:33:31.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:33:31.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:33:31.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:33:31.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:33:31.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:33:31.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:33:31.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:33:31.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:33:31.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:33:32.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:33:32.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:33:32.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:33:32.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:33:32.203 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:33:32.422 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:33:32.769 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:33:32.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:33:32.872 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:33:32.872 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:33:33.098 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:33:33.098 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:34:03.129 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:34:03.129 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:34:03.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:34:03.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:34:03.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:34:03.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:34:03.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:34:03.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:34:03.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:34:03.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:34:03.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:34:03.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:34:03.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:34:05.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:34:05.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:34:05.876 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:34:05.876 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:34:05.887 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:34:05.900 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:34:05.901 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:34:05.901 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:34:05.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:34:05.902 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:34:05.902 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:34:05.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:34:06.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:34:06.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:34:06.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:34:06.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:34:06.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:34:06.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:34:06.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:34:06.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:34:06.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:34:06.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:34:06.239 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:34:06.312 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:33:45
2026-06-04T03:34:06.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87818, datetime.datetime(2026, 6, 4, 3, 33, 45), datetime.datetime(2026, 6, 4, 3, 33, 45), 'salt', 1.7, 100.51, None, 41.63, 125.15, -0.07, 820.8, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T03:34:06.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:34:06.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:34:06.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:33:45, diff=21.320163s, valid=True
2026-06-04T03:34:06.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:34:06.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:34:06.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:34:12, diff=-5.676248s, valid=True
2026-06-04T03:34:06.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:34:06.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:34:06.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:33:40, diff=26.331874s, valid=True
2026-06-04T03:34:06.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:34:06.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:34:06.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:34:06.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:34:06.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:34:06.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:34:06.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:34:12, diff=-5.664345s, valid=True
2026-06-04T03:34:06.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:34:06.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:34:06.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:34:06.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111043.336486s, valid=True
2026-06-04T03:34:06.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:34:06.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:34:06.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:34:06.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:34:06.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:34:06.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:34:06.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:34:06.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:34:06.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:34:06.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:34:06.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:34:06.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:34:06.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:34:06.661 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:34:06.937 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:34:07.281 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:34:07.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:34:07.384 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:34:07.384 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:34:07.604 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:34:07.604 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:34:37.614 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:34:37.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:34:37.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:34:38.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:34:38.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:34:38.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:34:38.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:34:38.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:34:38.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:34:38.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:34:38.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:34:38.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:34:38.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:34:40.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:34:40.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:34:40.719 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:34:40.719 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:34:40.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:34:40.739 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:34:40.740 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:34:40.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:34:40.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:34:40.740 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:34:40.740 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:34:40.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:34:40.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:34:40.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:34:40.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:34:40.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:34:40.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:34:40.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:34:41.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:34:41.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:34:41.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:34:41.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:34:41.020 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:34:41.089 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:34:16
2026-06-04T03:34:41.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87819, datetime.datetime(2026, 6, 4, 3, 34, 16), datetime.datetime(2026, 6, 4, 3, 34, 15), 'salt', 1.7, 100.51, None, 45.13, 128.2, -0.07, 820.99, 'DRY', 0, None, 0, 2, 1, 2)]
2026-06-04T03:34:41.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:34:41.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:34:41.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:34:15, diff=26.096975s, valid=True
2026-06-04T03:34:41.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:34:41.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:34:41.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:34:12, diff=29.100238s, valid=True
2026-06-04T03:34:41.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:34:41.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:34:41.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:34:11, diff=30.108008s, valid=True
2026-06-04T03:34:41.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:34:41.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:34:41.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:34:41.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:34:41.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:34:41.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:34:41.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:34:12, diff=29.111549s, valid=True
2026-06-04T03:34:41.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:34:41.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:34:41.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:34:41.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111078.11232s, valid=True
2026-06-04T03:34:41.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:34:41.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:34:41.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:34:41.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:34:41.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:34:41.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:34:41.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:34:41.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:34:41.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:34:41.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:34:41.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:34:41.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:34:41.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:34:41.432 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:34:41.645 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:34:41.989 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:34:42.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:34:42.091 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:34:42.091 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:34:42.251 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:34:42.252 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:35:12.282 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:35:12.282 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:35:12.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:35:12.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:35:12.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:35:12.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:35:12.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:35:12.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:35:12.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:35:12.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:35:12.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:35:12.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:35:12.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:35:15.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:35:15.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:35:15.223 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:35:15.223 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:35:15.233 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:35:15.246 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:35:15.247 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:35:15.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:35:15.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:35:15.248 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:35:15.248 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:35:15.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:35:15.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T03:35:15.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:35:15.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T03:35:15.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:35:15.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:35:15.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:35:15.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:35:15.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:35:15.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:35:15.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:35:15.585 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:35:15.656 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:34:46
2026-06-04T03:35:15.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87820, datetime.datetime(2026, 6, 4, 3, 34, 46), datetime.datetime(2026, 6, 4, 3, 34, 46), 'salt', 1.63, 100.48, None, 36.66, 122.68, -0.07, 821.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:35:15.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:35:15.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T03:35:15.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:34:46, diff=29.662972s, valid=True
2026-06-04T03:35:15.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:35:15.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:35:15.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:35:12, diff=3.665882s, valid=True
2026-06-04T03:35:15.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:35:15.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T03:35:15.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:34:41, diff=34.67256s, valid=True
2026-06-04T03:35:15.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:35:15.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:35:15.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:35:15.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:35:15.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:35:15.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:35:15.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:35:12, diff=3.675696s, valid=True
2026-06-04T03:35:15.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:35:15.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:35:15.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:35:15.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111112.676348s, valid=True
2026-06-04T03:35:15.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:35:15.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:35:15.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:35:15.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:35:15.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:35:15.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:35:15.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:35:15.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:35:15.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:35:15.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:35:15.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:35:15.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:35:15.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:35:16.064 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:35:16.277 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:35:16.624 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:35:16.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:35:16.726 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:35:16.726 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:35:16.809 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:35:16.809 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:35:46.812 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:35:46.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:35:46.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:35:47.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:35:47.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:35:47.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:35:47.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:35:47.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:35:47.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:35:47.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:35:47.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:35:47.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:35:47.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:35:50.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:35:50.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:35:50.004 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:35:50.004 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:35:50.013 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:35:50.025 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:35:50.025 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:35:50.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:35:50.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:35:50.026 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:35:50.026 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:35:50.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:35:50.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:35:50.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:35:50.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:35:50.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:35:50.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:35:50.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:35:50.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:35:50.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:35:50.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:35:50.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:35:50.299 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:35:50.370 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:35:47
2026-06-04T03:35:50.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87822, datetime.datetime(2026, 6, 4, 3, 35, 47), datetime.datetime(2026, 6, 4, 3, 35, 46), 'salt', 1.77, 100.58, None, 39.02, 126.13, -0.08, 821.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:35:50.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:35:50.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:35:50.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:35:46, diff=4.376682s, valid=True
2026-06-04T03:35:50.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:35:50.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:35:50.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:36:12, diff=-21.620274s, valid=True
2026-06-04T03:35:50.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:35:50.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:35:50.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:35:42, diff=8.386948s, valid=True
2026-06-04T03:35:50.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:35:50.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:35:50.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:35:50.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:35:50.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:35:50.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:35:50.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:36:12, diff=-21.609788s, valid=True
2026-06-04T03:35:50.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:35:50.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:35:50.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:35:50.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111147.390929s, valid=True
2026-06-04T03:35:50.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:35:50.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:35:50.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:35:50.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:35:50.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:35:50.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:35:50.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:35:50.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:35:50.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:35:50.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:35:50.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:35:50.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:35:50.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:35:50.713 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:35:50.928 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:35:51.284 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:35:51.386 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:35:51.387 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:35:51.387 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:35:51.539 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:35:51.539 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:36:21.555 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:36:21.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:36:21.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:36:21.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:36:21.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:36:22.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:36:22.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:36:22.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:36:22.144 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:36:22.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:36:22.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:36:22.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:36:22.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:36:24.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:36:24.644 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:36:24.644 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:36:24.644 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:36:24.654 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:36:24.665 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:36:24.666 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:36:24.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:36:24.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:36:24.666 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:36:24.666 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:36:24.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:36:24.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:36:24.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:36:24.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:36:24.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:36:24.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:36:24.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:36:24.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T03:36:24.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:36:24.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:36:24.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:36:24.949 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:36:25.019 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:36:17
2026-06-04T03:36:25.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87823, datetime.datetime(2026, 6, 4, 3, 36, 17), datetime.datetime(2026, 6, 4, 3, 36, 16), 'salt', 1.77, 100.58, None, 42.45, 125.0, -0.08, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:36:25.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:36:25.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:36:25.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:36:16, diff=9.026391s, valid=True
2026-06-04T03:36:25.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:36:25.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:36:25.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:36:12, diff=13.029636s, valid=True
2026-06-04T03:36:25.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:36:25.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:36:25.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:36:12, diff=13.037136s, valid=True
2026-06-04T03:36:25.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:36:25.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:36:25.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:36:25.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:36:25.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:36:25.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T03:36:25.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:36:12, diff=13.0406s, valid=True
2026-06-04T03:36:25.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:36:25.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:36:25.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:36:25.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111182.041359s, valid=True
2026-06-04T03:36:25.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:36:25.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:36:25.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:36:25.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:36:25.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:36:25.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:36:25.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:36:25.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:36:25.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:36:25.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:36:25.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:36:25.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:36:25.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:36:25.432 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:36:25.647 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:36:25.998 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:36:26.101 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:36:26.101 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:36:26.101 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:36:26.188 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:36:26.188 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:36:56.199 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:36:56.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:36:56.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:36:56.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:36:56.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:36:56.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:36:56.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:36:56.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:36:56.792 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:36:56.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:36:56.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:36:56.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:36:56.814 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:36:59.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:36:59.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:36:59.297 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:36:59.297 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:36:59.307 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:36:59.319 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:36:59.320 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:36:59.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:36:59.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:36:59.321 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:36:59.321 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:36:59.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:36:59.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:36:59.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:36:59.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:36:59.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:36:59.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:36:59.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:36:59.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:36:59.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:36:59.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:36:59.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:36:59.656 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:36:59.727 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:36:47
2026-06-04T03:36:59.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87824, datetime.datetime(2026, 6, 4, 3, 36, 47), datetime.datetime(2026, 6, 4, 3, 36, 47), 'salt', 1.7, 100.48, None, 39.13, 126.39, -0.07, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:36:59.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:36:59.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:36:59.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:36:47, diff=12.735179s, valid=True
2026-06-04T03:36:59.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:36:59.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:36:59.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:37:12, diff=-12.261327s, valid=True
2026-06-04T03:36:59.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:36:59.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:36:59.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:36:42, diff=17.746712s, valid=True
2026-06-04T03:36:59.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:36:59.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:36:59.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:36:59.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:36:59.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:36:59.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:36:59.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:37:12, diff=-12.249538s, valid=True
2026-06-04T03:36:59.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:36:59.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:36:59.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:36:59.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111216.751285s, valid=True
2026-06-04T03:36:59.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:36:59.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:36:59.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:36:59.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:36:59.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:36:59.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:36:59.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:36:59.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:36:59.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:36:59.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:36:59.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:36:59.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:37:00.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:37:00.090 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:37:00.308 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:37:00.658 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:37:00.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:37:00.760 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:37:00.760 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:37:00.977 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:37:00.977 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:37:30.994 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:37:30.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:37:30.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:37:31.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:37:31.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:37:31.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:37:31.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:37:31.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:37:31.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:37:31.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:37:31.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:37:31.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:37:31.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:37:34.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:37:34.339 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:37:34.340 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:37:34.340 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:37:34.351 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:37:34.364 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:37:34.364 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:37:34.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:37:34.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:37:34.365 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:37:34.366 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:37:34.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:37:34.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:37:34.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:37:34.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:37:34.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:37:34.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:37:34.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:37:34.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T03:37:34.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:37:34.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:37:34.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:37:34.695 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:37:34.768 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:37:18
2026-06-04T03:37:34.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87825, datetime.datetime(2026, 6, 4, 3, 37, 18), datetime.datetime(2026, 6, 4, 3, 37, 17), 'salt', 1.67, 100.54, None, 38.95, 128.11, -0.07, 821.11, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:37:34.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:37:34.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:37:34.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:37:17, diff=17.7753s, valid=True
2026-06-04T03:37:34.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:37:34.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:37:34.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:37:12, diff=22.778845s, valid=True
2026-06-04T03:37:34.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:37:34.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:37:34.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:37:12, diff=22.786943s, valid=True
2026-06-04T03:37:34.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:37:34.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:37:34.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:37:34.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:37:34.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:37:34.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T03:37:34.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:37:12, diff=22.790698s, valid=True
2026-06-04T03:37:34.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:37:34.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:37:34.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:37:34.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111251.791507s, valid=True
2026-06-04T03:37:34.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:37:34.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:37:34.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:37:34.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:37:34.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:37:34.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:37:34.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:37:34.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:37:34.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:37:35.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:37:35.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:37:35.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:37:35.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:37:35.185 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:37:35.392 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:37:35.731 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:37:35.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:37:35.834 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:37:35.834 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:37:35.987 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:37:35.988 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:38:06.018 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:38:06.018 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:38:06.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:38:06.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:38:06.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:38:06.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:38:06.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:38:06.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:38:06.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:38:06.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:38:06.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:38:06.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:38:06.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:38:09.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:38:09.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:38:09.017 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:38:09.017 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:38:09.027 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:38:09.040 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:38:09.040 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:38:09.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:38:09.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:38:09.042 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:38:09.042 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:38:09.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:38:09.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:38:09.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:38:09.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:38:09.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:38:09.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T03:38:09.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:38:09.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T03:38:09.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:38:09.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:38:09.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:38:09.382 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:38:09.458 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:37:48
2026-06-04T03:38:09.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87826, datetime.datetime(2026, 6, 4, 3, 37, 48), datetime.datetime(2026, 6, 4, 3, 37, 47), 'salt', 1.73, 100.51, None, 44.84, 120.07, -0.08, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:38:09.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:38:09.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:38:09.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:37:47, diff=22.465593s, valid=True
2026-06-04T03:38:09.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:38:09.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T03:38:09.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:38:12, diff=-2.53092s, valid=True
2026-06-04T03:38:09.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:38:09.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:38:09.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:37:44, diff=25.477172s, valid=True
2026-06-04T03:38:09.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:38:09.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:38:09.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:38:09.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:38:09.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:38:09.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T03:38:09.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:38:12, diff=-2.51908s, valid=True
2026-06-04T03:38:09.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:38:09.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:38:09.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:38:09.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111286.481751s, valid=True
2026-06-04T03:38:09.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:38:09.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:38:09.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:38:09.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:38:09.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:38:09.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:38:09.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:38:09.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:38:09.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:38:09.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:38:09.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:38:09.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:38:09.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:38:09.804 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:38:10.024 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:38:10.374 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:38:10.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:38:10.475 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:38:10.475 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:38:10.663 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:38:10.663 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:38:40.688 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:38:40.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:38:40.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:38:41.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:38:41.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:38:41.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:38:41.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:38:41.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:38:41.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:38:41.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:38:41.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:38:41.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:38:41.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:38:44.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:38:44.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:38:44.393 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:38:44.394 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:38:44.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:38:44.416 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:38:44.417 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:38:44.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:38:44.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:38:44.418 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:38:44.418 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:38:44.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:38:44.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:38:44.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:38:44.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:38:44.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:38:44.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T03:38:44.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:38:44.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T03:38:44.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:38:44.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:38:44.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:38:44.765 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:38:44.855 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:38:18
2026-06-04T03:38:44.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87827, datetime.datetime(2026, 6, 4, 3, 38, 18), datetime.datetime(2026, 6, 4, 3, 38, 17), 'salt', 1.77, 100.61, None, 37.19, 126.3, -0.08, 821.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:38:44.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:38:44.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:38:44.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:38:17, diff=27.863043s, valid=True
2026-06-04T03:38:44.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:38:44.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T03:38:44.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:38:12, diff=32.866532s, valid=True
2026-06-04T03:38:44.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:38:44.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:38:44.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:38:13, diff=31.874692s, valid=True
2026-06-04T03:38:44.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:38:44.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:38:44.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:38:44.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:38:44.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:38:44.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T03:38:44.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:38:12, diff=32.878442s, valid=True
2026-06-04T03:38:44.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:38:44.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:38:44.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:38:44.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111321.879275s, valid=True
2026-06-04T03:38:44.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:38:44.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:38:44.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:38:44.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:38:44.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:38:44.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:38:44.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:38:44.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:38:44.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:38:45.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:38:45.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:38:45.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:38:45.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:38:45.201 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:38:45.423 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:38:45.761 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:38:45.862 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:38:45.862 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:38:45.862 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:38:46.084 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:38:46.084 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:39:16.110 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:39:16.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:39:16.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:39:16.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:39:16.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:39:16.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:39:16.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:39:16.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:39:16.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:39:16.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:39:16.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:39:16.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:39:16.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:39:19.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:39:19.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:39:19.092 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:39:19.092 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:39:19.104 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:39:19.117 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:39:19.117 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:39:19.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:39:19.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:39:19.118 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:39:19.119 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:39:19.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:39:19.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:39:19.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:39:19.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:39:19.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:39:19.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:39:19.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:39:19.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:39:19.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:39:19.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:39:19.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:39:19.467 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:39:19.542 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:39:19
2026-06-04T03:39:19.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87829, datetime.datetime(2026, 6, 4, 3, 39, 19), datetime.datetime(2026, 6, 4, 3, 39, 18), 'salt', 1.67, 100.51, None, 35.88, 118.83, -0.07, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:39:19.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:39:19.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:39:19.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:39:18, diff=1.550129s, valid=True
2026-06-04T03:39:19.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:39:19.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:39:19.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:39:12, diff=7.553634s, valid=True
2026-06-04T03:39:19.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:39:19.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:39:19.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:39:13, diff=6.561749s, valid=True
2026-06-04T03:39:19.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:39:19.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:39:19.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:39:19.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:39:19.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:39:19.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:39:19.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:39:12, diff=7.565475s, valid=True
2026-06-04T03:39:19.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:39:19.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:39:19.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:39:19.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111356.566294s, valid=True
2026-06-04T03:39:19.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:39:19.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:39:19.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:39:19.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:39:19.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:39:19.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:39:19.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:39:19.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:39:19.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:39:19.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:39:19.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:39:19.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:39:19.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:39:19.890 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:39:20.110 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:39:20.507 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:39:20.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:39:20.607 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:39:20.607 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:39:20.796 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:39:20.796 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:39:50.827 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:39:50.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:39:50.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:39:50.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:39:50.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:39:51.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:39:51.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:39:51.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:39:51.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:39:51.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:39:51.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:39:51.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:39:51.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:39:53.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:39:53.667 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:39:53.668 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:39:53.668 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:39:53.678 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:39:53.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:39:53.698 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:39:53.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:39:53.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:39:53.699 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:39:53.700 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:39:53.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:39:53.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:39:53.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:39:53.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:39:53.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:39:53.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:39:53.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:39:54.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:39:54.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:39:54.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:39:54.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:39:54.037 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:39:54.121 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:39:49
2026-06-04T03:39:54.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87830, datetime.datetime(2026, 6, 4, 3, 39, 49), datetime.datetime(2026, 6, 4, 3, 39, 48), 'salt', 1.73, 100.54, None, 41.81, 127.38, -0.08, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:39:54.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:39:54.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:39:54.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:39:48, diff=6.128474s, valid=True
2026-06-04T03:39:54.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:39:54.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:39:54.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:40:12, diff=-17.868038s, valid=True
2026-06-04T03:39:54.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:39:54.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:39:54.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:39:43, diff=11.140028s, valid=True
2026-06-04T03:39:54.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:39:54.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:39:54.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:39:54.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:39:54.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:39:54.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:39:54.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:40:12, diff=-17.856246s, valid=True
2026-06-04T03:39:54.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:39:54.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:39:54.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:39:54.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111391.144562s, valid=True
2026-06-04T03:39:54.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:39:54.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:39:54.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:39:54.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:39:54.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:39:54.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:39:54.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:39:54.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:39:54.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:39:54.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:39:54.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:39:54.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:39:54.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:39:54.467 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:39:54.673 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:39:55.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:39:55.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:39:55.115 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:39:55.115 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:39:55.201 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:39:55.201 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:40:25.231 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:40:25.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:40:25.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:40:25.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:40:25.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:40:25.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:40:25.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:40:25.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:40:25.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:40:25.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:40:25.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:40:25.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:40:25.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:40:28.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:40:28.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:40:28.593 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:40:28.593 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:40:28.605 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:40:28.618 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:40:28.619 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:40:28.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:40:28.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:40:28.620 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:40:28.620 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:40:28.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:40:28.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:40:28.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:40:28.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:40:28.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:40:28.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:40:28.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:40:28.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:40:28.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:40:28.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:40:28.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:40:28.985 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:40:29.060 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:40:19
2026-06-04T03:40:29.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87831, datetime.datetime(2026, 6, 4, 3, 40, 19), datetime.datetime(2026, 6, 4, 3, 40, 18), 'salt', 1.7, 100.51, None, 44.67, 120.17, -0.07, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:40:29.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:40:29.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:40:29.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:40:18, diff=11.068013s, valid=True
2026-06-04T03:40:29.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:40:29.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:40:29.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:40:12, diff=17.07157s, valid=True
2026-06-04T03:40:29.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:40:29.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:40:29.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:40:14, diff=15.079705s, valid=True
2026-06-04T03:40:29.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:40:29.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:40:29.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:40:29.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:40:29.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:40:29.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:40:29.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:40:12, diff=17.083447s, valid=True
2026-06-04T03:40:29.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:40:29.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:40:29.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:40:29.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111426.084277s, valid=True
2026-06-04T03:40:29.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:40:29.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:40:29.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:40:29.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:40:29.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:40:29.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:40:29.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:40:29.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:40:29.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:40:29.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:40:29.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:40:29.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:40:29.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:40:29.405 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:40:29.681 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:40:30.044 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:40:30.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:40:30.149 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:40:30.149 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:40:30.334 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:40:30.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:41:00.346 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:41:00.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:41:00.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:41:00.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:41:00.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:41:00.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:41:00.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:41:00.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:41:00.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:41:00.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:41:00.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:41:00.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:41:00.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:41:03.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:41:03.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:41:03.753 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:41:03.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:41:03.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:41:03.778 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:41:03.779 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:41:03.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:41:03.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:41:03.780 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:41:03.780 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:41:03.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:41:03.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:41:03.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:41:04.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:41:04.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:41:04.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:41:04.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:41:04.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:41:04.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:41:04.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:41:04.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:41:04.121 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:41:04.195 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:40:49
2026-06-04T03:41:04.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87832, datetime.datetime(2026, 6, 4, 3, 40, 49), datetime.datetime(2026, 6, 4, 3, 40, 49), 'salt', 1.73, 100.54, None, 32.57, 116.9, -0.08, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:41:04.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:41:04.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:41:04.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:40:49, diff=15.202999s, valid=True
2026-06-04T03:41:04.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:41:04.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:41:04.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:41:12, diff=-7.79349s, valid=True
2026-06-04T03:41:04.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:41:04.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:41:04.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:40:44, diff=20.214602s, valid=True
2026-06-04T03:41:04.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:41:04.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:41:04.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:41:04.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:41:04.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:41:04.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:41:04.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:41:12, diff=-7.781647s, valid=True
2026-06-04T03:41:04.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:41:04.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:41:04.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:41:04.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111461.219171s, valid=True
2026-06-04T03:41:04.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:41:04.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:41:04.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:41:04.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:41:04.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:41:04.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:41:04.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:41:04.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:41:04.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:41:04.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:41:04.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:41:04.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:41:04.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:41:04.542 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:41:04.748 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:41:05.086 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:41:05.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:41:05.188 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:41:05.188 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:41:05.375 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:41:05.375 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:41:35.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:41:35.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:41:35.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:41:35.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:41:35.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:41:36.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:41:36.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:41:36.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:41:36.163 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:41:36.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:41:36.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:41:36.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:41:36.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:41:38.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:41:38.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:41:38.611 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:41:38.611 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:41:38.621 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:41:38.633 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:41:38.634 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:41:38.634 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:41:38.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:41:38.634 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:41:38.635 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:41:38.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:41:38.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:41:38.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:41:38.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:41:38.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:41:38.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:41:38.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:41:38.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:41:38.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:41:38.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:41:38.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:41:38.918 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:41:38.987 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:41:20
2026-06-04T03:41:38.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87833, datetime.datetime(2026, 6, 4, 3, 41, 20), datetime.datetime(2026, 6, 4, 3, 41, 19), 'salt', 1.8, 100.58, None, 36.69, 122.91, -0.08, 821.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:41:38.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:41:38.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:41:38.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:41:19, diff=19.993924s, valid=True
2026-06-04T03:41:38.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:41:38.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:41:38.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:41:12, diff=26.996845s, valid=True
2026-06-04T03:41:38.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:41:38.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:41:39.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:41:15, diff=24.00363s, valid=True
2026-06-04T03:41:39.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:41:39.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:41:39.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:41:39.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:41:39.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:41:39.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:41:39.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:41:12, diff=27.006653s, valid=True
2026-06-04T03:41:39.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:41:39.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:41:39.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:41:39.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111496.007294s, valid=True
2026-06-04T03:41:39.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:41:39.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:41:39.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:41:39.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:41:39.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:41:39.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:41:39.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:41:39.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:41:39.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:41:39.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:41:39.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:41:39.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:41:39.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:41:39.394 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:41:39.600 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:41:39.947 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:41:40.051 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:41:40.051 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:41:40.051 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:41:40.246 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:41:40.246 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:42:10.270 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:42:10.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:42:10.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:42:10.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:42:10.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:42:10.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:42:10.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:42:10.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:42:10.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:42:10.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:42:10.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:42:10.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:42:10.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:42:13.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:42:13.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:42:13.151 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:42:13.151 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:42:13.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:42:13.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:42:13.175 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:42:13.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:42:13.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:42:13.176 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:42:13.176 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:42:13.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:42:13.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:42:13.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:42:13.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:42:13.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:42:13.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:42:13.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:42:13.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:42:13.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:42:13.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:42:13.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:42:13.497 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:42:13.566 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:41:50
2026-06-04T03:42:13.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87834, datetime.datetime(2026, 6, 4, 3, 41, 50), datetime.datetime(2026, 6, 4, 3, 41, 49), 'salt', 1.83, 100.61, None, 36.38, 118.47, -0.09, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:42:13.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:42:13.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:42:13.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:41:49, diff=24.573677s, valid=True
2026-06-04T03:42:13.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:42:13.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:42:13.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:42:12, diff=1.577315s, valid=True
2026-06-04T03:42:13.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:42:13.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:42:13.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:41:45, diff=28.58532s, valid=True
2026-06-04T03:42:13.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:42:13.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:42:13.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:42:13.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:42:13.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:42:13.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:42:13.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:42:12, diff=1.588947s, valid=True
2026-06-04T03:42:13.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:42:13.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:42:13.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:42:13.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111530.589752s, valid=True
2026-06-04T03:42:13.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:42:13.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:42:13.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:42:13.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:42:13.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:42:13.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:42:13.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:42:13.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:42:13.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:42:13.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:42:13.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:42:13.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:42:13.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:42:13.910 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:42:14.117 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:42:14.461 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:42:14.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:42:14.564 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:42:14.564 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:42:14.958 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:42:14.958 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:42:44.989 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:42:44.989 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:42:44.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:42:45.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:42:45.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:42:45.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:42:45.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:42:45.601 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:42:45.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:42:45.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:42:45.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:42:45.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:42:45.619 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:42:48.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:42:48.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:42:48.183 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:42:48.184 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:42:48.193 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:42:48.206 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:42:48.206 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:42:48.207 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:42:48.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:42:48.207 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:42:48.208 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:42:48.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:42:48.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T03:42:48.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:42:48.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T03:42:48.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:42:48.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T03:42:48.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:42:48.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T03:42:48.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:42:48.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:42:48.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:42:48.611 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:42:48.682 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:42:20
2026-06-04T03:42:48.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87835, datetime.datetime(2026, 6, 4, 3, 42, 20), datetime.datetime(2026, 6, 4, 3, 42, 19), 'salt', 1.73, 100.51, None, 36.13, 127.8, -0.08, 821.11, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:42:48.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:42:48.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T03:42:48.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:42:19, diff=29.688183s, valid=True
2026-06-04T03:42:48.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:42:48.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T03:42:48.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:42:12, diff=36.690977s, valid=True
2026-06-04T03:42:48.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:42:48.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T03:42:48.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:42:15, diff=33.697762s, valid=True
2026-06-04T03:42:48.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:42:48.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:42:48.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:42:48.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:42:48.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:42:48.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T03:42:48.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:42:12, diff=36.700765s, valid=True
2026-06-04T03:42:48.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:42:48.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:42:48.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:42:48.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111565.701414s, valid=True
2026-06-04T03:42:48.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:42:48.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:42:48.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:42:48.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:42:48.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:42:48.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:42:48.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:42:48.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:42:48.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:42:48.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:42:48.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:42:48.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:42:48.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:42:49.014 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:42:49.220 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:42:49.558 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:42:49.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:42:49.659 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:42:49.659 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:42:49.845 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:42:49.846 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:43:19.875 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:43:19.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:43:19.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:43:20.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:43:20.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:43:20.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:43:20.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:43:20.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:43:20.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:43:20.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:43:20.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:43:20.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:43:20.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:43:22.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:43:22.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:43:22.726 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:43:22.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:43:22.738 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:43:22.751 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:43:22.752 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:43:22.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:43:22.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:43:22.753 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:43:22.753 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:43:22.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:43:22.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:43:22.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:43:22.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:43:22.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:43:23.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:43:23.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:43:23.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:43:23.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:43:23.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:43:23.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:43:23.087 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:43:23.158 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:43:21
2026-06-04T03:43:23.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87837, datetime.datetime(2026, 6, 4, 3, 43, 21), datetime.datetime(2026, 6, 4, 3, 43, 20), 'salt', 1.8, 100.58, None, 40.43, 127.1, -0.08, 821.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:43:23.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:43:23.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:43:23.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:43:20, diff=3.164174s, valid=True
2026-06-04T03:43:23.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:43:23.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:43:23.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:43:12, diff=11.167002s, valid=True
2026-06-04T03:43:23.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:43:23.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:43:23.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:43:16, diff=7.173616s, valid=True
2026-06-04T03:43:23.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:43:23.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:43:23.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:43:23.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:43:23.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:43:23.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:43:23.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:43:12, diff=11.176585s, valid=True
2026-06-04T03:43:23.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:43:23.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:43:23.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:43:23.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111600.177274s, valid=True
2026-06-04T03:43:23.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:43:23.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:43:23.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:43:23.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:43:23.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:43:23.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:43:23.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:43:23.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:43:23.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:43:23.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:43:23.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:43:23.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:43:23.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:43:23.491 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:43:23.696 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:43:24.032 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:43:24.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:43:24.189 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:43:24.189 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:43:24.434 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:43:24.435 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:43:54.465 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:43:54.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:43:54.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:43:54.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:43:54.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:43:55.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:43:55.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:43:55.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:43:55.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:43:55.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:43:55.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:43:55.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:43:55.169 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:43:57.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:43:57.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:43:57.583 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:43:57.583 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:43:57.593 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:43:57.611 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:43:57.612 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:43:57.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:43:57.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:43:57.613 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:43:57.613 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:43:57.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:43:57.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:43:57.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:43:57.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:43:57.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:43:57.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:43:57.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:43:57.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:43:57.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:43:57.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:43:57.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:43:57.943 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:43:58.015 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:43:51
2026-06-04T03:43:58.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87838, datetime.datetime(2026, 6, 4, 3, 43, 51), datetime.datetime(2026, 6, 4, 3, 43, 50), 'salt', 1.83, 100.58, None, 42.76, 130.41, -0.08, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:43:58.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:43:58.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:43:58.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:43:50, diff=8.022704s, valid=True
2026-06-04T03:43:58.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:43:58.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:43:58.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:44:12, diff=-13.973779s, valid=True
2026-06-04T03:43:58.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:43:58.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:43:58.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:43:47, diff=11.034442s, valid=True
2026-06-04T03:43:58.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:43:58.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:43:58.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:43:58.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:43:58.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:43:58.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:43:58.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:44:12, diff=-13.961759s, valid=True
2026-06-04T03:43:58.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:43:58.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:43:58.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:43:58.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111635.039083s, valid=True
2026-06-04T03:43:58.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:43:58.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:43:58.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:43:58.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:43:58.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:43:58.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:43:58.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:43:58.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:43:58.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:43:58.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:43:58.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:43:58.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:43:58.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:43:58.369 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:43:58.580 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:43:58.921 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:43:59.026 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:43:59.026 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:43:59.026 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:43:59.213 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:43:59.213 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:44:29.243 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:44:29.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:44:29.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:44:29.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:44:29.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:44:29.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:44:29.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:44:29.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:44:29.831 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:44:29.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:44:29.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:44:29.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:44:29.849 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:44:32.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:44:32.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:44:32.127 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:44:32.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:44:32.137 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:44:32.150 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:44:32.150 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:44:32.151 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:44:32.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:44:32.151 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:44:32.151 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:44:32.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:44:32.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:44:32.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:44:32.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:44:32.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:44:32.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:44:32.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:44:32.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:44:32.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:44:32.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:44:32.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:44:32.479 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:44:32.550 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:44:21
2026-06-04T03:44:32.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87839, datetime.datetime(2026, 6, 4, 3, 44, 21), datetime.datetime(2026, 6, 4, 3, 44, 20), 'salt', 1.87, 100.61, None, 45.94, 133.23, -0.08, 820.93, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T03:44:32.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:44:32.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:44:32.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:44:20, diff=12.55781s, valid=True
2026-06-04T03:44:32.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:44:32.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:44:32.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:44:12, diff=20.561281s, valid=True
2026-06-04T03:44:32.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:44:32.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:44:32.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:44:17, diff=15.56952s, valid=True
2026-06-04T03:44:32.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:44:32.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:44:32.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:44:32.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:44:32.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:44:32.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:44:32.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:44:12, diff=20.573216s, valid=True
2026-06-04T03:44:32.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:44:32.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:44:32.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:44:32.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111669.574022s, valid=True
2026-06-04T03:44:32.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:44:32.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:44:32.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:44:32.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:44:32.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:44:32.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:44:32.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:44:32.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:44:32.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:44:32.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:44:32.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:44:32.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:44:32.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:44:32.891 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:44:33.170 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:44:33.506 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:44:33.605 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:44:33.605 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:44:33.605 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:44:35.349 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:44:35.349 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:45:05.374 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:45:05.375 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:45:05.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:45:05.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:45:05.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:45:05.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:45:05.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:45:05.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:45:05.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:45:05.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:45:05.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:45:05.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:45:05.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:45:08.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:45:08.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:45:08.541 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:45:08.542 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:45:08.552 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:45:08.564 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:45:08.565 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:45:08.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:45:08.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:45:08.566 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:45:08.566 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:45:08.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:45:08.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:45:08.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:45:08.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:45:08.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:45:08.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:45:08.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:45:08.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:45:08.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:45:08.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:45:08.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:45:08.905 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:45:08.976 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:44:51
2026-06-04T03:45:08.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87840, datetime.datetime(2026, 6, 4, 3, 44, 51), datetime.datetime(2026, 6, 4, 3, 44, 51), 'salt', 1.8, 100.58, None, 45.06, 125.0, -0.08, 820.86, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T03:45:08.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:45:08.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:45:08.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:44:51, diff=17.984183s, valid=True
2026-06-04T03:45:08.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:45:08.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:45:08.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:45:12, diff=-3.012283s, valid=True
2026-06-04T03:45:08.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:45:08.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:45:08.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:44:47, diff=21.995842s, valid=True
2026-06-04T03:45:08.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:45:08.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:45:08.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:45:08.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:45:08.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:45:08.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:45:08.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:45:12, diff=-3.000445s, valid=True
2026-06-04T03:45:08.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:45:08.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:45:08.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:45:09.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111706.000482s, valid=True
2026-06-04T03:45:09.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:45:09.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:45:09.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:45:09.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:45:09.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:45:09.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:45:09.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:45:09.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:45:09.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:45:09.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:45:09.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:45:09.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:45:09.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:45:09.321 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:45:09.527 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:45:09.874 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:45:09.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:45:09.984 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:45:09.984 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:45:10.192 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:45:10.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:45:40.215 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:45:40.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:45:40.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:45:40.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:45:40.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:45:40.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:45:40.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:45:40.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:45:40.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:45:40.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:45:40.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:45:40.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:45:40.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:45:43.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:45:43.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:45:43.100 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:45:43.100 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:45:43.110 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:45:43.122 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:45:43.123 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:45:43.123 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:45:43.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:45:43.124 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:45:43.124 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:45:43.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:45:43.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:45:43.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:45:43.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:45:43.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:45:43.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:45:43.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:45:43.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:45:43.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:45:43.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:45:43.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:45:43.452 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:45:43.524 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:45:22
2026-06-04T03:45:43.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87841, datetime.datetime(2026, 6, 4, 3, 45, 22), datetime.datetime(2026, 6, 4, 3, 45, 21), 'salt', 1.73, 100.51, None, 43.93, 117.51, -0.08, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:45:43.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:45:43.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:45:43.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:45:21, diff=22.532147s, valid=True
2026-06-04T03:45:43.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:45:43.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:45:43.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:45:12, diff=31.535637s, valid=True
2026-06-04T03:45:43.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:45:43.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:45:43.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:45:18, diff=25.543718s, valid=True
2026-06-04T03:45:43.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:45:43.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:45:43.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:45:43.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:45:43.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:45:43.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:45:43.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:45:12, diff=31.547427s, valid=True
2026-06-04T03:45:43.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:45:43.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:45:43.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:45:43.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111740.548235s, valid=True
2026-06-04T03:45:43.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:45:43.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:45:43.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:45:43.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:45:43.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:45:43.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:45:43.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:45:43.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:45:43.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:45:43.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:45:43.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:45:43.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:45:43.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:45:43.942 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:45:44.149 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:45:44.490 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:45:44.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:45:44.590 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:45:44.590 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:45:44.803 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:45:44.804 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:46:14.834 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:46:14.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:46:14.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:46:15.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:46:15.147 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:46:15.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:46:15.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:46:15.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:46:15.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:46:15.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:46:15.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:46:15.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:46:15.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:46:17.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:46:17.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:46:17.844 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:46:17.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:46:17.855 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:46:17.868 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:46:17.868 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:46:17.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:46:17.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:46:17.869 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:46:17.870 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:46:17.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:46:18.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:46:18.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:46:18.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:46:18.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:46:18.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:46:18.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:46:18.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:46:18.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:46:18.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:46:18.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:46:18.202 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:46:18.276 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:45:52
2026-06-04T03:46:18.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87842, datetime.datetime(2026, 6, 4, 3, 45, 52), datetime.datetime(2026, 6, 4, 3, 45, 51), 'salt', 1.87, 100.61, None, 40.89, 128.65, -0.08, 821.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:46:18.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:46:18.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:46:18.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:45:51, diff=27.284122s, valid=True
2026-06-04T03:46:18.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:46:18.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:46:18.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:46:12, diff=6.287684s, valid=True
2026-06-04T03:46:18.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:46:18.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:46:18.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:45:48, diff=30.295826s, valid=True
2026-06-04T03:46:18.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:46:18.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:46:18.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:46:18.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:46:18.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:46:18.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:46:18.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:46:12, diff=6.299556s, valid=True
2026-06-04T03:46:18.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:46:18.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:46:18.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:46:18.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111775.300361s, valid=True
2026-06-04T03:46:18.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:46:18.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:46:18.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:46:18.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:46:18.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:46:18.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:46:18.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:46:18.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:46:18.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:46:18.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:46:18.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:46:18.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:46:18.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:46:18.621 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:46:18.835 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:46:19.173 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:46:19.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:46:19.274 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:46:19.274 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:46:19.482 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:46:19.482 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:46:49.496 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:46:49.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:46:49.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:46:49.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:46:49.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:46:50.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:46:50.169 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:46:50.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:46:50.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:46:50.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:46:50.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:46:50.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:46:50.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:46:52.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:46:52.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:46:52.680 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:46:52.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:46:52.689 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:46:52.702 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:46:52.702 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:46:52.703 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:46:52.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:46:52.704 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:46:52.704 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:46:52.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:46:52.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:46:52.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:46:52.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:46:52.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:46:53.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:46:53.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:46:53.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:46:53.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:46:53.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:46:53.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:46:53.058 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:46:53.131 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:46:52
2026-06-04T03:46:53.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87844, datetime.datetime(2026, 6, 4, 3, 46, 52), datetime.datetime(2026, 6, 4, 3, 46, 52), 'salt', 1.8, 100.51, None, 49.01, 128.27, -0.07, 820.8, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T03:46:53.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:46:53.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:46:53.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:46:52, diff=1.13759s, valid=True
2026-06-04T03:46:53.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:46:53.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:46:53.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:47:12, diff=-18.859429s, valid=True
2026-06-04T03:46:53.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:46:53.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:46:53.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:46:48, diff=5.147286s, valid=True
2026-06-04T03:46:53.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:46:53.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:46:53.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:46:53.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:46:53.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:46:53.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:46:53.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:47:12, diff=-18.849658s, valid=True
2026-06-04T03:46:53.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:46:53.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:46:53.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:46:53.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111810.151002s, valid=True
2026-06-04T03:46:53.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:46:53.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:46:53.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:46:53.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:46:53.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:46:53.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:46:53.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:46:53.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:46:53.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:46:53.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:46:53.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:46:53.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:46:53.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:46:53.466 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:46:53.672 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:46:54.011 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:46:54.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:46:54.114 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:46:54.114 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:46:54.324 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:46:54.324 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:47:24.328 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:47:24.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:47:24.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:47:24.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:47:24.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:47:24.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:47:24.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:47:24.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:47:24.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:47:24.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:47:24.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:47:24.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:47:24.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:47:27.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:47:27.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:47:27.391 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:47:27.391 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:47:27.401 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:47:27.415 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:47:27.415 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:47:27.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:47:27.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:47:27.416 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:47:27.417 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:47:27.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:47:27.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:47:27.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:47:27.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:47:27.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:47:27.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:47:27.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:47:27.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:47:27.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:47:27.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:47:27.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:47:27.760 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:47:27.832 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:47:23
2026-06-04T03:47:27.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87845, datetime.datetime(2026, 6, 4, 3, 47, 23), datetime.datetime(2026, 6, 4, 3, 47, 22), 'salt', 1.77, 100.54, None, 46.11, 128.04, -0.07, 820.86, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T03:47:27.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:47:27.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:47:27.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:47:22, diff=5.839335s, valid=True
2026-06-04T03:47:27.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:47:27.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:47:27.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:47:12, diff=15.842813s, valid=True
2026-06-04T03:47:27.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:47:27.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:47:27.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:47:19, diff=8.851012s, valid=True
2026-06-04T03:47:27.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:47:27.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:47:27.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:47:27.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:47:27.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:47:27.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:47:27.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:47:12, diff=15.854798s, valid=True
2026-06-04T03:47:27.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:47:27.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:47:27.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:47:27.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111844.855611s, valid=True
2026-06-04T03:47:27.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:47:27.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:47:27.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:47:27.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:47:27.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:47:27.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:47:27.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:47:27.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:47:27.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:47:27.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:47:28.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:47:28.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:47:28.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:47:28.178 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:47:28.385 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:47:28.781 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:47:28.882 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:47:28.882 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:47:28.882 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:47:29.150 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:47:29.150 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:47:59.159 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:47:59.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:47:59.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:47:59.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:47:59.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:47:59.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:47:59.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:47:59.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:47:59.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:47:59.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:47:59.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:47:59.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:47:59.768 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:48:02.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:48:02.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:48:02.233 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:48:02.234 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:48:02.243 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:48:02.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:48:02.256 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:48:02.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:48:02.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:48:02.258 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:48:02.258 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:48:02.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:48:02.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:48:02.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:48:02.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:48:02.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:48:02.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:48:02.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:48:02.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:48:02.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:48:02.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:48:02.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:48:02.608 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:48:02.682 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:47:53
2026-06-04T03:48:02.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87846, datetime.datetime(2026, 6, 4, 3, 47, 53), datetime.datetime(2026, 6, 4, 3, 47, 52), 'salt', 1.8, 100.61, None, 50.74, 122.84, -0.09, 820.93, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T03:48:02.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:48:02.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:48:02.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:47:52, diff=10.690457s, valid=True
2026-06-04T03:48:02.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:48:02.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:48:02.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:48:12, diff=-9.306024s, valid=True
2026-06-04T03:48:02.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:48:02.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:48:02.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:47:49, diff=13.702042s, valid=True
2026-06-04T03:48:02.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:48:02.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:48:02.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:48:02.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:48:02.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:48:02.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:48:02.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:48:12, diff=-9.294251s, valid=True
2026-06-04T03:48:02.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:48:02.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:48:02.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:48:02.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111879.706549s, valid=True
2026-06-04T03:48:02.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:48:02.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:48:02.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:48:02.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:48:02.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:48:02.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:48:02.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:48:02.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:48:02.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:48:02.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:48:02.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:48:02.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:48:02.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:48:03.026 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:48:03.231 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:48:03.566 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:48:03.667 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:48:03.667 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:48:03.667 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:48:03.874 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:48:03.874 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:48:33.904 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:48:33.905 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:48:33.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:48:34.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:48:34.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:48:34.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:48:34.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:48:34.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:48:34.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:48:34.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:48:34.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:48:34.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:48:34.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:48:37.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:48:37.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:48:37.044 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:48:37.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:48:37.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:48:37.066 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:48:37.067 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:48:37.068 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:48:37.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:48:37.068 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:48:37.068 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:48:37.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:48:37.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:48:37.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:48:37.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:48:37.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:48:37.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:48:37.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:48:37.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:48:37.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:48:37.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:48:37.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:48:37.412 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:48:37.483 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:48:23
2026-06-04T03:48:37.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87847, datetime.datetime(2026, 6, 4, 3, 48, 23), datetime.datetime(2026, 6, 4, 3, 48, 22), 'salt', 1.8, 100.58, None, 45.2, 125.36, -0.08, 821.05, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T03:48:37.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:48:37.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:48:37.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:48:22, diff=15.491329s, valid=True
2026-06-04T03:48:37.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:48:37.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:48:37.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:48:12, diff=25.494871s, valid=True
2026-06-04T03:48:37.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:48:37.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:48:37.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:48:19, diff=18.502925s, valid=True
2026-06-04T03:48:37.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:48:37.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:48:37.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:48:37.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:48:37.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:48:37.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:48:37.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:48:12, diff=25.506658s, valid=True
2026-06-04T03:48:37.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:48:37.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:48:37.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:48:37.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111914.507463s, valid=True
2026-06-04T03:48:37.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:48:37.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:48:37.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:48:37.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:48:37.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:48:37.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:48:37.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:48:37.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:48:37.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:48:37.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:48:37.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:48:37.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:48:37.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:48:37.906 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:48:38.116 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:48:38.463 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:48:38.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:48:38.586 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:48:38.586 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:48:38.707 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:48:38.707 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:49:08.737 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:49:08.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:49:08.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:49:09.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:49:09.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:49:09.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:49:09.485 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:49:09.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:49:09.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:49:09.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:49:09.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:49:09.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:49:09.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:49:11.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:49:11.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:49:11.915 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:49:11.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:49:11.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:49:11.938 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:49:11.939 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:49:11.939 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:49:11.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:49:11.940 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:49:11.940 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:49:11.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:49:12.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:49:12.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:49:12.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:49:12.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:49:12.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:49:12.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:49:12.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:49:12.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:49:12.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:49:12.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:49:12.288 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:49:12.359 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:48:53
2026-06-04T03:49:12.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87848, datetime.datetime(2026, 6, 4, 3, 48, 53), datetime.datetime(2026, 6, 4, 3, 48, 53), 'salt', 1.8, 100.54, None, 38.42, 123.62, -0.08, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:49:12.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:49:12.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:49:12.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:48:53, diff=19.366855s, valid=True
2026-06-04T03:49:12.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:49:12.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:49:12.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:49:12, diff=0.370474s, valid=True
2026-06-04T03:49:12.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:49:12.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:49:12.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:48:49, diff=23.378955s, valid=True
2026-06-04T03:49:12.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:49:12.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:49:12.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:49:12.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:49:12.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:49:12.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:49:12.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:49:12, diff=0.382838s, valid=True
2026-06-04T03:49:12.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:49:12.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:49:12.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:49:12.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111949.38369s, valid=True
2026-06-04T03:49:12.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:49:12.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:49:12.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:49:12.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:49:12.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:49:12.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:49:12.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:49:12.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:49:12.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:49:12.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:49:12.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:49:12.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:49:12.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:49:12.710 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:49:12.916 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:49:13.257 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:49:13.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:49:13.358 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:49:13.358 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:49:13.633 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:49:13.633 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:49:43.662 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:49:43.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:49:43.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:49:44.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:49:44.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:49:44.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:49:44.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:49:44.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:49:44.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:49:44.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:49:44.444 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:49:44.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:49:44.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:49:46.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:49:46.917 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:49:46.918 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:49:46.918 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:49:46.928 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:49:46.940 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:49:46.941 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:49:46.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:49:46.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:49:46.942 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:49:46.942 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:49:46.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:49:47.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:49:47.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:49:47.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:49:47.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:49:47.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:49:47.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:49:47.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:49:47.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:49:47.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:49:47.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:49:47.303 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:49:47.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:49:24
2026-06-04T03:49:47.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87849, datetime.datetime(2026, 6, 4, 3, 49, 24), datetime.datetime(2026, 6, 4, 3, 49, 23), 'salt', 1.87, 100.54, None, 44.92, 134.24, -0.07, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:49:47.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:49:47.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:49:47.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:49:23, diff=24.394096s, valid=True
2026-06-04T03:49:47.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:49:47.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:49:47.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:49:12, diff=35.397609s, valid=True
2026-06-04T03:49:47.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:49:47.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:49:47.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:49:20, diff=27.405787s, valid=True
2026-06-04T03:49:47.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:49:47.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:49:47.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:49:47.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:49:47.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:49:47.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:49:47.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:49:12, diff=35.409498s, valid=True
2026-06-04T03:49:47.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:49:47.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:49:47.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:49:47.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=111984.410311s, valid=True
2026-06-04T03:49:47.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:49:47.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:49:47.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:49:47.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:49:47.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:49:47.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:49:47.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:49:47.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:49:47.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:49:47.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:49:47.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:49:47.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:49:47.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:49:47.802 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:49:48.025 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:49:48.390 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:49:48.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:49:48.491 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:49:48.491 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:49:48.693 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:49:48.694 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:50:18.724 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:50:18.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:50:18.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:50:19.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:50:19.034 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:50:19.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:50:19.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:50:19.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:50:19.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:50:19.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:50:19.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:50:19.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:50:19.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:50:21.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:50:21.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:50:21.784 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:50:21.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:50:21.795 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:50:21.808 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:50:21.808 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:50:21.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:50:21.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:50:21.809 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:50:21.810 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:50:21.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:50:21.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T03:50:21.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:50:22.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T03:50:22.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:50:22.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:50:22.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:50:22.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:50:22.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:50:22.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:50:22.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:50:22.149 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:50:22.223 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:49:54
2026-06-04T03:50:22.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87850, datetime.datetime(2026, 6, 4, 3, 49, 54), datetime.datetime(2026, 6, 4, 3, 49, 53), 'salt', 1.8, 100.51, None, 45.97, 121.13, -0.07, 820.74, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T03:50:22.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:50:22.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T03:50:22.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:49:53, diff=29.231063s, valid=True
2026-06-04T03:50:22.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:50:22.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:50:22.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:50:12, diff=10.234616s, valid=True
2026-06-04T03:50:22.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:50:22.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T03:50:22.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:49:50, diff=32.242591s, valid=True
2026-06-04T03:50:22.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:50:22.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:50:22.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:50:22.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:50:22.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:50:22.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:50:22.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:50:12, diff=10.245986s, valid=True
2026-06-04T03:50:22.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:50:22.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:50:22.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:50:22.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112019.246707s, valid=True
2026-06-04T03:50:22.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:50:22.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:50:22.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:50:22.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:50:22.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:50:22.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:50:22.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:50:22.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:50:22.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:50:22.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:50:22.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:50:22.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:50:22.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:50:22.758 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:50:22.978 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:50:23.332 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:50:23.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:50:23.438 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:50:23.438 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:50:23.666 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:50:23.667 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:50:53.693 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:50:53.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:50:53.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:50:54.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:50:54.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:50:54.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:50:54.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:50:54.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:50:54.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:50:54.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:50:54.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:50:54.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:50:54.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:50:56.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:50:56.962 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:50:56.963 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:50:56.963 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:50:56.972 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:50:56.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:50:56.985 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:50:56.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:50:56.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:50:56.987 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:50:56.987 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:50:56.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:50:57.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:50:57.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:50:57.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:50:57.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:50:57.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:50:57.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:50:57.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:50:57.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:50:57.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:50:57.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:50:57.330 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:50:57.401 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:50:54
2026-06-04T03:50:57.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87852, datetime.datetime(2026, 6, 4, 3, 50, 54), datetime.datetime(2026, 6, 4, 3, 50, 54), 'salt', 1.8, 100.54, None, 39.45, 128.62, -0.08, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:50:57.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:50:57.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:50:57.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:50:54, diff=3.408081s, valid=True
2026-06-04T03:50:57.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:50:57.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:50:57.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:51:12, diff=-14.588643s, valid=True
2026-06-04T03:50:57.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:50:57.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:50:57.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:50:50, diff=7.419477s, valid=True
2026-06-04T03:50:57.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:50:57.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:50:57.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:50:57.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:50:57.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:50:57.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:50:57.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:51:12, diff=-14.576903s, valid=True
2026-06-04T03:50:57.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:50:57.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:50:57.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:50:57.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112054.423876s, valid=True
2026-06-04T03:50:57.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:50:57.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:50:57.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:50:57.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:50:57.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:50:57.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:50:57.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:50:57.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:50:57.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:50:57.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:50:57.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:50:57.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:50:57.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:50:57.756 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:50:57.972 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:50:58.323 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:50:58.426 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:50:58.427 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:50:58.427 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:50:58.626 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:50:58.626 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:51:28.656 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:51:28.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:51:28.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:51:28.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:51:28.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:51:29.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:51:29.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:51:29.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:51:29.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:51:29.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:51:29.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:51:29.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:51:29.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:51:31.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:51:31.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:51:31.514 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:51:31.515 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:51:31.526 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:51:31.538 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:51:31.539 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:51:31.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:51:31.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:51:31.540 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:51:31.540 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:51:31.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:51:31.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:51:31.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:51:31.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:51:31.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:51:31.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:51:31.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:51:31.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:51:31.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:51:31.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:51:31.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:51:31.883 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:51:31.953 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:51:25
2026-06-04T03:51:31.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87853, datetime.datetime(2026, 6, 4, 3, 51, 25), datetime.datetime(2026, 6, 4, 3, 51, 24), 'salt', 1.8, 100.61, None, 34.01, 131.18, -0.09, 821.17, 'DRY', 0, None, 0, 2, 0, 2)]
2026-06-04T03:51:31.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:51:31.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:51:31.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:51:24, diff=7.959704s, valid=True
2026-06-04T03:51:31.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:51:31.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:51:31.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:51:12, diff=19.962599s, valid=True
2026-06-04T03:51:31.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:51:31.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:51:31.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:51:20, diff=11.969297s, valid=True
2026-06-04T03:51:31.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:51:31.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:51:31.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:51:31.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:51:31.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:51:31.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:51:31.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:51:12, diff=19.972368s, valid=True
2026-06-04T03:51:31.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:51:31.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:51:31.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:51:31.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112088.973037s, valid=True
2026-06-04T03:51:31.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:51:31.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:51:31.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:51:31.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:51:31.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:51:32.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:51:32.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:51:32.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:51:32.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:51:32.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:51:32.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:51:32.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:51:32.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:51:32.293 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:51:32.508 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:51:32.915 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:51:33.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:51:33.019 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:51:33.019 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:51:33.215 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:51:33.215 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:52:03.245 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:52:03.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:52:03.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:52:03.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:52:03.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:52:03.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:52:03.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:52:03.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:52:03.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:52:03.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:52:03.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:52:03.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:52:03.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:52:06.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:52:06.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:52:06.110 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:52:06.111 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:52:06.121 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:52:06.134 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:52:06.134 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:52:06.135 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:52:06.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:52:06.135 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:52:06.136 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:52:06.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:52:06.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:52:06.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:52:06.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:52:06.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:52:06.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:52:06.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:52:06.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:52:06.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:52:06.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:52:06.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:52:06.466 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:52:06.535 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:51:55
2026-06-04T03:52:06.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87854, datetime.datetime(2026, 6, 4, 3, 51, 55), datetime.datetime(2026, 6, 4, 3, 51, 54), 'salt', 1.87, 100.64, None, 46.64, 123.48, -0.09, 820.99, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T03:52:06.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:52:06.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:52:06.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:51:54, diff=12.543048s, valid=True
2026-06-04T03:52:06.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:52:06.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:52:06.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:52:12, diff=-5.453485s, valid=True
2026-06-04T03:52:06.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:52:06.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:52:06.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:51:51, diff=15.554428s, valid=True
2026-06-04T03:52:06.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:52:06.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:52:06.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:52:06.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:52:06.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:52:06.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:52:06.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:52:12, diff=-5.441927s, valid=True
2026-06-04T03:52:06.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:52:06.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:52:06.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:52:06.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112123.558861s, valid=True
2026-06-04T03:52:06.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:52:06.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:52:06.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:52:06.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:52:06.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:52:06.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:52:06.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:52:06.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:52:06.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:52:06.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:52:06.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:52:06.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:52:06.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:52:06.878 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:52:07.093 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:52:07.442 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:52:07.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:52:07.544 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:52:07.545 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:52:07.746 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:52:07.746 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:52:37.776 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:52:37.776 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:52:37.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:52:38.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:52:38.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:52:38.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:52:38.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:52:38.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:52:38.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:52:38.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:52:38.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:52:38.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:52:38.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:52:41.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:52:41.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:52:41.625 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:52:41.626 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:52:41.636 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:52:41.648 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:52:41.649 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:52:41.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:52:41.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:52:41.650 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:52:41.650 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:52:41.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:52:41.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:52:41.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:52:41.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:52:41.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:52:41.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:52:41.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:52:41.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:52:41.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:52:41.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:52:41.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:52:41.994 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:52:42.070 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:52:25
2026-06-04T03:52:42.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87855, datetime.datetime(2026, 6, 4, 3, 52, 25), datetime.datetime(2026, 6, 4, 3, 52, 24), 'salt', 1.87, 100.61, None, 43.01, 140.41, -0.08, 821.11, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:52:42.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:52:42.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:52:42.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:52:24, diff=18.077756s, valid=True
2026-06-04T03:52:42.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:52:42.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:52:42.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:52:12, diff=30.08119s, valid=True
2026-06-04T03:52:42.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:52:42.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:52:42.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:52:21, diff=21.089053s, valid=True
2026-06-04T03:52:42.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:52:42.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:52:42.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:52:42.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:52:42.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:52:42.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:52:42.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:52:12, diff=30.092711s, valid=True
2026-06-04T03:52:42.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:52:42.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:52:42.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:52:42.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112159.093485s, valid=True
2026-06-04T03:52:42.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:52:42.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:52:42.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:52:42.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:52:42.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:52:42.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:52:42.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:52:42.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:52:42.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:52:42.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:52:42.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:52:42.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:52:42.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:52:42.414 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:52:42.715 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:52:43.074 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:52:43.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:52:43.178 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:52:43.178 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:52:43.377 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:52:43.377 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:53:13.381 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:53:13.381 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:53:13.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:53:13.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:53:13.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:53:14.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:53:14.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:53:14.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:53:14.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:53:14.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:53:14.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:53:14.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:53:14.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:53:16.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:53:16.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:53:16.586 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:53:16.587 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:53:16.598 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:53:16.616 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:53:16.616 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:53:16.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:53:16.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:53:16.618 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:53:16.618 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:53:16.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:53:16.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:53:16.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:53:16.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:53:16.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:53:16.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:53:16.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:53:16.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:53:16.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:53:16.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:53:16.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:53:16.958 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:53:17.030 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:52:56
2026-06-04T03:53:17.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87856, datetime.datetime(2026, 6, 4, 3, 52, 56), datetime.datetime(2026, 6, 4, 3, 52, 55), 'salt', 1.8, 100.61, None, 35.78, 128.46, -0.09, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:53:17.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:53:17.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:53:17.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:52:55, diff=22.037914s, valid=True
2026-06-04T03:53:17.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:53:17.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:53:17.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:53:12, diff=5.041478s, valid=True
2026-06-04T03:53:17.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:53:17.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:53:17.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:52:55, diff=22.049846s, valid=True
2026-06-04T03:53:17.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:53:17.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:53:17.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:53:17.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:53:17.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:53:17.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:53:17.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:53:12, diff=5.05365s, valid=True
2026-06-04T03:53:17.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:53:17.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:53:17.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:53:17.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112194.054476s, valid=True
2026-06-04T03:53:17.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:53:17.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:53:17.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:53:17.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:53:17.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:53:17.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:53:17.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:53:17.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:53:17.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:53:17.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:53:17.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:53:17.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:53:17.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:53:17.376 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:53:17.589 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:53:17.936 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:53:18.038 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:53:18.038 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:53:18.038 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:53:18.266 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:53:18.266 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:53:48.296 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:53:48.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:53:48.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:53:48.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:53:48.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:53:49.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:53:49.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:53:49.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:53:49.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:53:49.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:53:49.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:53:49.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:53:49.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:53:52.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:53:52.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:53:52.014 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:53:52.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:53:52.026 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:53:52.039 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:53:52.039 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:53:52.040 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:53:52.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:53:52.040 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:53:52.041 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:53:52.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:53:52.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:53:52.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:53:52.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:53:52.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:53:52.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:53:52.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:53:52.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:53:52.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:53:52.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:53:52.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:53:52.376 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:53:52.447 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:53:26
2026-06-04T03:53:52.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87857, datetime.datetime(2026, 6, 4, 3, 53, 26), datetime.datetime(2026, 6, 4, 3, 53, 25), 'salt', 1.8, 100.64, None, 44.74, 127.28, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:53:52.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:53:52.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:53:52.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:53:25, diff=27.455006s, valid=True
2026-06-04T03:53:52.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:53:52.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:53:52.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:53:12, diff=40.458511s, valid=True
2026-06-04T03:53:52.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:53:52.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:53:52.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:53:21, diff=31.46668s, valid=True
2026-06-04T03:53:52.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:53:52.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:53:52.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:53:52.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:53:52.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:53:52.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:53:52.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:53:12, diff=40.470375s, valid=True
2026-06-04T03:53:52.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:53:52.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:53:52.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:53:52.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112229.471191s, valid=True
2026-06-04T03:53:52.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:53:52.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:53:52.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:53:52.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:53:52.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:53:52.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:53:52.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:53:52.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:53:52.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:53:52.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:53:52.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:53:52.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:53:52.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:53:52.861 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:53:53.077 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:53:53.425 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:53:53.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:53:53.528 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:53:53.528 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:53:53.718 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:53:53.719 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:54:23.749 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:54:23.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:54:23.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:54:24.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:54:24.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:54:24.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:54:24.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:54:24.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:54:24.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:54:24.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:54:24.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:54:24.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:54:24.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:54:27.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:54:27.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:54:27.778 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:54:27.778 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:54:27.790 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:54:27.803 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:54:27.803 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:54:27.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:54:27.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:54:27.804 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:54:27.805 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:54:27.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:54:27.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:54:27.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:54:28.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:54:28.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:54:28.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:54:28.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:54:28.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:54:28.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:54:28.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:54:28.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:54:28.150 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:54:28.223 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:54:26
2026-06-04T03:54:28.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87859, datetime.datetime(2026, 6, 4, 3, 54, 26), datetime.datetime(2026, 6, 4, 3, 54, 26), 'salt', 1.73, 100.54, None, 45.83, 129.12, -0.08, 821.11, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T03:54:28.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:54:28.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:54:28.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:54:26, diff=2.23094s, valid=True
2026-06-04T03:54:28.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:54:28.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:54:28.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:54:12, diff=16.234451s, valid=True
2026-06-04T03:54:28.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:54:28.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:54:28.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:54:22, diff=6.24274s, valid=True
2026-06-04T03:54:28.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:54:28.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:54:28.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:54:28.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:54:28.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:54:28.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:54:28.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:54:12, diff=16.246459s, valid=True
2026-06-04T03:54:28.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:54:28.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:54:28.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:54:28.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112265.247277s, valid=True
2026-06-04T03:54:28.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:54:28.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:54:28.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:54:28.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:54:28.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:54:28.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:54:28.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:54:28.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:54:28.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:54:28.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:54:28.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:54:28.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:54:28.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:54:28.567 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:54:28.779 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:54:29.125 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:54:29.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:54:29.226 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:54:29.227 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:54:29.317 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:54:29.318 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:54:59.348 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:54:59.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:54:59.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:54:59.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:54:59.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:54:59.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:54:59.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:54:59.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:54:59.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:54:59.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:54:59.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:54:59.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:54:59.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:55:02.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:55:02.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:55:02.563 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:55:02.564 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:55:02.575 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:55:02.587 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:55:02.588 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:55:02.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:55:02.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:55:02.589 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:55:02.589 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:55:02.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:55:02.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:55:02.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:55:02.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:55:02.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:55:02.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:55:02.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:55:02.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:55:02.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:55:02.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:55:02.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:55:02.934 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:55:03.019 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:54:57
2026-06-04T03:55:03.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87860, datetime.datetime(2026, 6, 4, 3, 54, 57), datetime.datetime(2026, 6, 4, 3, 54, 56), 'salt', 1.8, 100.61, None, 48.8, 123.13, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T03:55:03.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:55:03.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:55:03.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:54:56, diff=7.026983s, valid=True
2026-06-04T03:55:03.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:55:03.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:55:03.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:55:12, diff=-8.969463s, valid=True
2026-06-04T03:55:03.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:55:03.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:55:03.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:54:52, diff=11.038842s, valid=True
2026-06-04T03:55:03.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:55:03.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:55:03.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:55:03.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:55:03.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:55:03.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:55:03.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:55:12, diff=-8.957359s, valid=True
2026-06-04T03:55:03.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:55:03.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:55:03.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:55:03.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112300.043458s, valid=True
2026-06-04T03:55:03.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:55:03.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:55:03.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:55:03.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:55:03.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:55:03.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:55:03.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:55:03.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:55:03.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:55:03.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:55:03.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:55:03.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:55:03.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:55:03.431 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:55:03.647 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:55:04.011 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:55:04.113 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:55:04.113 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:55:04.113 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:55:04.366 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:55:04.367 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:55:34.393 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:55:34.393 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:55:34.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:55:34.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:55:34.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:55:34.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:55:34.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:55:34.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:55:34.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:55:34.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:55:34.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:55:34.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:55:34.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:55:37.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:55:37.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:55:37.254 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:55:37.255 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:55:37.265 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:55:37.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:55:37.278 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:55:37.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:55:37.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:55:37.279 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:55:37.279 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:55:37.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:55:37.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:55:37.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:55:37.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:55:37.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:55:37.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:55:37.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:55:37.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:55:37.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:55:37.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:55:37.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:55:37.619 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:55:37.690 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:55:27
2026-06-04T03:55:37.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87861, datetime.datetime(2026, 6, 4, 3, 55, 27), datetime.datetime(2026, 6, 4, 3, 55, 26), 'salt', 1.73, 100.54, None, 47.31, 129.33, -0.08, 820.68, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T03:55:37.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:55:37.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:55:37.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:55:26, diff=11.69774s, valid=True
2026-06-04T03:55:37.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:55:37.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:55:37.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:55:12, diff=25.701262s, valid=True
2026-06-04T03:55:37.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:55:37.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:55:37.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:55:22, diff=15.70977s, valid=True
2026-06-04T03:55:37.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:55:37.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:55:37.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:55:37.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:55:37.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:55:37.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:55:37.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:55:12, diff=25.713704s, valid=True
2026-06-04T03:55:37.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:55:37.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:55:37.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:55:37.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112334.714535s, valid=True
2026-06-04T03:55:37.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:55:37.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:55:37.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:55:37.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:55:37.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:55:37.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:55:37.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:55:37.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:55:37.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:55:37.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:55:37.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:55:37.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:55:37.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:55:38.038 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:55:38.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:55:38.619 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:55:38.722 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:55:38.722 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:55:38.722 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:55:38.947 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:55:38.948 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:56:08.951 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:56:08.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:56:08.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:56:09.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:56:09.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:56:09.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:56:09.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:56:09.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:56:09.728 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:56:09.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:56:09.744 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:56:09.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:56:09.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:56:12.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:56:12.173 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:56:12.173 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:56:12.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:56:12.184 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:56:12.196 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:56:12.197 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:56:12.197 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:56:12.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:56:12.198 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:56:12.198 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:56:12.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:56:12.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:56:12.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:56:12.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:56:12.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:56:12.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:56:12.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:56:12.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:56:12.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:56:12.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:56:12.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:56:12.533 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:56:12.604 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:55:57
2026-06-04T03:56:12.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87862, datetime.datetime(2026, 6, 4, 3, 55, 57), datetime.datetime(2026, 6, 4, 3, 55, 56), 'salt', 1.87, 100.68, None, 40.96, 125.97, -0.09, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:56:12.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:56:12.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:56:12.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:55:56, diff=16.611743s, valid=True
2026-06-04T03:56:12.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:56:12.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:56:12.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:56:12, diff=0.61526s, valid=True
2026-06-04T03:56:12.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:56:12.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:56:12.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:55:52, diff=20.623408s, valid=True
2026-06-04T03:56:12.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:56:12.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:56:12.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:56:12.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:56:12.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:56:12.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:56:12.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:56:12, diff=0.627177s, valid=True
2026-06-04T03:56:12.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:56:12.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:56:12.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:56:12.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112369.62799s, valid=True
2026-06-04T03:56:12.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:56:12.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:56:12.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:56:12.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:56:12.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:56:12.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:56:12.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:56:12.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:56:12.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:56:12.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:56:12.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:56:12.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:56:12.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:56:13.017 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:56:13.234 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:56:13.584 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:56:13.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:56:13.688 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:56:13.688 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:56:13.883 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:56:13.883 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:56:43.912 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:56:43.912 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:56:43.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:56:44.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:56:44.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:56:44.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:56:44.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:56:44.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:56:44.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:56:44.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:56:44.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:56:44.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:56:44.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:56:46.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:56:46.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:56:46.995 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:56:46.995 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:56:47.004 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:56:47.016 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:56:47.016 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:56:47.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:56:47.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:56:47.016 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:56:47.016 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:56:47.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:56:47.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:56:47.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:56:47.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:56:47.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:56:47.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:56:47.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:56:47.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:56:47.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:56:47.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:56:47.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:56:47.321 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:56:47.392 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:56:27
2026-06-04T03:56:47.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87863, datetime.datetime(2026, 6, 4, 3, 56, 27), datetime.datetime(2026, 6, 4, 3, 56, 27), 'salt', 1.73, 100.51, None, 45.06, 123.67, -0.08, 820.8, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T03:56:47.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:56:47.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:56:47.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:56:27, diff=20.401234s, valid=True
2026-06-04T03:56:47.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:56:47.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:56:47.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:56:12, diff=35.405199s, valid=True
2026-06-04T03:56:47.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:56:47.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:56:47.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:56:23, diff=24.413032s, valid=True
2026-06-04T03:56:47.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:56:47.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:56:47.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:56:47.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:56:47.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:56:47.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:56:47.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:56:12, diff=35.416461s, valid=True
2026-06-04T03:56:47.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:56:47.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:56:47.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:56:47.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112404.417201s, valid=True
2026-06-04T03:56:47.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:56:47.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:56:47.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:56:47.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:56:47.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:56:47.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:56:47.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:56:47.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:56:47.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:56:47.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:56:47.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:56:47.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:56:47.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:56:47.766 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:56:48.008 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:56:48.358 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:56:48.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:56:48.459 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:56:48.459 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:56:48.610 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:56:48.610 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:57:18.623 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:57:18.623 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:57:18.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:57:19.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:57:19.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:57:19.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:57:19.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:57:19.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:57:19.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:57:19.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:57:19.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:57:19.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:57:19.461 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:57:21.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:57:21.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:57:21.870 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:57:21.871 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:57:21.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:57:21.893 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:57:21.894 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:57:21.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:57:21.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:57:21.895 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:57:21.895 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:57:21.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:57:22.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:57:22.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:57:22.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:57:22.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:57:22.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:57:22.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:57:22.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:57:22.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:57:22.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:57:22.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:57:22.287 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:57:22.357 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:56:58
2026-06-04T03:57:22.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87864, datetime.datetime(2026, 6, 4, 3, 56, 58), datetime.datetime(2026, 6, 4, 3, 56, 57), 'salt', 1.83, 100.61, None, 42.8, 135.34, -0.09, 820.62, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:57:22.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:57:22.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:57:22.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:56:57, diff=25.363634s, valid=True
2026-06-04T03:57:22.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:57:22.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:57:22.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:57:12, diff=10.36643s, valid=True
2026-06-04T03:57:22.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:57:22.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:57:22.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:56:53, diff=29.372867s, valid=True
2026-06-04T03:57:22.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:57:22.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:57:22.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:57:22.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:57:22.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:57:22.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:57:22.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:57:12, diff=10.375833s, valid=True
2026-06-04T03:57:22.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:57:22.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:57:22.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:57:22.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112439.376479s, valid=True
2026-06-04T03:57:22.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:57:22.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:57:22.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:57:22.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:57:22.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:57:22.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:57:22.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:57:22.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:57:22.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:57:22.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:57:22.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:57:22.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:57:22.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:57:22.691 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:57:22.904 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:57:23.252 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:57:23.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:57:23.353 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:57:23.353 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:57:24.351 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:57:24.352 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:57:54.382 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:57:54.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:57:54.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:57:54.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:57:54.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:57:54.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:57:54.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:57:54.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:57:54.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:57:54.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:57:54.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:57:54.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:57:54.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:57:57.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:57:57.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:57:57.158 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:57:57.158 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:57:57.169 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:57:57.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:57:57.188 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:57:57.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:57:57.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:57:57.189 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:57:57.190 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:57:57.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:57:57.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T03:57:57.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:57:57.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T03:57:57.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:57:57.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T03:57:57.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:57:57.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T03:57:57.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:57:57.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:57:57.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:57:57.541 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:57:57.614 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:57:28
2026-06-04T03:57:57.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87865, datetime.datetime(2026, 6, 4, 3, 57, 28), datetime.datetime(2026, 6, 4, 3, 57, 27), 'salt', 1.77, 100.61, None, 40.22, 129.3, -0.08, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:57:57.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:57:57.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T03:57:57.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:57:27, diff=30.621436s, valid=True
2026-06-04T03:57:57.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:57:57.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T03:57:57.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:57:12, diff=45.62503s, valid=True
2026-06-04T03:57:57.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:57:57.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T03:57:57.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:57:23, diff=34.633186s, valid=True
2026-06-04T03:57:57.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:57:57.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:57:57.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:57:57.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:57:57.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:57:57.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T03:57:57.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:57:12, diff=45.636952s, valid=True
2026-06-04T03:57:57.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:57:57.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:57:57.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:57:57.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112474.637777s, valid=True
2026-06-04T03:57:57.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:57:57.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:57:57.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:57:57.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:57:57.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:57:57.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:57:57.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:57:57.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:57:57.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:57:57.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:57:57.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:57:57.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:57:57.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:57:57.961 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:57:58.235 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:57:58.579 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:57:58.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:57:58.680 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:57:58.680 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:57:59.560 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:57:59.560 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:58:29.591 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:58:29.591 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:58:29.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:58:29.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:58:29.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:58:30.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:58:30.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:58:30.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:58:30.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:58:30.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:58:30.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:58:30.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:58:30.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:58:32.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:58:32.492 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:58:32.493 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:58:32.493 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:58:32.504 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:58:32.516 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:58:32.517 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:58:32.517 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:58:32.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:58:32.518 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:58:32.518 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:58:32.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:58:32.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:58:32.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:58:32.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:58:32.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:58:32.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:58:32.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:58:32.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:58:32.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:58:32.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:58:32.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:58:32.789 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:58:32.870 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:58:28
2026-06-04T03:58:32.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87867, datetime.datetime(2026, 6, 4, 3, 58, 28), datetime.datetime(2026, 6, 4, 3, 58, 28), 'salt', 1.77, 100.54, None, 43.57, 123.76, -0.07, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:58:32.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:58:32.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:58:32.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:58:28, diff=4.877215s, valid=True
2026-06-04T03:58:32.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:58:32.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:58:32.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:58:12, diff=20.880468s, valid=True
2026-06-04T03:58:32.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:58:32.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:58:32.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:58:23, diff=9.888198s, valid=True
2026-06-04T03:58:32.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:58:32.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:58:32.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:58:32.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:58:32.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:58:32.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:58:32.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:58:12, diff=20.891722s, valid=True
2026-06-04T03:58:32.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:58:32.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:58:32.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:58:32.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112509.892459s, valid=True
2026-06-04T03:58:32.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:58:32.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:58:32.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:58:32.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:58:32.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:58:32.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:58:32.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:58:32.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:58:32.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:58:33.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:58:33.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:58:33.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:58:33.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:58:33.221 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:58:33.433 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:58:33.777 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:58:33.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:58:33.879 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:58:33.879 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:58:34.124 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:58:34.124 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:59:04.125 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:59:04.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:59:04.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:59:04.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:59:04.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:59:04.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:59:04.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:59:04.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:59:04.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:59:04.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:59:04.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:59:04.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:59:04.715 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:59:07.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:59:07.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:59:07.248 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:59:07.248 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:59:07.258 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:59:07.271 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:59:07.271 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:59:07.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:59:07.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:59:07.272 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:59:07.273 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:59:07.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:59:07.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:59:07.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:59:07.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:59:07.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:59:07.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:59:07.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:59:07.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:59:07.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:59:07.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:59:07.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:59:07.622 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:59:07.695 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:58:59
2026-06-04T03:59:07.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87868, datetime.datetime(2026, 6, 4, 3, 58, 59), datetime.datetime(2026, 6, 4, 3, 58, 58), 'salt', 1.87, 100.64, None, 48.13, 128.25, -0.09, 820.68, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T03:59:07.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:59:07.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:59:07.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:58:58, diff=9.703253s, valid=True
2026-06-04T03:59:07.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:59:07.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:59:07.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:59:12, diff=-4.29323s, valid=True
2026-06-04T03:59:07.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:59:07.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:59:07.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:58:54, diff=13.714896s, valid=True
2026-06-04T03:59:07.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:59:07.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:59:07.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:59:07.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:59:07.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:59:07.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:59:07.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:59:12, diff=-4.281386s, valid=True
2026-06-04T03:59:07.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:59:07.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:59:07.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:59:07.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112544.719415s, valid=True
2026-06-04T03:59:07.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:59:07.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:59:07.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:59:07.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:59:07.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:59:07.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:59:07.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:59:07.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:59:07.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:59:07.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:59:07.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:59:07.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:59:08.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:59:08.113 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:59:08.326 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:59:08.674 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:59:08.776 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:59:08.776 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:59:08.776 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:59:09.026 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:59:09.027 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T03:59:39.056 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T03:59:39.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T03:59:39.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T03:59:39.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T03:59:39.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T03:59:39.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T03:59:39.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T03:59:39.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T03:59:39.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T03:59:39.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T03:59:39.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T03:59:39.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T03:59:39.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T03:59:42.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T03:59:42.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T03:59:42.542 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T03:59:42.542 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T03:59:42.553 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T03:59:42.566 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T03:59:42.567 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T03:59:42.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T03:59:42.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T03:59:42.568 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T03:59:42.568 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T03:59:42.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T03:59:42.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T03:59:42.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T03:59:42.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T03:59:42.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:59:42.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:59:42.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T03:59:42.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T03:59:42.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T03:59:42.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T03:59:42.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T03:59:42.926 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T03:59:43.015 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:59:29
2026-06-04T03:59:43.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87869, datetime.datetime(2026, 6, 4, 3, 59, 29), datetime.datetime(2026, 6, 4, 3, 59, 28), 'salt', 1.83, 100.58, None, 41.63, 117.58, -0.08, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T03:59:43.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T03:59:43.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T03:59:43.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:59:28, diff=15.022735s, valid=True
2026-06-04T03:59:43.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T03:59:43.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:59:43.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:59:12, diff=31.026281s, valid=True
2026-06-04T03:59:43.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T03:59:43.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T03:59:43.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:59:24, diff=19.034611s, valid=True
2026-06-04T03:59:43.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T03:59:43.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:59:43.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T03:59:43.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T03:59:43.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T03:59:43.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T03:59:43.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:59:12, diff=31.03888s, valid=True
2026-06-04T03:59:43.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T03:59:43.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T03:59:43.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T03:59:43.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112580.040206s, valid=True
2026-06-04T03:59:43.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T03:59:43.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T03:59:43.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T03:59:43.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T03:59:43.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T03:59:43.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T03:59:43.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T03:59:43.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T03:59:43.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T03:59:43.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T03:59:43.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T03:59:43.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T03:59:43.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T03:59:43.361 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T03:59:43.573 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:59:43.918 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T03:59:44.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T03:59:44.020 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T03:59:44.020 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T03:59:44.110 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T03:59:44.110 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:00:14.111 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:00:14.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:00:14.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:00:14.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:00:14.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:00:14.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:00:14.507 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:00:14.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:00:14.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:00:14.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:00:14.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:00:14.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:00:14.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:00:17.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:00:17.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:00:17.900 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:00:17.900 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:00:17.911 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:00:17.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:00:17.924 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:00:17.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:00:17.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:00:17.926 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:00:17.926 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:00:17.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:00:18.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:00:18.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:00:18.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:00:18.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:00:18.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T04:00:18.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:00:18.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T04:00:18.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:00:18.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:00:18.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:00:18.278 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:00:18.355 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 03:59:59
2026-06-04T04:00:18.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87870, datetime.datetime(2026, 6, 4, 3, 59, 59), datetime.datetime(2026, 6, 4, 3, 59, 58), 'salt', 1.87, 100.61, None, 40.93, 129.19, -0.08, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:00:18.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:00:18.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:00:18.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:59:58, diff=20.36291s, valid=True
2026-06-04T04:00:18.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:00:18.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T04:00:18.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:00:12, diff=6.366329s, valid=True
2026-06-04T04:00:18.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:00:18.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:00:18.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 03:59:54, diff=24.374178s, valid=True
2026-06-04T04:00:18.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:00:18.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:00:18.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:00:18.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:00:18.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:00:18.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T04:00:18.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:00:12, diff=6.377788s, valid=True
2026-06-04T04:00:18.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:00:18.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:00:18.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:00:18.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112615.37855s, valid=True
2026-06-04T04:00:18.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:00:18.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:00:18.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:00:18.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:00:18.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:00:18.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:00:18.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:00:18.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:00:18.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:00:18.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:00:18.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:00:18.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:00:18.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:00:18.763 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:00:18.977 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:00:19.324 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:00:19.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:00:19.428 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:00:19.428 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:00:19.687 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:00:19.687 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:00:49.717 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:00:49.717 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:00:49.717 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:00:49.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:00:49.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:00:50.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:00:50.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:00:50.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:00:50.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:00:50.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:00:50.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:00:50.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:00:50.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:00:52.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:00:52.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:00:52.622 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:00:52.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:00:52.634 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:00:52.647 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:00:52.648 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:00:52.648 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:00:52.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:00:52.649 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:00:52.649 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:00:52.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:00:52.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:00:52.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:00:52.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:00:52.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:00:52.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T04:00:52.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:00:52.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T04:00:52.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:00:53.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:00:53.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:00:53.002 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:00:53.084 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:00:29
2026-06-04T04:00:53.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87871, datetime.datetime(2026, 6, 4, 4, 0, 29), datetime.datetime(2026, 6, 4, 4, 0, 29), 'salt', 1.73, 100.54, None, 36.31, 139.85, -0.08, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:00:53.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:00:53.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:00:53.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:00:29, diff=24.091968s, valid=True
2026-06-04T04:00:53.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:00:53.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T04:00:53.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:00:12, diff=41.095476s, valid=True
2026-06-04T04:00:53.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:00:53.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:00:53.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:00:24, diff=29.103701s, valid=True
2026-06-04T04:00:53.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:00:53.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:00:53.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:00:53.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:00:53.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:00:53.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T04:00:53.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:00:12, diff=41.107415s, valid=True
2026-06-04T04:00:53.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:00:53.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:00:53.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:00:53.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112650.108234s, valid=True
2026-06-04T04:00:53.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:00:53.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:00:53.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:00:53.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:00:53.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:00:53.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:00:53.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:00:53.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:00:53.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:00:53.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:00:53.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:00:53.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:00:53.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:00:53.429 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:00:53.641 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:00:53.986 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:00:54.088 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:00:54.088 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:00:54.088 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:00:54.276 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:00:54.276 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:01:24.306 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:01:24.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:01:24.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:01:24.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:01:24.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:01:24.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:01:24.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:01:24.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:01:24.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:01:24.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:01:24.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:01:24.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:01:24.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:01:27.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:01:27.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:01:27.655 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:01:27.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:01:27.666 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:01:27.678 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:01:27.679 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:01:27.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:01:27.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:01:27.680 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:01:27.680 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:01:27.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:01:27.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:01:27.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:01:27.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T04:01:27.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:01:27.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T04:01:27.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:01:28.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T04:01:28.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:01:28.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:01:28.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:01:28.038 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:01:28.123 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:01:00
2026-06-04T04:01:28.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87872, datetime.datetime(2026, 6, 4, 4, 1), datetime.datetime(2026, 6, 4, 4, 0, 59), 'salt', 1.87, 100.61, None, 33.94, 115.23, -0.08, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:01:28.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:01:28.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:01:28.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:00:59, diff=29.130724s, valid=True
2026-06-04T04:01:28.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:01:28.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T04:01:28.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:01:12, diff=16.134223s, valid=True
2026-06-04T04:01:28.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:01:28.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T04:01:28.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:00:55, diff=33.146947s, valid=True
2026-06-04T04:01:28.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:01:28.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:01:28.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:01:28.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:01:28.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:01:28.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T04:01:28.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:01:12, diff=16.150684s, valid=True
2026-06-04T04:01:28.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:01:28.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:01:28.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:01:28.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112685.15148s, valid=True
2026-06-04T04:01:28.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:01:28.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:01:28.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:01:28.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:01:28.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:01:28.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:01:28.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:01:28.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:01:28.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:01:28.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:01:28.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:01:28.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:01:28.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:01:28.539 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:01:28.755 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:01:29.105 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:01:29.209 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:01:29.209 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:01:29.209 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:01:29.406 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:01:29.406 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:01:59.418 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:01:59.418 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:01:59.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:01:59.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:01:59.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:02:00.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:02:00.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:02:00.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:02:00.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:02:00.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:02:00.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:02:00.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:02:00.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:02:02.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:02:02.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:02:02.428 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:02:02.428 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:02:02.438 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:02:02.451 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:02:02.452 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:02:02.452 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:02:02.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:02:02.453 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:02:02.453 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:02:02.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:02:02.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:02:02.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:02:02.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:02:02.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:02:02.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T04:02:02.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:02:02.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T04:02:02.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:02:02.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:02:02.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:02:02.808 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:02:02.882 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:02:00
2026-06-04T04:02:02.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87874, datetime.datetime(2026, 6, 4, 4, 2), datetime.datetime(2026, 6, 4, 4, 1, 59), 'salt', 1.87, 100.64, None, 49.29, 123.69, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T04:02:02.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:02:02.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:02:02.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:01:59, diff=3.89047s, valid=True
2026-06-04T04:02:02.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:02:02.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T04:02:02.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:02:12, diff=-9.105903s, valid=True
2026-06-04T04:02:02.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:02:02.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:02:02.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:01:55, diff=7.902526s, valid=True
2026-06-04T04:02:02.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:02:02.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:02:02.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:02:02.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:02:02.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:02:02.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T04:02:02.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:02:12, diff=-9.093522s, valid=True
2026-06-04T04:02:02.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:02:02.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:02:02.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:02:02.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112719.907329s, valid=True
2026-06-04T04:02:02.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:02:02.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:02:02.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:02:02.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:02:02.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:02:02.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:02:02.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:02:02.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:02:02.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:02:03.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:02:03.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:02:03.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:02:03.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:02:03.230 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:02:03.446 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:02:03.795 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:02:03.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:02:03.899 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:02:03.900 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:02:04.089 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:02:04.089 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:02:34.120 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:02:34.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:02:34.120 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:02:34.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:02:34.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:02:34.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:02:34.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:02:34.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:02:34.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:02:34.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:02:34.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:02:34.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:02:34.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:02:37.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:02:37.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:02:37.254 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:02:37.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:02:37.264 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:02:37.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:02:37.277 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:02:37.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:02:37.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:02:37.278 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:02:37.279 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:02:37.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:02:37.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:02:37.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:02:37.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:02:37.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:02:37.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T04:02:37.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:02:37.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T04:02:37.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:02:37.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:02:37.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:02:37.654 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:02:37.726 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:02:30
2026-06-04T04:02:37.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87875, datetime.datetime(2026, 6, 4, 4, 2, 30), datetime.datetime(2026, 6, 4, 4, 2, 30), 'salt', 1.73, 100.61, None, 44.84, 119.79, -0.09, 820.68, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:02:37.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:02:37.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:02:37.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:02:30, diff=7.733862s, valid=True
2026-06-04T04:02:37.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:02:37.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T04:02:37.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:02:12, diff=25.737523s, valid=True
2026-06-04T04:02:37.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:02:37.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:02:37.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:02:25, diff=12.746071s, valid=True
2026-06-04T04:02:37.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:02:37.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:02:37.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:02:37.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:02:37.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:02:37.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T04:02:37.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:02:12, diff=25.750008s, valid=True
2026-06-04T04:02:37.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:02:37.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:02:37.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:02:37.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112754.750869s, valid=True
2026-06-04T04:02:37.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:02:37.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:02:37.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:02:37.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:02:37.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:02:37.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:02:37.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:02:37.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:02:37.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:02:37.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:02:37.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:02:37.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:02:38.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:02:38.077 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:02:38.294 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:02:38.679 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:02:38.788 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:02:38.788 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:02:38.788 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:02:39.034 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:02:39.034 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:03:09.064 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:03:09.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:03:09.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:03:09.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:03:09.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:03:09.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:03:09.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:03:09.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:03:09.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:03:09.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:03:09.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:03:09.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:03:09.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:03:12.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:03:12.084 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:03:12.085 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:03:12.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:03:12.096 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:03:12.109 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:03:12.110 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:03:12.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:03:12.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:03:12.111 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:03:12.111 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:03:12.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:03:12.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:03:12.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:03:12.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:03:12.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:03:12.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T04:03:12.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:03:12.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T04:03:12.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:03:12.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:03:12.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:03:12.449 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:03:12.523 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:03:01
2026-06-04T04:03:12.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87876, datetime.datetime(2026, 6, 4, 4, 3, 1), datetime.datetime(2026, 6, 4, 4, 3), 'salt', 1.77, 100.61, None, 51.51, 127.45, -0.08, 820.68, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T04:03:12.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:03:12.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:03:12.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:03:00, diff=12.53165s, valid=True
2026-06-04T04:03:12.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:03:12.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T04:03:12.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:03:12, diff=0.535313s, valid=True
2026-06-04T04:03:12.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:03:12.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:03:12.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:02:56, diff=16.543658s, valid=True
2026-06-04T04:03:12.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:03:12.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:03:12.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:03:12.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:03:12.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:03:12.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T04:03:12.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:03:12, diff=0.5476s, valid=True
2026-06-04T04:03:12.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:03:12.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:03:12.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:03:12.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112789.548442s, valid=True
2026-06-04T04:03:12.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:03:12.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:03:12.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:03:12.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:03:12.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:03:12.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:03:12.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:03:12.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:03:12.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:03:12.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:03:12.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:03:12.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:03:12.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:03:12.874 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:03:13.161 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:03:14.273 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:03:14.375 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:03:14.375 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:03:14.375 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:03:14.555 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:03:14.555 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:03:44.577 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:03:44.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:03:44.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:03:45.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:03:45.128 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:03:45.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:03:45.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:03:45.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:03:45.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:03:45.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:03:45.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:03:45.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:03:45.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:03:47.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:03:47.822 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:03:47.823 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:03:47.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:03:47.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:03:47.847 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:03:47.848 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:03:47.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:03:47.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:03:47.849 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:03:47.849 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:03:47.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:03:47.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:03:47.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:03:48.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:03:48.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:03:48.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T04:03:48.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:03:48.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-06-04T04:03:48.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:03:48.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:03:48.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:03:48.191 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:03:48.264 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:03:31
2026-06-04T04:03:48.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87877, datetime.datetime(2026, 6, 4, 4, 3, 31), datetime.datetime(2026, 6, 4, 4, 3, 30), 'salt', 1.67, 100.58, None, 45.48, 131.11, -0.08, 820.8, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T04:03:48.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:03:48.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:03:48.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:03:30, diff=18.271477s, valid=True
2026-06-04T04:03:48.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:03:48.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T04:03:48.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:03:12, diff=36.274882s, valid=True
2026-06-04T04:03:48.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:03:48.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:03:48.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:03:26, diff=22.28276s, valid=True
2026-06-04T04:03:48.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:03:48.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:03:48.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:03:48.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:03:48.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:03:48.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-06-04T04:03:48.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:03:12, diff=36.286382s, valid=True
2026-06-04T04:03:48.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:03:48.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:03:48.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:03:48.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112825.287173s, valid=True
2026-06-04T04:03:48.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:03:48.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:03:48.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:03:48.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:03:48.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:03:48.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:03:48.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:03:48.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:03:48.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:03:48.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:03:48.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:03:48.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:03:48.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:03:48.611 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:03:48.851 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:03:49.199 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:03:49.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:03:49.302 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:03:49.302 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:03:49.459 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:03:49.459 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:04:19.488 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:04:19.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:04:19.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:04:19.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:04:19.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:04:19.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:04:19.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:04:19.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:04:19.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:04:19.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:04:19.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:04:19.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:04:19.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:04:22.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:04:22.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:04:22.696 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:04:22.696 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:04:22.708 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:04:22.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:04:22.724 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:04:22.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:04:22.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:04:22.725 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:04:22.725 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:04:22.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:04:22.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:04:22.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:04:22.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:04:22.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:04:23.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T04:04:23.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:04:23.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T04:04:23.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:04:23.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:04:23.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:04:23.058 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:04:23.129 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:04:01
2026-06-04T04:04:23.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87878, datetime.datetime(2026, 6, 4, 4, 4, 1), datetime.datetime(2026, 6, 4, 4, 4, 1), 'salt', 1.63, 100.54, None, 44.77, 126.27, -0.08, 820.68, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:04:23.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:04:23.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:04:23.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:04:01, diff=22.136576s, valid=True
2026-06-04T04:04:23.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:04:23.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T04:04:23.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:03:12, diff=71.140103s, valid=True
2026-06-04T04:04:23.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:04:23.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:04:23.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:03:56, diff=27.148253s, valid=True
2026-06-04T04:04:23.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:04:23.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:04:23.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:04:23.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:04:23.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:04:23.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T04:04:23.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:03:12, diff=71.151978s, valid=True
2026-06-04T04:04:23.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:04:23.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:04:23.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:04:23.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112860.152805s, valid=True
2026-06-04T04:04:23.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:04:23.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:04:23.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:04:23.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:04:23.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:04:23.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:04:23.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:04:23.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:04:23.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:04:23.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:04:23.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:04:23.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:04:23.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:04:23.547 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:04:23.763 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:04:24.113 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:04:24.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:04:24.217 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:04:24.217 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:04:24.372 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:04:24.372 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:04:54.402 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:04:54.403 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:04:54.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:04:54.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:04:54.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:04:55.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:04:55.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:04:55.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:04:55.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:04:55.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:04:55.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:04:55.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:04:55.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:04:58.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:04:58.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:04:58.032 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:04:58.032 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:04:58.044 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:04:58.059 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:04:58.061 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:04:58.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:04:58.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:04:58.062 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:04:58.062 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:04:58.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:04:58.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:04:58.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:04:58.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:04:58.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:04:58.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T04:04:58.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:04:58.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T04:04:58.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:04:58.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:04:58.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:04:58.394 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:04:58.469 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:04:32
2026-06-04T04:04:58.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87879, datetime.datetime(2026, 6, 4, 4, 4, 32), datetime.datetime(2026, 6, 4, 4, 4, 31), 'salt', 1.63, 100.54, None, 41.35, 131.42, -0.08, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:04:58.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:04:58.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:04:58.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:04:31, diff=27.477127s, valid=True
2026-06-04T04:04:58.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:04:58.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T04:04:58.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:03:12, diff=106.480643s, valid=True
2026-06-04T04:04:58.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:04:58.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:04:58.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:04:26, diff=32.488869s, valid=True
2026-06-04T04:04:58.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:04:58.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:04:58.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:04:58.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:04:58.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:04:58.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T04:04:58.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:03:12, diff=106.492633s, valid=True
2026-06-04T04:04:58.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:04:58.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:04:58.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:04:58.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112895.493441s, valid=True
2026-06-04T04:04:58.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:04:58.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:04:58.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:04:58.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:04:58.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:04:58.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:04:58.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:04:58.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:04:58.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:04:58.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:04:58.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:04:58.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:04:58.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:04:58.816 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:04:59.031 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:04:59.381 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:04:59.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:04:59.483 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:04:59.484 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:04:59.669 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:04:59.669 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:05:29.697 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:05:29.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:05:29.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:05:29.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:05:29.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:05:30.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:05:30.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:05:30.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:05:30.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:05:30.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:05:30.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:05:30.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:05:30.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:05:32.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:05:32.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:05:32.567 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:05:32.568 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:05:32.578 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:05:32.591 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:05:32.592 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:05:32.592 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:05:32.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:05:32.593 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:05:32.593 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:05:32.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:05:32.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:05:32.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:05:32.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:05:32.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:05:32.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:05:32.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:05:32.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:05:32.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:05:32.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:05:32.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:05:32.909 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:05:32.984 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:05:32
2026-06-04T04:05:32.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87881, datetime.datetime(2026, 6, 4, 4, 5, 32), datetime.datetime(2026, 6, 4, 4, 5, 31), 'salt', 1.67, 100.58, None, 35.71, 126.81, -0.08, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:05:32.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:05:32.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:05:32.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:05:31, diff=1.991268s, valid=True
2026-06-04T04:05:32.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:05:32.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:05:32.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:03:12, diff=140.994657s, valid=True
2026-06-04T04:05:32.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:05:32.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:05:33.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:05:27, diff=6.002472s, valid=True
2026-06-04T04:05:33.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:05:33.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:05:33.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:05:33.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:05:33.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:05:33.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:05:33.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:03:12, diff=141.006074s, valid=True
2026-06-04T04:05:33.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:05:33.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:05:33.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:05:33.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112930.006864s, valid=True
2026-06-04T04:05:33.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:05:33.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:05:33.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:05:33.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:05:33.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:05:33.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:05:33.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:05:33.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:05:33.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:05:33.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:05:33.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:05:33.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:05:33.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:05:33.396 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:05:33.612 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:05:33.966 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:05:34.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:05:34.071 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:05:34.072 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:05:34.261 [WARNING] [MainThread] [clean.py] [copy_files()] Error uploading images and files to the web server: rsync: [sender] read errors mapping "/home/io/development/weatherplots/weatherplots/images/atlas/ref_zp.dat": No data available (61)
WARNING: atlas/ref_zp.dat failed verification -- update discarded (will try again).
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1338) [sender=3.2.7]

2026-06-04T04:05:34.261 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:06:04.291 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:06:04.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:06:04.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:06:05.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:06:05.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:06:05.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:06:05.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:06:05.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:06:05.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:06:05.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:06:05.314 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:06:05.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:06:05.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:06:07.601 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:06:07.609 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:06:07.610 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:06:07.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:06:07.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:06:07.633 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:06:07.633 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:06:07.634 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:06:07.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:06:07.635 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:06:07.635 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:06:07.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:06:07.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:06:07.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:06:07.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:06:07.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:06:07.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T04:06:07.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:06:07.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T04:06:07.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:06:07.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:06:07.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:06:07.964 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:06:08.037 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:06:02
2026-06-04T04:06:08.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87882, datetime.datetime(2026, 6, 4, 4, 6, 2), datetime.datetime(2026, 6, 4, 4, 6, 2), 'salt', 1.77, 100.61, None, 37.33, 144.2, -0.08, 820.56, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:06:08.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:06:08.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:06:08.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:06:02, diff=6.044468s, valid=True
2026-06-04T04:06:08.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:06:08.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T04:06:08.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:03:12, diff=176.047955s, valid=True
2026-06-04T04:06:08.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:06:08.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:06:08.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:05:57, diff=11.056131s, valid=True
2026-06-04T04:06:08.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:06:08.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:06:08.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:06:08.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:06:08.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:06:08.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T04:06:08.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:03:12, diff=176.059884s, valid=True
2026-06-04T04:06:08.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:06:08.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:06:08.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:06:08.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=112965.060732s, valid=True
2026-06-04T04:06:08.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:06:08.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:06:08.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:06:08.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:06:08.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:06:08.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:06:08.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:06:08.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:06:08.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:06:08.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:06:08.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:06:08.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:06:08.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:06:08.382 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:06:08.598 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:06:08.948 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:06:09.051 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:06:09.051 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:06:09.051 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:06:09.244 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:06:09.245 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:06:39.275 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:06:39.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:06:39.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:06:39.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:06:39.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:06:40.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:06:40.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:06:40.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:06:40.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:06:40.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:06:40.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:06:40.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:06:40.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:06:42.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:06:42.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:06:42.591 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:06:42.591 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:06:42.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:06:42.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:06:42.613 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:06:42.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:06:42.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:06:42.615 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:06:42.615 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:06:42.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:06:42.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:06:42.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:06:42.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:06:42.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:06:42.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T04:06:42.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:06:42.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T04:06:42.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:06:42.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:06:42.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:06:42.947 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:06:43.016 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:06:33
2026-06-04T04:06:43.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87883, datetime.datetime(2026, 6, 4, 4, 6, 33), datetime.datetime(2026, 6, 4, 4, 6, 32), 'salt', 1.73, 100.51, None, 47.46, 135.69, -0.08, 820.74, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T04:06:43.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:06:43.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:06:43.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:06:32, diff=11.022142s, valid=True
2026-06-04T04:06:43.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:06:43.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T04:06:43.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:03:12, diff=211.025011s, valid=True
2026-06-04T04:06:43.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:06:43.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:06:43.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:06:27, diff=16.031792s, valid=True
2026-06-04T04:06:43.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:06:43.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:06:43.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:06:43.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:06:43.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:06:43.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T04:06:43.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:03:12, diff=211.034828s, valid=True
2026-06-04T04:06:43.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:06:43.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:06:43.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:06:43.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113000.035475s, valid=True
2026-06-04T04:06:43.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:06:43.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:06:43.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:06:43.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:06:43.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:06:43.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:06:43.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:06:43.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:06:43.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:06:43.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:06:43.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:06:43.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:06:43.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:06:43.347 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:06:43.561 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:06:43.908 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:06:44.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:06:44.011 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:06:44.011 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:06:44.101 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:06:44.102 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:07:14.125 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:07:14.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:07:14.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:07:14.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:07:14.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:07:14.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:07:14.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:07:14.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:07:14.618 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:07:14.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:07:14.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:07:14.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:07:14.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:07:17.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:07:17.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:07:17.083 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:07:17.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:07:17.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:07:17.106 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:07:17.107 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:07:17.107 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:07:17.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:07:17.108 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:07:17.108 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:07:17.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:07:17.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:07:17.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:07:17.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:07:17.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:07:17.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:07:17.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:07:17.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:07:17.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:07:17.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:07:17.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:07:17.462 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:07:17.532 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:07:03
2026-06-04T04:07:17.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87884, datetime.datetime(2026, 6, 4, 4, 7, 3), datetime.datetime(2026, 6, 4, 4, 7, 2), 'salt', 1.7, 100.61, None, 46.61, 139.45, -0.09, 820.68, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T04:07:17.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:07:17.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:07:17.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:07:02, diff=15.538224s, valid=True
2026-06-04T04:07:17.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:07:17.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:07:17.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:03:12, diff=245.541151s, valid=True
2026-06-04T04:07:17.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:07:17.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:07:17.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:06:57, diff=20.548274s, valid=True
2026-06-04T04:07:17.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:07:17.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:07:17.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:07:17.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:07:17.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:07:17.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:07:17.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:03:12, diff=245.551983s, valid=True
2026-06-04T04:07:17.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:07:17.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:07:17.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:07:17.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113034.552804s, valid=True
2026-06-04T04:07:17.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:07:17.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:07:17.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:07:17.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:07:17.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:07:17.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:07:17.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:07:17.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:07:17.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:07:17.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:07:17.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:07:17.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:07:17.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:07:17.878 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:07:18.155 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:07:18.499 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:07:18.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:07:18.601 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:07:18.601 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:07:18.831 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:07:18.831 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:07:48.861 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:07:48.862 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:07:48.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:07:49.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:07:49.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:07:49.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:07:49.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:07:49.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:07:49.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:07:49.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:07:49.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:07:49.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:07:49.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:07:51.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:07:51.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:07:51.612 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:07:51.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:07:51.623 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:07:51.635 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:07:51.636 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:07:51.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:07:51.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:07:51.637 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:07:51.637 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:07:51.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:07:51.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:07:51.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:07:51.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:07:51.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:07:51.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:07:51.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:07:51.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:07:51.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:07:51.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:07:51.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:07:51.973 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:07:52.043 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:07:33
2026-06-04T04:07:52.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87885, datetime.datetime(2026, 6, 4, 4, 7, 33), datetime.datetime(2026, 6, 4, 4, 7, 32), 'salt', 1.63, 100.51, None, 42.13, 119.46, -0.08, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:07:52.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:07:52.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:07:52.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:07:32, diff=20.053063s, valid=True
2026-06-04T04:07:52.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:07:52.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:07:52.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:03:12, diff=280.057652s, valid=True
2026-06-04T04:07:52.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:07:52.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:07:52.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:07:28, diff=24.068114s, valid=True
2026-06-04T04:07:52.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:07:52.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:07:52.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:07:52.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:07:52.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:07:52.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:07:52.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:03:12, diff=280.073074s, valid=True
2026-06-04T04:07:52.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:07:52.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:07:52.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:07:52.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113069.073956s, valid=True
2026-06-04T04:07:52.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:07:52.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:07:52.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:07:52.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:07:52.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:07:52.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:07:52.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:07:52.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:07:52.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:07:52.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:07:52.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:07:52.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:07:52.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:07:52.395 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:07:52.609 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:07:52.956 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:07:53.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:07:53.057 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:07:53.057 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:07:53.279 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:07:53.279 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:08:23.309 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:08:23.309 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:08:23.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:08:23.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:08:23.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:08:23.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:08:23.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:08:23.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:08:23.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:08:23.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:08:23.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:08:23.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:08:23.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:08:26.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:08:26.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:08:26.296 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:08:26.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:08:26.307 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:08:26.320 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:08:26.321 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:08:26.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:08:26.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:08:26.322 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:08:26.322 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:08:26.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:08:26.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:08:26.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:08:26.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:08:26.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:08:26.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:08:26.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:08:26.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:08:26.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:08:26.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:08:26.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:08:26.639 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:08:26.716 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:08:03
2026-06-04T04:08:26.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87886, datetime.datetime(2026, 6, 4, 4, 8, 3), datetime.datetime(2026, 6, 4, 4, 8, 3), 'salt', 1.7, 100.64, None, 45.9, 134.31, -0.09, 820.74, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T04:08:26.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:08:26.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:08:26.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:08:03, diff=23.724094s, valid=True
2026-06-04T04:08:26.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:08:26.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:08:26.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:03:12, diff=314.727516s, valid=True
2026-06-04T04:08:26.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:08:26.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:08:26.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:07:58, diff=28.735287s, valid=True
2026-06-04T04:08:26.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:08:26.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:08:26.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:08:26.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:08:26.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:08:26.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:08:26.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:03:12, diff=314.738886s, valid=True
2026-06-04T04:08:26.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:08:26.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:08:26.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:08:26.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113103.739672s, valid=True
2026-06-04T04:08:26.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:08:26.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:08:26.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:08:26.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:08:26.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:08:26.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:08:26.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:08:26.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:08:26.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:08:26.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:08:26.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:08:27.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:08:27.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:08:27.136 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:08:27.349 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:08:27.695 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:08:27.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:08:27.797 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:08:27.797 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:08:28.013 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:08:28.013 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:08:58.028 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:08:58.028 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:08:58.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:08:58.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:08:58.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:08:58.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:08:58.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:08:58.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:08:58.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:08:58.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:08:58.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:08:58.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:08:58.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:09:01.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:09:01.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:09:01.293 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:09:01.293 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:09:01.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:09:01.318 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:09:01.319 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:09:01.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:09:01.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:09:01.320 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:09:01.320 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:09:01.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:09:01.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:09:01.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:09:01.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:09:01.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:09:01.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:09:01.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:09:01.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:09:01.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:09:01.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:09:01.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:09:01.662 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:09:01.732 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:08:34
2026-06-04T04:09:01.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87887, datetime.datetime(2026, 6, 4, 4, 8, 34), datetime.datetime(2026, 6, 4, 4, 8, 33), 'salt', 1.63, 100.61, None, 52.61, 125.87, -0.09, 820.56, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T04:09:01.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:09:01.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:09:01.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:08:33, diff=28.739088s, valid=True
2026-06-04T04:09:01.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:09:01.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:09:01.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:09:12, diff=-10.257681s, valid=True
2026-06-04T04:09:01.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:09:01.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:09:01.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:08:28, diff=33.749995s, valid=True
2026-06-04T04:09:01.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:09:01.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:09:01.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:09:01.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:09:01.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:09:01.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:09:01.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:09:12, diff=-10.246669s, valid=True
2026-06-04T04:09:01.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:09:01.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:09:01.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:09:01.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113138.754079s, valid=True
2026-06-04T04:09:01.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:09:01.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:09:01.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:09:01.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:09:01.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:09:01.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:09:01.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:09:01.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:09:01.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:09:01.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:09:01.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:09:01.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:09:02.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:09:02.072 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:09:02.301 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:09:02.647 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:09:02.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:09:02.749 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:09:02.749 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:09:02.939 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:09:02.940 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:09:32.946 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:09:32.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:09:32.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:09:33.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:09:33.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:09:33.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:09:33.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:09:33.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:09:33.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:09:33.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:09:33.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:09:33.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:09:33.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:09:35.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:09:35.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:09:35.798 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:09:35.798 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:09:35.808 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:09:35.820 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:09:35.820 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:09:35.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:09:35.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:09:35.821 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:09:35.821 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:09:35.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:09:35.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:09:35.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:09:36.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:09:36.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:09:36.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:09:36.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:09:36.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:09:36.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:09:36.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:09:36.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:09:36.155 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:09:36.227 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:09:34
2026-06-04T04:09:36.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87889, datetime.datetime(2026, 6, 4, 4, 9, 34), datetime.datetime(2026, 6, 4, 4, 9, 33), 'salt', 1.7, 100.61, None, 50.17, 134.54, -0.09, 820.62, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T04:09:36.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:09:36.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:09:36.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:09:33, diff=3.234691s, valid=True
2026-06-04T04:09:36.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:09:36.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:09:36.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:10:12, diff=-35.76175s, valid=True
2026-06-04T04:09:36.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:09:36.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:09:36.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:09:29, diff=7.246564s, valid=True
2026-06-04T04:09:36.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:09:36.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:09:36.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:09:36.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:09:36.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:09:36.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:09:36.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:10:12, diff=-35.749607s, valid=True
2026-06-04T04:09:36.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:09:36.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:09:36.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:09:36.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113173.251209s, valid=True
2026-06-04T04:09:36.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:09:36.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:09:36.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:09:36.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:09:36.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:09:36.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:09:36.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:09:36.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:09:36.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:09:36.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:09:36.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:09:36.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:09:36.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:09:36.644 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:09:36.859 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:09:37.209 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:09:37.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:09:37.312 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:09:37.312 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:09:37.464 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:09:37.464 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:10:07.494 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:10:07.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:10:07.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:10:07.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:10:07.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:10:07.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:10:07.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:10:07.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:10:07.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:10:07.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:10:07.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:10:07.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:10:07.926 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:10:10.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:10:10.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:10:10.333 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:10:10.333 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:10:10.347 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:10:10.360 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:10:10.361 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:10:10.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:10:10.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:10:10.362 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:10:10.362 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:10:10.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:10:10.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:10:10.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:10:10.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:10:10.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:10:10.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:10:10.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:10:10.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:10:10.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:10:10.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:10:10.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:10:10.693 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:10:10.766 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:10:04
2026-06-04T04:10:10.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87890, datetime.datetime(2026, 6, 4, 4, 10, 4), datetime.datetime(2026, 6, 4, 4, 10, 4), 'salt', 1.7, 100.64, None, 49.29, 136.7, -0.09, 820.74, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T04:10:10.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:10:10.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:10:10.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:10:04, diff=6.773595s, valid=True
2026-06-04T04:10:10.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:10:10.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:10:10.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:10:12, diff=-1.222896s, valid=True
2026-06-04T04:10:10.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:10:10.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:10:10.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:09:59, diff=11.785478s, valid=True
2026-06-04T04:10:10.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:10:10.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:10:10.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:10:10.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:10:10.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:10:10.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:10:10.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:10:12, diff=-1.210717s, valid=True
2026-06-04T04:10:10.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:10:10.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:10:10.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:10:10.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113207.790105s, valid=True
2026-06-04T04:10:10.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:10:10.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:10:10.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:10:10.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:10:10.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:10:10.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:10:10.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:10:10.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:10:10.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:10:10.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:10:10.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:10:11.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:10:11.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:10:11.108 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:10:11.321 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:10:11.672 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:10:11.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:10:11.774 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:10:11.774 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:10:11.864 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:10:11.864 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:10:41.886 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:10:41.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:10:41.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:10:42.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:10:42.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:10:42.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:10:42.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:10:42.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:10:42.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:10:42.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:10:42.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:10:42.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:10:42.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:10:44.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:10:44.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:10:44.945 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:10:44.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:10:44.957 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:10:44.969 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:10:44.970 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:10:44.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:10:44.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:10:44.971 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:10:44.971 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:10:44.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:10:45.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:10:45.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:10:45.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:10:45.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:10:45.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:10:45.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:10:45.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:10:45.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:10:45.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:10:45.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:10:45.328 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:10:45.402 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:10:35
2026-06-04T04:10:45.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87891, datetime.datetime(2026, 6, 4, 4, 10, 35), datetime.datetime(2026, 6, 4, 4, 10, 34), 'salt', 1.73, 100.61, None, 46.26, 137.53, -0.09, 820.68, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T04:10:45.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:10:45.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:10:45.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:10:34, diff=11.41026s, valid=True
2026-06-04T04:10:45.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:10:45.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:10:45.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:11:12, diff=-26.586146s, valid=True
2026-06-04T04:10:45.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:10:45.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:10:45.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:10:29, diff=16.422213s, valid=True
2026-06-04T04:10:45.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:10:45.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:10:45.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:10:45.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:10:45.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:10:45.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:10:45.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:11:12, diff=-26.573963s, valid=True
2026-06-04T04:10:45.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:10:45.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:10:45.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:10:45.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113242.426875s, valid=True
2026-06-04T04:10:45.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:10:45.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:10:45.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:10:45.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:10:45.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:10:45.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:10:45.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:10:45.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:10:45.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:10:45.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:10:45.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:10:45.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:10:45.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:10:45.745 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:10:45.958 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:10:46.304 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:10:46.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:10:46.408 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:10:46.408 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:10:46.601 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:10:46.601 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:11:16.623 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:11:16.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:11:16.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:11:16.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:11:16.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:11:17.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:11:17.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:11:17.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:11:17.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:11:17.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:11:17.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:11:17.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:11:17.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:11:19.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:11:19.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:11:19.633 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:11:19.633 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:11:19.644 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:11:19.657 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:11:19.657 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:11:19.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:11:19.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:11:19.658 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:11:19.659 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:11:19.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:11:19.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:11:19.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:11:19.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:11:19.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:11:19.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:11:19.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:11:19.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:11:19.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:11:19.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:11:19.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:11:19.985 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:11:20.060 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:11:05
2026-06-04T04:11:20.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87892, datetime.datetime(2026, 6, 4, 4, 11, 5), datetime.datetime(2026, 6, 4, 4, 11, 4), 'salt', 1.6, 100.54, None, 52.39, 133.44, -0.08, 820.62, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T04:11:20.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:11:20.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:11:20.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:11:04, diff=16.066809s, valid=True
2026-06-04T04:11:20.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:11:20.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:11:20.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:11:12, diff=8.06999s, valid=True
2026-06-04T04:11:20.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:11:20.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:11:20.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:10:59, diff=21.077265s, valid=True
2026-06-04T04:11:20.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:11:20.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:11:20.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:11:20.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:11:20.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:11:20.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:11:20.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:11:12, diff=8.080845s, valid=True
2026-06-04T04:11:20.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:11:20.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:11:20.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:11:20.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113277.081598s, valid=True
2026-06-04T04:11:20.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:11:20.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:11:20.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:11:20.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:11:20.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:11:20.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:11:20.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:11:20.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:11:20.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:11:20.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:11:20.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:11:20.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:11:20.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:11:20.397 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:11:20.672 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:11:21.015 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:11:21.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:11:21.119 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:11:21.119 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:11:21.285 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:11:21.285 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:11:51.293 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:11:51.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:11:51.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:11:51.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:11:51.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:11:51.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:11:51.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:11:51.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:11:51.849 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:11:51.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:11:51.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:11:51.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:11:51.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:11:54.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:11:54.135 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:11:54.136 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:11:54.136 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:11:54.144 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:11:54.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:11:54.158 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:11:54.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:11:54.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:11:54.159 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:11:54.159 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:11:54.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:11:54.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:11:54.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:11:54.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:11:54.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:11:54.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:11:54.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:11:54.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:11:54.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:11:54.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:11:54.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:11:54.462 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:11:54.531 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:11:35
2026-06-04T04:11:54.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87893, datetime.datetime(2026, 6, 4, 4, 11, 35), datetime.datetime(2026, 6, 4, 4, 11, 34), 'salt', 1.6, 100.64, None, 55.43, 129.94, -0.09, 820.5, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T04:11:54.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:11:54.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:11:54.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:11:34, diff=20.537108s, valid=True
2026-06-04T04:11:54.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:11:54.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:11:54.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:12:12, diff=-17.460094s, valid=True
2026-06-04T04:11:54.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:11:54.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:11:54.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:11:30, diff=24.546361s, valid=True
2026-06-04T04:11:54.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:11:54.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:11:54.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:11:54.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:11:54.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:11:54.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:11:54.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:12:12, diff=-17.450662s, valid=True
2026-06-04T04:11:54.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:11:54.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:11:54.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:11:54.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113311.549985s, valid=True
2026-06-04T04:11:54.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:11:54.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:11:54.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:11:54.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:11:54.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:11:54.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:11:54.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:11:54.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:11:54.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:11:54.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:11:54.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:11:54.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:11:54.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:11:54.862 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:11:55.074 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:11:55.418 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:11:55.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:11:55.519 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:11:55.519 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:11:55.814 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:11:55.814 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:12:25.822 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:12:25.822 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:12:25.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:12:26.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:12:26.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:12:26.601 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:12:26.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:12:26.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:12:26.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:12:26.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:12:26.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:12:26.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:12:26.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:12:29.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:12:29.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:12:29.058 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:12:29.058 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:12:29.070 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:12:29.083 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:12:29.083 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:12:29.084 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:12:29.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:12:29.084 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:12:29.084 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:12:29.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:12:29.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:12:29.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:12:29.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:12:29.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:12:29.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:12:29.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:12:29.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:12:29.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:12:29.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:12:29.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:12:29.420 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:12:29.490 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:12:05
2026-06-04T04:12:29.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87894, datetime.datetime(2026, 6, 4, 4, 12, 5), datetime.datetime(2026, 6, 4, 4, 12, 5), 'salt', 1.57, 100.61, None, 48.94, 135.74, -0.08, 820.74, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T04:12:29.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:12:29.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:12:29.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:12:05, diff=24.49768s, valid=True
2026-06-04T04:12:29.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:12:29.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:12:29.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:12:12, diff=17.50116s, valid=True
2026-06-04T04:12:29.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:12:29.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:12:29.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:12:00, diff=29.509329s, valid=True
2026-06-04T04:12:29.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:12:29.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:12:29.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:12:29.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:12:29.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:12:29.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:12:29.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:12:12, diff=17.513068s, valid=True
2026-06-04T04:12:29.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:12:29.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:12:29.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:12:29.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113346.513908s, valid=True
2026-06-04T04:12:29.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:12:29.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:12:29.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:12:29.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:12:29.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:12:29.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:12:29.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:12:29.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:12:29.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:12:29.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:12:29.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:12:29.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:12:29.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:12:29.912 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:12:30.142 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:12:30.489 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:12:30.591 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:12:30.591 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:12:30.591 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:12:30.681 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:12:30.681 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:13:00.712 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:13:00.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:13:00.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:13:00.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:13:00.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:13:01.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:13:01.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:13:01.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:13:01.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:13:01.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:13:01.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:13:01.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:13:01.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:13:03.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:13:03.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:13:03.595 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:13:03.595 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:13:03.606 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:13:03.623 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:13:03.624 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:13:03.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:13:03.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:13:03.625 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:13:03.626 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:13:03.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:13:03.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:13:03.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:13:03.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:13:03.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:13:03.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:13:03.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:13:03.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:13:03.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:13:03.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:13:03.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:13:03.907 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:13:03.977 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:12:36
2026-06-04T04:13:03.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87895, datetime.datetime(2026, 6, 4, 4, 12, 36), datetime.datetime(2026, 6, 4, 4, 12, 35), 'salt', 1.57, 100.61, None, 44.28, 130.99, -0.08, 820.68, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:13:03.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:13:03.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:13:03.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:12:35, diff=28.984493s, valid=True
2026-06-04T04:13:03.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:13:03.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:13:03.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:13:12, diff=-8.01231s, valid=True
2026-06-04T04:13:03.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:13:03.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:13:03.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:12:30, diff=33.995199s, valid=True
2026-06-04T04:13:03.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:13:03.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:13:03.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:13:03.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:13:03.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:13:03.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:13:03.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:13:12, diff=-8.001393s, valid=True
2026-06-04T04:13:03.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:13:03.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:13:03.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:13:03.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113380.999351s, valid=True
2026-06-04T04:13:04.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:13:04.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:13:04.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:13:04.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:13:04.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:13:04.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:13:04.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:13:04.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:13:04.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:13:04.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:13:04.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:13:04.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:13:04.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:13:04.316 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:13:04.530 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:13:04.877 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:13:04.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:13:04.979 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:13:04.980 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:13:05.074 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:13:05.074 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:13:35.095 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:13:35.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:13:35.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:13:35.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:13:35.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:13:35.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:13:35.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:13:35.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:13:35.633 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:13:35.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:13:35.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:13:35.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:13:35.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:13:38.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:13:38.050 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:13:38.050 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:13:38.050 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:13:38.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:13:38.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:13:38.073 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:13:38.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:13:38.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:13:38.073 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:13:38.073 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:13:38.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:13:38.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:13:38.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:13:38.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:13:38.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:13:38.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:13:38.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:13:38.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:13:38.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:13:38.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:13:38.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:13:38.339 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:13:38.410 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:13:36
2026-06-04T04:13:38.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87897, datetime.datetime(2026, 6, 4, 4, 13, 36), datetime.datetime(2026, 6, 4, 4, 13, 35), 'salt', 1.6, 100.64, None, 48.48, 136.23, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T04:13:38.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:13:38.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:13:38.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:13:35, diff=3.417103s, valid=True
2026-06-04T04:13:38.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:13:38.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:13:38.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:14:12, diff=-33.579674s, valid=True
2026-06-04T04:13:38.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:13:38.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:13:38.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:13:30, diff=8.427914s, valid=True
2026-06-04T04:13:38.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:13:38.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:13:38.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:13:38.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:13:38.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:13:38.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:13:38.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:14:12, diff=-33.568629s, valid=True
2026-06-04T04:13:38.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:13:38.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:13:38.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:13:38.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113415.432115s, valid=True
2026-06-04T04:13:38.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:13:38.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:13:38.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:13:38.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:13:38.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:13:38.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:13:38.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:13:38.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:13:38.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:13:38.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:13:38.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:13:38.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:13:38.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:13:38.838 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:13:39.053 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:13:39.400 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:13:39.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:13:39.502 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:13:39.502 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:13:39.690 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:13:39.691 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:14:09.704 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:14:09.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:14:09.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:14:09.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:14:09.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:14:10.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:14:10.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:14:10.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:14:10.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:14:10.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:14:10.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:14:10.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:14:10.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:14:12.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:14:12.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:14:12.703 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:14:12.703 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:14:12.714 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:14:12.727 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:14:12.727 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:14:12.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:14:12.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:14:12.728 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:14:12.729 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:14:12.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:14:12.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:14:12.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:14:12.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:14:12.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:14:13.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:14:13.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:14:13.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:14:13.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:14:13.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:14:13.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:14:13.063 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:14:13.135 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:14:06
2026-06-04T04:14:13.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87898, datetime.datetime(2026, 6, 4, 4, 14, 6), datetime.datetime(2026, 6, 4, 4, 14, 6), 'salt', 1.57, 100.61, None, 42.8, 121.79, -0.08, 820.62, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:14:13.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:14:13.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:14:13.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:14:06, diff=7.1426s, valid=True
2026-06-04T04:14:13.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:14:13.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:14:13.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:14:12, diff=1.146087s, valid=True
2026-06-04T04:14:13.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:14:13.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:14:13.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:14:01, diff=12.154439s, valid=True
2026-06-04T04:14:13.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:14:13.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:14:13.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:14:13.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:14:13.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:14:13.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:14:13.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:14:12, diff=1.158269s, valid=True
2026-06-04T04:14:13.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:14:13.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:14:13.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:14:13.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113450.159087s, valid=True
2026-06-04T04:14:13.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:14:13.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:14:13.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:14:13.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:14:13.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:14:13.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:14:13.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:14:13.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:14:13.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:14:13.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:14:13.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:14:13.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:14:13.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:14:13.478 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:14:13.691 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:14:14.038 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:14:14.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:14:14.140 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:14:14.140 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:14:14.326 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:14:14.326 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:14:44.347 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:14:44.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:14:44.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:14:44.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:14:44.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:14:45.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:14:45.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:14:45.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:14:45.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:14:45.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:14:45.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:14:45.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:14:45.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:14:47.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:14:47.571 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:14:47.572 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:14:47.572 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:14:47.584 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:14:47.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:14:47.595 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:14:47.595 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:14:47.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:14:47.596 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:14:47.596 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:14:47.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:14:47.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:14:47.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:14:47.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:14:47.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:14:47.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:14:47.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:14:47.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:14:47.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:14:47.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:14:47.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:14:47.927 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:14:47.998 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:14:37
2026-06-04T04:14:47.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87899, datetime.datetime(2026, 6, 4, 4, 14, 37), datetime.datetime(2026, 6, 4, 4, 14, 36), 'salt', 1.57, 100.61, None, 53.88, 120.73, -0.08, 820.62, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T04:14:47.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:14:47.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:14:48.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:14:36, diff=12.005733s, valid=True
2026-06-04T04:14:48.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:14:48.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:14:48.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:15:12, diff=-23.990789s, valid=True
2026-06-04T04:14:48.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:14:48.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:14:48.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:14:31, diff=17.01733s, valid=True
2026-06-04T04:14:48.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:14:48.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:14:48.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:14:48.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:14:48.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:14:48.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:14:48.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:15:12, diff=-23.97896s, valid=True
2026-06-04T04:14:48.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:14:48.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:14:48.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:14:48.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113485.021848s, valid=True
2026-06-04T04:14:48.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:14:48.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:14:48.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:14:48.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:14:48.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:14:48.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:14:48.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:14:48.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:14:48.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:14:48.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:14:48.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:14:48.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:14:48.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:14:48.343 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:14:48.557 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:14:48.904 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:14:49.008 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:14:49.008 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:14:49.008 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:14:49.242 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:14:49.242 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:15:19.254 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:15:19.254 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:15:19.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:15:19.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:15:19.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:15:19.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:15:19.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:15:19.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:15:19.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:15:19.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:15:19.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:15:19.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:15:19.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:15:22.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:15:22.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:15:22.699 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:15:22.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:15:22.708 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:15:22.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:15:22.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:15:22.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:15:22.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:15:22.721 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:15:22.721 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:15:22.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:15:22.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:15:22.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:15:22.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:15:22.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:15:22.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:15:22.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:15:22.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:15:22.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:15:22.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:15:22.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:15:22.995 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:15:23.064 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:15:07
2026-06-04T04:15:23.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87900, datetime.datetime(2026, 6, 4, 4, 15, 7), datetime.datetime(2026, 6, 4, 4, 15, 6), 'salt', 1.5, 100.58, None, 46.89, 129.19, -0.08, 820.74, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T04:15:23.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:15:23.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:15:23.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:15:06, diff=17.071688s, valid=True
2026-06-04T04:15:23.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:15:23.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:15:23.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:15:12, diff=11.074865s, valid=True
2026-06-04T04:15:23.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:15:23.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:15:23.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:15:01, diff=22.082347s, valid=True
2026-06-04T04:15:23.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:15:23.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:15:23.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:15:23.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:15:23.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:15:23.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:15:23.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:15:12, diff=11.08584s, valid=True
2026-06-04T04:15:23.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:15:23.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:15:23.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:15:23.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113520.086596s, valid=True
2026-06-04T04:15:23.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:15:23.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:15:23.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:15:23.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:15:23.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:15:23.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:15:23.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:15:23.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:15:23.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:15:23.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:15:23.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:15:23.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:15:23.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:15:23.404 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:15:23.678 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:15:24.023 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:15:24.129 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:15:24.129 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:15:24.129 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:15:24.314 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:15:24.314 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:15:54.323 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:15:54.323 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:15:54.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:15:54.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:15:54.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:15:54.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:15:54.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:15:54.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:15:54.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:15:54.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:15:54.746 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:15:54.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:15:54.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:15:57.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:15:57.161 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:15:57.162 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:15:57.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:15:57.173 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:15:57.186 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:15:57.187 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:15:57.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:15:57.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:15:57.188 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:15:57.188 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:15:57.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:15:57.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:15:57.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:15:57.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:15:57.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:15:57.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:15:57.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:15:57.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:15:57.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:15:57.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:15:57.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:15:57.521 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:15:57.590 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:15:37
2026-06-04T04:15:57.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87901, datetime.datetime(2026, 6, 4, 4, 15, 37), datetime.datetime(2026, 6, 4, 4, 15, 37), 'salt', 1.6, 100.61, None, 41.07, 131.56, -0.09, 820.68, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:15:57.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:15:57.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:15:57.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:15:37, diff=20.597441s, valid=True
2026-06-04T04:15:57.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:15:57.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:15:57.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:16:12, diff=-14.399063s, valid=True
2026-06-04T04:15:57.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:15:57.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:15:57.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:15:32, diff=25.609238s, valid=True
2026-06-04T04:15:57.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:15:57.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:15:57.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:15:57.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:15:57.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:15:57.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:15:57.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:16:12, diff=-14.386108s, valid=True
2026-06-04T04:15:57.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:15:57.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:15:57.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:15:57.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113554.615487s, valid=True
2026-06-04T04:15:57.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:15:57.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:15:57.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:15:57.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:15:57.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:15:57.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:15:57.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:15:57.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:15:57.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:15:57.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:15:57.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:15:57.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:15:57.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:15:57.944 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:15:58.160 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:15:58.511 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:15:58.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:15:58.614 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:15:58.614 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:15:58.855 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:15:58.856 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:16:28.886 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:16:28.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:16:28.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:16:29.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:16:29.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:16:29.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:16:29.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:16:29.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:16:29.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:16:29.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:16:29.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:16:29.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:16:29.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:16:32.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:16:32.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:16:32.099 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:16:32.099 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:16:32.111 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:16:32.123 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:16:32.124 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:16:32.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:16:32.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:16:32.125 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:16:32.125 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:16:32.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:16:32.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:16:32.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:16:32.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:16:32.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:16:32.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:16:32.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:16:32.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:16:32.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:16:32.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:16:32.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:16:32.453 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:16:32.524 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:16:08
2026-06-04T04:16:32.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87902, datetime.datetime(2026, 6, 4, 4, 16, 8), datetime.datetime(2026, 6, 4, 4, 16, 7), 'salt', 1.57, 100.61, None, 44.17, 134.85, -0.08, 820.68, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:16:32.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:16:32.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:16:32.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:16:07, diff=25.531686s, valid=True
2026-06-04T04:16:32.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:16:32.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:16:32.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:16:12, diff=20.535084s, valid=True
2026-06-04T04:16:32.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:16:32.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:16:32.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:16:02, diff=30.543129s, valid=True
2026-06-04T04:16:32.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:16:32.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:16:32.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:16:32.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:16:32.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:16:32.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:16:32.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:16:12, diff=20.546712s, valid=True
2026-06-04T04:16:32.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:16:32.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:16:32.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:16:32.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113589.547484s, valid=True
2026-06-04T04:16:32.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:16:32.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:16:32.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:16:32.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:16:32.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:16:32.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:16:32.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:16:32.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:16:32.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:16:32.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:16:32.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:16:32.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:16:32.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:16:32.938 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:16:33.153 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:16:33.504 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:16:33.606 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:16:33.606 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:16:33.606 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:16:33.794 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:16:33.794 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:17:03.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:17:03.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:17:03.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:17:03.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:17:03.944 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:17:04.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:17:04.181 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:17:04.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:17:04.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:17:04.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:17:04.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:17:04.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:17:04.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:17:06.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:17:06.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:17:06.622 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:17:06.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:17:06.632 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:17:06.644 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:17:06.645 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:17:06.645 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:17:06.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:17:06.646 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:17:06.646 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:17:06.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:17:06.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:17:06.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:17:06.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:17:06.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:17:06.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:17:06.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:17:06.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:17:06.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:17:06.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:17:06.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:17:06.996 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:17:07.068 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:16:38
2026-06-04T04:17:07.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87903, datetime.datetime(2026, 6, 4, 4, 16, 38), datetime.datetime(2026, 6, 4, 4, 16, 37), 'salt', 1.53, 100.58, None, 46.96, 123.92, -0.09, 820.74, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T04:17:07.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:17:07.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:17:07.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:16:37, diff=30.075972s, valid=True
2026-06-04T04:17:07.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:17:07.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:17:07.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:17:12, diff=-4.920512s, valid=True
2026-06-04T04:17:07.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:17:07.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:17:07.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:16:32, diff=35.087841s, valid=True
2026-06-04T04:17:07.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:17:07.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:17:07.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:17:07.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:17:07.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:17:07.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:17:07.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:17:12, diff=-4.908514s, valid=True
2026-06-04T04:17:07.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:17:07.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:17:07.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:17:07.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113624.092305s, valid=True
2026-06-04T04:17:07.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:17:07.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:17:07.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:17:07.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:17:07.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:17:07.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:17:07.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:17:07.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:17:07.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:17:07.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:17:07.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:17:07.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:17:07.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:17:07.410 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:17:07.623 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:17:07.972 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:17:08.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:17:08.075 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:17:08.075 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:17:08.268 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:17:08.268 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:17:38.298 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:17:38.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:17:38.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:17:38.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:17:38.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:17:38.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:17:38.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:17:38.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:17:38.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:17:38.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:17:38.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:17:38.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:17:38.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:17:41.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:17:41.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:17:41.015 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:17:41.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:17:41.026 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:17:41.039 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:17:41.039 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:17:41.040 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:17:41.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:17:41.040 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:17:41.041 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:17:41.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:17:41.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:17:41.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:17:41.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:17:41.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:17:41.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:17:41.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:17:41.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:17:41.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:17:41.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:17:41.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:17:41.382 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:17:41.460 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:17:38
2026-06-04T04:17:41.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87905, datetime.datetime(2026, 6, 4, 4, 17, 38), datetime.datetime(2026, 6, 4, 4, 17, 37), 'salt', 1.6, 100.54, None, 34.68, 140.25, -0.08, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:17:41.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:17:41.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:17:41.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:17:37, diff=4.467985s, valid=True
2026-06-04T04:17:41.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:17:41.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:17:41.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:18:12, diff=-30.528666s, valid=True
2026-06-04T04:17:41.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:17:41.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:17:41.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:17:33, diff=8.479304s, valid=True
2026-06-04T04:17:41.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:17:41.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:17:41.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:17:41.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:17:41.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:17:41.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:17:41.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:18:12, diff=-30.516935s, valid=True
2026-06-04T04:17:41.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:17:41.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:17:41.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:17:41.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113658.483863s, valid=True
2026-06-04T04:17:41.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:17:41.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:17:41.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:17:41.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:17:41.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:17:41.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:17:41.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:17:41.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:17:41.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:17:41.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:17:41.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:17:41.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:17:41.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:17:41.871 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:17:42.086 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:17:42.437 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:17:42.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:17:42.539 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:17:42.539 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:17:42.730 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:17:42.730 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:18:12.760 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:18:12.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:18:12.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:18:13.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:18:13.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:18:13.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:18:13.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:18:13.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:18:13.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:18:13.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:18:13.534 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:18:13.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:18:13.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:18:15.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:18:15.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:18:15.995 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:18:15.995 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:18:16.005 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:18:16.018 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:18:16.018 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:18:16.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:18:16.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:18:16.020 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:18:16.020 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:18:16.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:18:16.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:18:16.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:18:16.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:18:16.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:18:16.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:18:16.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:18:16.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:18:16.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:18:16.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:18:16.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:18:16.365 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:18:16.447 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:18:08
2026-06-04T04:18:16.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87906, datetime.datetime(2026, 6, 4, 4, 18, 8), datetime.datetime(2026, 6, 4, 4, 18, 8), 'salt', 1.6, 100.64, None, 42.59, 136.84, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:18:16.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:18:16.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:18:16.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:18:08, diff=8.455419s, valid=True
2026-06-04T04:18:16.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:18:16.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:18:16.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:18:12, diff=4.458922s, valid=True
2026-06-04T04:18:16.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:18:16.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:18:16.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:18:03, diff=13.467401s, valid=True
2026-06-04T04:18:16.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:18:16.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:18:16.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:18:16.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:18:16.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:18:16.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:18:16.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:18:12, diff=4.471293s, valid=True
2026-06-04T04:18:16.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:18:16.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:18:16.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:18:16.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113693.472121s, valid=True
2026-06-04T04:18:16.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:18:16.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:18:16.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:18:16.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:18:16.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:18:16.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:18:16.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:18:16.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:18:16.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:18:16.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:18:16.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:18:16.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:18:16.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:18:16.791 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:18:17.005 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:18:17.351 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:18:17.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:18:17.453 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:18:17.453 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:18:17.645 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:18:17.645 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:18:47.676 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:18:47.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:18:47.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:18:48.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:18:48.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:18:48.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:18:48.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:18:48.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:18:48.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:18:48.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:18:48.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:18:48.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:18:48.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:18:50.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:18:50.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:18:50.826 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:18:50.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:18:50.836 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:18:50.849 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:18:50.850 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:18:50.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:18:50.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:18:50.851 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:18:50.852 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:18:50.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:18:50.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:18:50.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:18:51.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:18:51.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:18:51.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:18:51.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:18:51.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:18:51.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:18:51.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:18:51.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:18:51.186 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:18:51.256 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:18:39
2026-06-04T04:18:51.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87907, datetime.datetime(2026, 6, 4, 4, 18, 39), datetime.datetime(2026, 6, 4, 4, 18, 38), 'salt', 1.7, 100.64, None, 38.64, 139.54, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:18:51.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:18:51.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:18:51.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:18:38, diff=13.264015s, valid=True
2026-06-04T04:18:51.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:18:51.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:18:51.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:19:12, diff=-20.732509s, valid=True
2026-06-04T04:18:51.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:18:51.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:18:51.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:18:33, diff=18.275675s, valid=True
2026-06-04T04:18:51.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:18:51.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:18:51.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:18:51.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:18:51.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:18:51.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:18:51.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:19:12, diff=-20.720631s, valid=True
2026-06-04T04:18:51.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:18:51.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:18:51.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:18:51.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113728.280192s, valid=True
2026-06-04T04:18:51.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:18:51.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:18:51.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:18:51.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:18:51.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:18:51.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:18:51.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:18:51.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:18:51.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:18:51.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:18:51.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:18:51.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:18:51.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:18:51.599 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:18:51.814 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:18:52.160 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:18:52.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:18:52.264 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:18:52.264 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:18:52.419 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:18:52.420 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:19:22.450 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:19:22.450 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:19:22.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:19:22.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:19:22.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:19:22.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:19:22.860 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:19:22.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:19:22.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:19:22.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:19:22.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:19:22.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:19:22.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:19:25.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:19:25.325 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:19:25.326 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:19:25.326 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:19:25.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:19:25.349 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:19:25.350 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:19:25.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:19:25.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:19:25.351 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:19:25.351 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:19:25.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:19:25.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:19:25.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:19:25.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:19:25.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:19:25.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:19:25.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:19:25.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:19:25.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:19:25.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:19:25.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:19:25.707 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:19:25.784 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:19:09
2026-06-04T04:19:25.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87908, datetime.datetime(2026, 6, 4, 4, 19, 9), datetime.datetime(2026, 6, 4, 4, 19, 8), 'salt', 1.63, 100.58, None, 32.5, 140.74, -0.09, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:19:25.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:19:25.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:19:25.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:19:08, diff=17.791535s, valid=True
2026-06-04T04:19:25.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:19:25.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:19:25.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:19:12, diff=13.795014s, valid=True
2026-06-04T04:19:25.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:19:25.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:19:25.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:19:03, diff=22.803159s, valid=True
2026-06-04T04:19:25.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:19:25.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:19:25.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:19:25.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:19:25.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:19:25.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:19:25.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:19:12, diff=13.806838s, valid=True
2026-06-04T04:19:25.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:19:25.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:19:25.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:19:25.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113762.807639s, valid=True
2026-06-04T04:19:25.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:19:25.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:19:25.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:19:25.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:19:25.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:19:25.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:19:25.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:19:25.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:19:25.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:19:25.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:19:26.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:19:26.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:19:26.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:19:26.130 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:19:26.404 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:19:26.748 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:19:26.849 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:19:26.849 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:19:26.849 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:19:27.078 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:19:27.078 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:19:57.109 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:19:57.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:19:57.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:19:57.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:19:57.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:19:57.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:19:57.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:19:57.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:19:57.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:19:57.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:19:57.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:19:57.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:19:57.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:20:00.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:20:00.084 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:20:00.084 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:20:00.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:20:00.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:20:00.111 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:20:00.111 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:20:00.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:20:00.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:20:00.112 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:20:00.112 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:20:00.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:20:00.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:20:00.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:20:00.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:20:00.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:20:00.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:20:00.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:20:00.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:20:00.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:20:00.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:20:00.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:20:00.423 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:20:00.499 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:19:39
2026-06-04T04:20:00.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87909, datetime.datetime(2026, 6, 4, 4, 19, 39), datetime.datetime(2026, 6, 4, 4, 19, 38), 'salt', 1.6, 100.61, None, 33.24, 129.82, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:20:00.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:20:00.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:20:00.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:19:38, diff=22.506689s, valid=True
2026-06-04T04:20:00.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:20:00.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:20:00.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:20:12, diff=-11.490043s, valid=True
2026-06-04T04:20:00.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:20:00.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:20:00.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:19:34, diff=26.517519s, valid=True
2026-06-04T04:20:00.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:20:00.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:20:00.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:20:00.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:20:00.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:20:00.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:20:00.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:20:12, diff=-11.479032s, valid=True
2026-06-04T04:20:00.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:20:00.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:20:00.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:20:00.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113797.52178s, valid=True
2026-06-04T04:20:00.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:20:00.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:20:00.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:20:00.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:20:00.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:20:00.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:20:00.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:20:00.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:20:00.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:20:00.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:20:00.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:20:00.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:20:00.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:20:00.839 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:20:01.051 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:20:01.427 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:20:01.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:20:01.528 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:20:01.528 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:20:01.733 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:20:01.733 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:20:31.734 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:20:31.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:20:31.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:20:32.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:20:32.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:20:32.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:20:32.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:20:32.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:20:32.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:20:32.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:20:32.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:20:32.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:20:32.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:20:34.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:20:34.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:20:34.780 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:20:34.780 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:20:34.790 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:20:34.806 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:20:34.807 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:20:34.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:20:34.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:20:34.808 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:20:34.808 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:20:34.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:20:34.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:20:34.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:20:35.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:20:35.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:20:35.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:20:35.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:20:35.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:20:35.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:20:35.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:20:35.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:20:35.170 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:20:35.242 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:20:09
2026-06-04T04:20:35.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87910, datetime.datetime(2026, 6, 4, 4, 20, 9), datetime.datetime(2026, 6, 4, 4, 20, 9), 'salt', 1.57, 100.64, None, 37.82, 126.93, -0.09, 820.68, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:20:35.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:20:35.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:20:35.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:20:09, diff=26.250457s, valid=True
2026-06-04T04:20:35.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:20:35.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:20:35.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:20:12, diff=23.254058s, valid=True
2026-06-04T04:20:35.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:20:35.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:20:35.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:20:04, diff=31.262529s, valid=True
2026-06-04T04:20:35.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:20:35.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:20:35.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:20:35.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:20:35.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:20:35.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:20:35.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:20:12, diff=23.266359s, valid=True
2026-06-04T04:20:35.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:20:35.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:20:35.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:20:35.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113832.267198s, valid=True
2026-06-04T04:20:35.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:20:35.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:20:35.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:20:35.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:20:35.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:20:35.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:20:35.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:20:35.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:20:35.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:20:35.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:20:35.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:20:35.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:20:35.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:20:35.661 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:20:35.874 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:20:36.220 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:20:36.322 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:20:36.323 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:20:36.323 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:20:36.529 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:20:36.530 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:21:06.542 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:21:06.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:21:06.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:21:06.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:21:06.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:21:07.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:21:07.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:21:07.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:21:07.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:21:07.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:21:07.169 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:21:07.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:21:07.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:21:09.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:21:09.686 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:21:09.687 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:21:09.688 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:21:09.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:21:09.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:21:09.712 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:21:09.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:21:09.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:21:09.714 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:21:09.714 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:21:09.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:21:09.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T04:21:09.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:21:09.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T04:21:09.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:21:10.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:21:10.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:21:10.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:21:10.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:21:10.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:21:10.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:21:10.047 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:21:10.117 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:20:40
2026-06-04T04:21:10.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87911, datetime.datetime(2026, 6, 4, 4, 20, 40), datetime.datetime(2026, 6, 4, 4, 20, 39), 'salt', 1.63, 100.68, None, 41.46, 129.96, -0.1, 820.62, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:21:10.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:21:10.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T04:21:10.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:20:39, diff=31.1239s, valid=True
2026-06-04T04:21:10.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:21:10.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:21:10.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:21:12, diff=-1.872899s, valid=True
2026-06-04T04:21:10.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:21:10.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T04:21:10.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:20:34, diff=36.13646s, valid=True
2026-06-04T04:21:10.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:21:10.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:21:10.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:21:10.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:21:10.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:21:10.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:21:10.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:21:12, diff=-1.859933s, valid=True
2026-06-04T04:21:10.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:21:10.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:21:10.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:21:10.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113867.140835s, valid=True
2026-06-04T04:21:10.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:21:10.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:21:10.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:21:10.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:21:10.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:21:10.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:21:10.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:21:10.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:21:10.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:21:10.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:21:10.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:21:10.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:21:10.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:21:10.465 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:21:10.681 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:21:11.029 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:21:11.130 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:21:11.130 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:21:11.130 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:21:11.318 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:21:11.318 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:21:41.346 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:21:41.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:21:41.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:21:41.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:21:41.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:21:41.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:21:41.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:21:41.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:21:41.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:21:41.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:21:41.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:21:41.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:21:41.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:21:44.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:21:44.173 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:21:44.174 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:21:44.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:21:44.185 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:21:44.198 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:21:44.199 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:21:44.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:21:44.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:21:44.200 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:21:44.200 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:21:44.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:21:44.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:21:44.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:21:44.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:21:44.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:21:44.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:21:44.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:21:44.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:21:44.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:21:44.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:21:44.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:21:44.539 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:21:44.610 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:21:40
2026-06-04T04:21:44.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87913, datetime.datetime(2026, 6, 4, 4, 21, 40), datetime.datetime(2026, 6, 4, 4, 21, 39), 'salt', 1.63, 100.61, None, 36.91, 136.47, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:21:44.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:21:44.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:21:44.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:21:39, diff=5.618229s, valid=True
2026-06-04T04:21:44.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:21:44.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:21:44.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:22:12, diff=-27.378254s, valid=True
2026-06-04T04:21:44.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:21:44.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:21:44.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:21:34, diff=10.629929s, valid=True
2026-06-04T04:21:44.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:21:44.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:21:44.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:21:44.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:21:44.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:21:44.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:21:44.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:22:12, diff=-27.366387s, valid=True
2026-06-04T04:21:44.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:21:44.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:21:44.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:21:44.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113901.634417s, valid=True
2026-06-04T04:21:44.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:21:44.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:21:44.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:21:44.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:21:44.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:21:44.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:21:44.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:21:44.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:21:44.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:21:44.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:21:44.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:21:44.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:21:44.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:21:45.021 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:21:45.249 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:21:45.596 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:21:45.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:21:45.698 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:21:45.698 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:21:45.961 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:21:45.961 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:22:15.991 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:22:15.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:22:15.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:22:16.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:22:16.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:22:16.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:22:16.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:22:16.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:22:16.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:22:16.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:22:16.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:22:16.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:22:16.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:22:19.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:22:19.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:22:19.025 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:22:19.026 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:22:19.036 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:22:19.049 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:22:19.049 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:22:19.050 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:22:19.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:22:19.050 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:22:19.051 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:22:19.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:22:19.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:22:19.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:22:19.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:22:19.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:22:19.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:22:19.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:22:19.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:22:19.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:22:19.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:22:19.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:22:19.403 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:22:19.475 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:22:10
2026-06-04T04:22:19.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87914, datetime.datetime(2026, 6, 4, 4, 22, 10), datetime.datetime(2026, 6, 4, 4, 22, 10), 'salt', 1.5, 100.58, None, 37.05, 133.23, -0.08, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:22:19.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:22:19.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:22:19.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:22:10, diff=9.482809s, valid=True
2026-06-04T04:22:19.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:22:19.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:22:19.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:22:12, diff=7.486175s, valid=True
2026-06-04T04:22:19.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:22:19.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:22:19.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:22:05, diff=14.494079s, valid=True
2026-06-04T04:22:19.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:22:19.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:22:19.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:22:19.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:22:19.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:22:19.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:22:19.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:22:12, diff=7.497723s, valid=True
2026-06-04T04:22:19.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:22:19.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:22:19.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:22:19.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113936.498508s, valid=True
2026-06-04T04:22:19.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:22:19.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:22:19.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:22:19.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:22:19.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:22:19.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:22:19.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:22:19.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:22:19.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:22:19.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:22:19.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:22:19.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:22:19.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:22:19.820 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:22:20.055 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:22:20.407 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:22:20.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:22:20.509 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:22:20.509 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:22:20.700 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:22:20.700 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:22:50.725 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:22:50.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:22:50.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:22:51.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:22:51.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:22:51.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:22:51.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:22:51.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:22:51.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:22:51.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:22:51.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:22:51.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:22:51.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:22:53.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:22:53.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:22:53.817 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:22:53.818 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:22:53.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:22:53.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:22:53.842 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:22:53.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:22:53.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:22:53.843 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:22:53.843 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:22:53.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:22:53.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:22:53.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:22:54.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:22:54.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:22:54.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:22:54.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:22:54.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:22:54.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:22:54.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:22:54.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:22:54.189 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:22:54.260 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:22:41
2026-06-04T04:22:54.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87915, datetime.datetime(2026, 6, 4, 4, 22, 41), datetime.datetime(2026, 6, 4, 4, 22, 40), 'salt', 1.57, 100.48, None, 41.92, 122.4, -0.06, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:22:54.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:22:54.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:22:54.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:22:40, diff=14.26812s, valid=True
2026-06-04T04:22:54.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:22:54.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:22:54.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:23:12, diff=-17.728416s, valid=True
2026-06-04T04:22:54.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:22:54.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:22:54.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:22:35, diff=19.279909s, valid=True
2026-06-04T04:22:54.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:22:54.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:22:54.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:22:54.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:22:54.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:22:54.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:22:54.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:23:12, diff=-17.716373s, valid=True
2026-06-04T04:22:54.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:22:54.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:22:54.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:22:54.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=113971.284432s, valid=True
2026-06-04T04:22:54.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:22:54.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:22:54.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:22:54.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:22:54.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:22:54.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:22:54.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:22:54.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:22:54.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:22:54.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:22:54.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:22:54.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:22:54.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:22:54.603 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:22:54.843 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:22:55.192 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:22:55.295 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:22:55.295 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:22:55.295 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:22:55.491 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:22:55.491 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:23:25.520 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:23:25.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:23:25.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:23:25.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:23:25.814 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:23:26.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:23:26.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:23:26.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:23:26.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:23:26.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:23:26.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:23:26.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:23:26.081 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:23:28.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:23:28.506 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:23:28.507 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:23:28.507 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:23:28.519 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:23:28.531 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:23:28.532 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:23:28.532 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:23:28.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:23:28.533 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:23:28.533 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:23:28.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:23:28.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:23:28.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:23:28.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:23:28.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:23:28.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:23:28.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:23:28.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:23:28.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:23:28.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:23:28.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:23:28.874 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:23:28.943 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:23:11
2026-06-04T04:23:28.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87916, datetime.datetime(2026, 6, 4, 4, 23, 11), datetime.datetime(2026, 6, 4, 4, 23, 10), 'salt', 1.5, 100.61, None, 40.29, 125.73, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:23:28.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:23:28.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:23:28.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:23:10, diff=18.95095s, valid=True
2026-06-04T04:23:28.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:23:28.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:23:28.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:23:12, diff=16.954332s, valid=True
2026-06-04T04:23:28.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:23:28.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:23:28.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:23:05, diff=23.962281s, valid=True
2026-06-04T04:23:28.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:23:28.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:23:28.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:23:28.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:23:28.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:23:28.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:23:28.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:23:12, diff=16.965872s, valid=True
2026-06-04T04:23:28.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:23:28.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:23:28.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:23:28.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114005.966649s, valid=True
2026-06-04T04:23:28.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:23:28.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:23:28.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:23:28.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:23:28.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:23:29.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:23:29.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:23:29.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:23:29.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:23:29.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:23:29.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:23:29.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:23:29.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:23:29.287 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:23:29.564 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:23:29.928 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:23:30.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:23:30.033 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:23:30.033 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:23:30.298 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:23:30.298 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:24:00.322 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:24:00.322 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:24:00.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:24:00.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:24:00.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:24:00.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:24:00.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:24:00.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:24:00.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:24:00.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:24:00.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:24:00.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:24:00.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:24:03.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:24:03.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:24:03.256 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:24:03.257 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:24:03.267 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:24:03.279 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:24:03.280 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:24:03.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:24:03.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:24:03.281 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:24:03.281 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:24:03.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:24:03.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:24:03.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:24:03.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:24:03.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:24:03.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:24:03.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:24:03.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:24:03.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:24:03.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:24:03.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:24:03.616 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:24:03.690 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:23:41
2026-06-04T04:24:03.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87917, datetime.datetime(2026, 6, 4, 4, 23, 41), datetime.datetime(2026, 6, 4, 4, 23, 40), 'salt', 1.57, 100.61, None, 40.54, 137.88, -0.08, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:24:03.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:24:03.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:24:03.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:23:40, diff=23.697995s, valid=True
2026-06-04T04:24:03.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:24:03.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:24:03.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:24:12, diff=-8.298518s, valid=True
2026-06-04T04:24:03.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:24:03.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:24:03.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:23:35, diff=28.709632s, valid=True
2026-06-04T04:24:03.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:24:03.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:24:03.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:24:03.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:24:03.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:24:03.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:24:03.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:24:12, diff=-8.286617s, valid=True
2026-06-04T04:24:03.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:24:03.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:24:03.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:24:03.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114040.714197s, valid=True
2026-06-04T04:24:03.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:24:03.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:24:03.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:24:03.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:24:03.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:24:03.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:24:03.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:24:03.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:24:03.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:24:03.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:24:03.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:24:03.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:24:03.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:24:04.038 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:24:04.253 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:24:04.602 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:24:04.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:24:04.704 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:24:04.705 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:24:04.902 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:24:04.902 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:24:34.932 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:24:34.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:24:34.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:24:35.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:24:35.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:24:35.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:24:35.485 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:24:35.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:24:35.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:24:35.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:24:35.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:24:35.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:24:35.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:24:37.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:24:37.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:24:37.955 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:24:37.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:24:37.964 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:24:37.976 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:24:37.976 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:24:37.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:24:37.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:24:37.977 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:24:37.977 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:24:37.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:24:38.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:24:38.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:24:38.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:24:38.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:24:38.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:24:38.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:24:38.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:24:38.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:24:38.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:24:38.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:24:38.273 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:24:38.343 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:24:11
2026-06-04T04:24:38.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87918, datetime.datetime(2026, 6, 4, 4, 24, 11), datetime.datetime(2026, 6, 4, 4, 24, 11), 'salt', 1.5, 100.51, None, 38.25, 127.85, -0.07, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:24:38.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:24:38.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:24:38.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:24:11, diff=27.356672s, valid=True
2026-06-04T04:24:38.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:24:38.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:24:38.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:24:12, diff=26.361147s, valid=True
2026-06-04T04:24:38.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:24:38.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:24:38.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:24:05, diff=33.367808s, valid=True
2026-06-04T04:24:38.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:24:38.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:24:38.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:24:38.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:24:38.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:24:38.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:24:38.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:24:12, diff=26.370833s, valid=True
2026-06-04T04:24:38.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:24:38.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:24:38.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:24:38.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114075.371476s, valid=True
2026-06-04T04:24:38.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:24:38.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:24:38.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:24:38.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:24:38.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:24:38.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:24:38.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:24:38.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:24:38.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:24:38.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:24:38.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:24:38.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:24:38.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:24:38.798 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:24:39.015 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:24:39.363 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:24:39.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:24:39.466 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:24:39.466 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:24:39.766 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:24:39.766 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:25:09.796 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:25:09.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:25:09.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:25:10.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:25:10.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:25:10.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:25:10.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:25:10.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:25:10.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:25:10.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:25:10.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:25:10.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:25:10.353 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:25:12.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:25:12.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:25:12.767 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:25:12.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:25:12.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:25:12.792 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:25:12.793 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:25:12.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:25:12.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:25:12.794 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:25:12.794 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:25:12.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:25:12.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:25:12.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:25:13.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:25:13.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:25:13.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:25:13.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:25:13.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:25:13.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:25:13.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:25:13.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:25:13.110 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:25:13.179 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:25:12
2026-06-04T04:25:13.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87920, datetime.datetime(2026, 6, 4, 4, 25, 12), datetime.datetime(2026, 6, 4, 4, 25, 11), 'salt', 1.57, 100.61, None, 33.73, 119.62, -0.08, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:25:13.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:25:13.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:25:13.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:25:11, diff=2.186713s, valid=True
2026-06-04T04:25:13.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:25:13.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:25:13.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:25:12, diff=1.190083s, valid=True
2026-06-04T04:25:13.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:25:13.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:25:13.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:25:10, diff=3.198167s, valid=True
2026-06-04T04:25:13.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:25:13.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:25:13.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:25:13.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:25:13.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:25:13.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:25:13.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:25:12, diff=1.201771s, valid=True
2026-06-04T04:25:13.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:25:13.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:25:13.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:25:13.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114110.202549s, valid=True
2026-06-04T04:25:13.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:25:13.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:25:13.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:25:13.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:25:13.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:25:13.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:25:13.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:25:13.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:25:13.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:25:13.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:25:13.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:25:13.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:25:13.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:25:13.520 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:25:13.733 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:25:14.080 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:25:14.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:25:14.181 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:25:14.182 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:25:14.443 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:25:14.444 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:25:44.451 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:25:44.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:25:44.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:25:44.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:25:44.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:25:45.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:25:45.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:25:45.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:25:45.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:25:45.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:25:45.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:25:45.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:25:45.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:25:47.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:25:47.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:25:47.532 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:25:47.532 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:25:47.541 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:25:47.554 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:25:47.555 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:25:47.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:25:47.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:25:47.556 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:25:47.556 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:25:47.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:25:47.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:25:47.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:25:47.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:25:47.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:25:47.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:25:47.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:25:47.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:25:47.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:25:47.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:25:47.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:25:47.891 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:25:47.964 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:25:42
2026-06-04T04:25:47.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87921, datetime.datetime(2026, 6, 4, 4, 25, 42), datetime.datetime(2026, 6, 4, 4, 25, 41), 'salt', 1.6, 100.58, None, 43.68, 135.11, -0.08, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:25:47.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:25:47.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:25:47.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:25:41, diff=6.972049s, valid=True
2026-06-04T04:25:47.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:25:47.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:25:47.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:26:12, diff=-24.024491s, valid=True
2026-06-04T04:25:47.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:25:47.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:25:47.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:25:36, diff=11.983659s, valid=True
2026-06-04T04:25:47.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:25:47.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:25:47.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:25:47.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:25:47.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:25:47.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:25:47.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:26:12, diff=-24.012478s, valid=True
2026-06-04T04:25:47.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:25:47.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:25:47.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:25:47.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114144.988358s, valid=True
2026-06-04T04:25:47.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:25:47.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:25:47.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:25:47.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:25:47.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:25:48.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:25:48.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:25:48.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:25:48.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:25:48.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:25:48.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:25:48.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:25:48.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:25:48.381 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:25:48.612 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:25:48.961 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:25:49.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:25:49.063 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:25:49.063 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:25:49.219 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:25:49.219 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:26:19.249 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:26:19.249 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:26:19.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:26:19.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:26:19.437 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:26:19.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:26:19.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:26:19.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:26:19.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:26:19.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:26:19.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:26:19.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:26:19.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:26:22.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:26:22.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:26:22.722 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:26:22.722 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:26:22.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:26:22.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:26:22.749 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:26:22.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:26:22.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:26:22.750 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:26:22.750 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:26:22.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:26:22.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:26:22.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:26:22.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:26:22.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:26:23.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:26:23.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:26:23.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T04:26:23.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:26:23.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:26:23.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:26:23.086 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:26:23.159 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:26:12
2026-06-04T04:26:23.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87922, datetime.datetime(2026, 6, 4, 4, 26, 12), datetime.datetime(2026, 6, 4, 4, 26, 12), 'salt', 1.57, 100.54, None, 34.47, 123.88, -0.07, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:26:23.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:26:23.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:26:23.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:26:12, diff=11.16666s, valid=True
2026-06-04T04:26:23.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:26:23.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:26:23.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:26:12, diff=11.170132s, valid=True
2026-06-04T04:26:23.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:26:23.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:26:23.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:26:07, diff=16.178261s, valid=True
2026-06-04T04:26:23.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:26:23.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:26:23.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:26:23.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:26:23.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:26:23.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T04:26:23.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:26:12, diff=11.181986s, valid=True
2026-06-04T04:26:23.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:26:23.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:26:23.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:26:23.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114180.182797s, valid=True
2026-06-04T04:26:23.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:26:23.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:26:23.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:26:23.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:26:23.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:26:23.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:26:23.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:26:23.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:26:23.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:26:23.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:26:23.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:26:23.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:26:23.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:26:23.504 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:26:23.716 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:26:24.062 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:26:24.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:26:24.163 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:26:24.163 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:26:24.401 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:26:24.401 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:26:54.431 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:26:54.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:26:54.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:26:54.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:26:54.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:26:55.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:26:55.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:26:55.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:26:55.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:26:55.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:26:55.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:26:55.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:26:55.081 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:26:57.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:26:57.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:26:57.509 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:26:57.510 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:26:57.520 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:26:57.533 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:26:57.533 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:26:57.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:26:57.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:26:57.534 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:26:57.535 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:26:57.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:26:57.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:26:57.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:26:57.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:26:57.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:26:57.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:26:57.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:26:57.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:26:57.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:26:57.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:26:57.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:26:57.876 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:26:57.947 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:26:43
2026-06-04T04:26:57.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87923, datetime.datetime(2026, 6, 4, 4, 26, 43), datetime.datetime(2026, 6, 4, 4, 26, 42), 'salt', 1.6, 100.61, None, 35.74, 137.85, -0.09, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:26:57.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:26:57.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:26:57.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:26:42, diff=15.955169s, valid=True
2026-06-04T04:26:57.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:26:57.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:26:57.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:27:12, diff=-14.041349s, valid=True
2026-06-04T04:26:57.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:26:57.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:26:57.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:26:37, diff=20.966901s, valid=True
2026-06-04T04:26:57.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:26:57.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:26:57.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:26:57.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:26:57.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:26:57.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:26:57.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:27:12, diff=-14.029316s, valid=True
2026-06-04T04:26:57.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:26:57.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:26:57.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:26:57.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114214.97149s, valid=True
2026-06-04T04:26:57.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:26:57.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:26:57.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:26:57.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:26:57.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:26:58.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:26:58.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:26:58.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:26:58.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:26:58.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:26:58.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:26:58.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:26:58.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:26:58.291 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:26:58.504 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:26:58.851 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:26:58.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:26:58.954 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:26:58.954 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:26:59.206 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:26:59.207 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:27:29.212 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:27:29.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:27:29.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:27:29.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:27:29.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:27:29.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:27:29.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:27:29.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:27:29.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:27:29.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:27:29.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:27:29.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:27:29.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:27:32.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:27:32.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:27:32.227 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:27:32.227 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:27:32.236 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:27:32.250 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:27:32.250 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:27:32.251 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:27:32.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:27:32.251 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:27:32.252 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:27:32.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:27:32.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:27:32.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:27:32.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:27:32.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:27:32.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:27:32.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:27:32.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T04:27:32.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:27:32.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:27:32.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:27:32.598 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:27:32.676 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:27:13
2026-06-04T04:27:32.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87924, datetime.datetime(2026, 6, 4, 4, 27, 13), datetime.datetime(2026, 6, 4, 4, 27, 12), 'salt', 1.5, 100.54, None, 40.4, 145.37, -0.08, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:27:32.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:27:32.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:27:32.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:27:12, diff=20.683755s, valid=True
2026-06-04T04:27:32.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:27:32.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:27:32.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:27:12, diff=20.687246s, valid=True
2026-06-04T04:27:32.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:27:32.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:27:32.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:27:07, diff=25.695579s, valid=True
2026-06-04T04:27:32.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:27:32.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:27:32.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:27:32.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:27:32.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:27:32.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T04:27:32.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:27:12, diff=20.699313s, valid=True
2026-06-04T04:27:32.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:27:32.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:27:32.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:27:32.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114249.700139s, valid=True
2026-06-04T04:27:32.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:27:32.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:27:32.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:27:32.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:27:32.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:27:32.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:27:32.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:27:32.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:27:32.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:27:32.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:27:32.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:27:32.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:27:32.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:27:33.019 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:27:33.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:27:33.635 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:27:33.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:27:33.736 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:27:33.736 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:27:34.315 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:27:34.315 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:28:04.345 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:28:04.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:28:04.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:28:04.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:28:04.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:28:05.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:28:05.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:28:05.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:28:05.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:28:05.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:28:05.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:28:05.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:28:05.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:28:07.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:28:07.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:28:07.484 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:28:07.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:28:07.494 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:28:07.507 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:28:07.507 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:28:07.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:28:07.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:28:07.509 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:28:07.509 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:28:07.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:28:07.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:28:07.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:28:07.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:28:07.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:28:07.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T04:28:07.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:28:07.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T04:28:07.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:28:07.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:28:07.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:28:07.840 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:28:07.915 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:27:43
2026-06-04T04:28:07.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87925, datetime.datetime(2026, 6, 4, 4, 27, 43), datetime.datetime(2026, 6, 4, 4, 27, 42), 'salt', 1.6, 100.61, None, 40.4, 133.84, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:28:07.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:28:07.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:28:07.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:27:42, diff=25.923241s, valid=True
2026-06-04T04:28:07.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:28:07.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T04:28:07.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:28:12, diff=-4.073249s, valid=True
2026-06-04T04:28:07.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:28:07.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:28:07.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:27:37, diff=30.935048s, valid=True
2026-06-04T04:28:07.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:28:07.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:28:07.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:28:07.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:28:07.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:28:07.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T04:28:07.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:28:12, diff=-4.061251s, valid=True
2026-06-04T04:28:07.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:28:07.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:28:07.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:28:07.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114284.939563s, valid=True
2026-06-04T04:28:07.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:28:07.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:28:07.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:28:07.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:28:07.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:28:08.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:28:08.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:28:08.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:28:08.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:28:08.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:28:08.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:28:08.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:28:08.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:28:08.263 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:28:08.478 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:28:08.824 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:28:08.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:28:08.926 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:28:08.927 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:28:09.144 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:28:09.144 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:28:39.174 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:28:39.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:28:39.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:28:39.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:28:39.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:28:39.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:28:39.933 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:28:39.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:28:39.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:28:39.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:28:39.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:28:39.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:28:39.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:28:42.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:28:42.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:28:42.389 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:28:42.390 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:28:42.400 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:28:42.413 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:28:42.413 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:28:42.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:28:42.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:28:42.414 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:28:42.415 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:28:42.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:28:42.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:28:42.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:28:42.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:28:42.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:28:42.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T04:28:42.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:28:42.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T04:28:42.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:28:42.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:28:42.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:28:42.762 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:28:42.848 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:28:13
2026-06-04T04:28:42.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87926, datetime.datetime(2026, 6, 4, 4, 28, 13), datetime.datetime(2026, 6, 4, 4, 28, 13), 'salt', 1.53, 100.61, None, 40.65, 131.04, -0.09, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:28:42.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:28:42.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:28:42.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:28:13, diff=29.855675s, valid=True
2026-06-04T04:28:42.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:28:42.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T04:28:42.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:28:12, diff=30.859146s, valid=True
2026-06-04T04:28:42.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:28:42.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:28:42.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:28:08, diff=34.867332s, valid=True
2026-06-04T04:28:42.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:28:42.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:28:42.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:28:42.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:28:42.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:28:42.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T04:28:42.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:28:12, diff=30.871087s, valid=True
2026-06-04T04:28:42.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:28:42.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:28:42.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:28:42.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114319.871893s, valid=True
2026-06-04T04:28:42.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:28:42.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:28:42.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:28:42.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:28:42.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:28:42.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:28:42.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:28:42.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:28:42.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:28:43.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:28:43.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:28:43.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:28:43.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:28:43.267 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:28:43.481 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:28:43.827 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:28:43.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:28:43.929 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:28:43.929 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:28:44.084 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:28:44.084 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:29:14.114 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:29:14.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:29:14.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:29:14.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:29:14.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:29:14.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:29:14.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:29:14.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:29:14.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:29:14.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:29:14.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:29:14.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:29:14.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:29:17.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:29:17.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:29:17.273 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:29:17.273 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:29:17.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:29:17.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:29:17.297 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:29:17.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:29:17.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:29:17.298 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:29:17.298 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:29:17.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:29:17.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:29:17.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:29:17.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:29:17.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:29:17.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:29:17.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:29:17.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:29:17.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:29:17.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:29:17.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:29:17.653 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:29:17.724 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:29:14
2026-06-04T04:29:17.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87928, datetime.datetime(2026, 6, 4, 4, 29, 14), datetime.datetime(2026, 6, 4, 4, 29, 13), 'salt', 1.57, 100.64, None, 49.04, 131.84, -0.09, 820.68, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T04:29:17.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:29:17.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:29:17.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:29:13, diff=4.731609s, valid=True
2026-06-04T04:29:17.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:29:17.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:29:17.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:29:12, diff=5.735041s, valid=True
2026-06-04T04:29:17.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:29:17.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:29:17.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:29:08, diff=9.743099s, valid=True
2026-06-04T04:29:17.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:29:17.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:29:17.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:29:17.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:29:17.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:29:17.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:29:17.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:29:12, diff=5.746856s, valid=True
2026-06-04T04:29:17.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:29:17.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:29:17.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:29:17.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114354.747666s, valid=True
2026-06-04T04:29:17.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:29:17.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:29:17.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:29:17.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:29:17.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:29:17.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:29:17.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:29:17.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:29:17.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:29:17.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:29:17.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:29:17.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:29:18.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:29:18.070 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:29:18.286 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:29:18.636 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:29:18.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:29:18.739 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:29:18.739 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:29:19.006 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:29:19.006 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:29:49.036 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:29:49.036 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:29:49.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:29:49.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:29:49.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:29:49.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:29:49.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:29:49.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:29:49.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:29:49.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:29:49.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:29:49.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:29:49.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:29:51.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:29:51.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:29:51.925 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:29:51.925 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:29:51.934 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:29:51.946 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:29:51.946 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:29:51.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:29:51.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:29:51.946 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:29:51.946 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:29:51.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:29:52.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:29:52.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:29:52.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:29:52.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:29:52.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:29:52.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:29:52.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:29:52.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:29:52.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:29:52.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:29:52.219 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:29:52.290 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:29:44
2026-06-04T04:29:52.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87929, datetime.datetime(2026, 6, 4, 4, 29, 44), datetime.datetime(2026, 6, 4, 4, 29, 43), 'salt', 1.53, 100.61, None, 43.72, 137.03, -0.09, 820.68, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:29:52.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:29:52.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:29:52.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:29:43, diff=9.297612s, valid=True
2026-06-04T04:29:52.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:29:52.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:29:52.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:30:12, diff=-19.699186s, valid=True
2026-06-04T04:29:52.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:29:52.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:29:52.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:29:38, diff=14.308337s, valid=True
2026-06-04T04:29:52.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:29:52.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:29:52.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:29:52.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:29:52.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:29:52.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:29:52.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:30:12, diff=-19.688289s, valid=True
2026-06-04T04:29:52.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:29:52.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:29:52.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:29:52.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114389.312457s, valid=True
2026-06-04T04:29:52.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:29:52.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:29:52.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:29:52.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:29:52.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:29:52.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:29:52.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:29:52.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:29:52.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:29:52.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:29:52.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:29:52.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:29:52.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:29:52.704 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:29:52.920 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:29:53.270 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:29:53.373 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:29:53.374 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:29:53.374 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:29:53.572 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:29:53.572 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:30:23.602 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:30:23.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:30:23.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:30:23.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:30:23.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:30:24.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:30:24.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:30:24.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:30:24.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:30:24.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:30:24.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:30:24.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:30:24.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:30:26.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:30:26.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:30:26.651 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:30:26.652 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:30:26.662 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:30:26.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:30:26.674 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:30:26.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:30:26.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:30:26.675 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:30:26.675 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:30:26.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:30:26.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:30:26.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:30:26.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:30:26.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:30:26.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:30:26.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:30:27.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:30:27.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:30:27.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:30:27.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:30:27.013 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:30:27.085 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:30:14
2026-06-04T04:30:27.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87930, datetime.datetime(2026, 6, 4, 4, 30, 14), datetime.datetime(2026, 6, 4, 4, 30, 14), 'salt', 1.57, 100.64, None, 38.49, 134.31, -0.09, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:30:27.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:30:27.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:30:27.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:30:14, diff=13.092882s, valid=True
2026-06-04T04:30:27.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:30:27.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:30:27.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:30:12, diff=15.096333s, valid=True
2026-06-04T04:30:27.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:30:27.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:30:27.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:30:09, diff=18.104464s, valid=True
2026-06-04T04:30:27.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:30:27.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:30:27.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:30:27.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:30:27.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:30:27.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:30:27.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:30:12, diff=15.108178s, valid=True
2026-06-04T04:30:27.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:30:27.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:30:27.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:30:27.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114424.109002s, valid=True
2026-06-04T04:30:27.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:30:27.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:30:27.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:30:27.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:30:27.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:30:27.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:30:27.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:30:27.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:30:27.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:30:27.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:30:27.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:30:27.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:30:27.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:30:27.432 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:30:27.648 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:30:27.996 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:30:28.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:30:28.100 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:30:28.100 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:30:28.297 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:30:28.297 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:30:58.312 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:30:58.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:30:58.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:30:58.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:30:58.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:30:58.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:30:58.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:30:58.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:30:58.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:30:58.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:30:58.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:30:58.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:30:58.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:31:01.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:31:01.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:31:01.385 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:31:01.386 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:31:01.393 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:31:01.405 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:31:01.406 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:31:01.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:31:01.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:31:01.406 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:31:01.406 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:31:01.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:31:01.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:31:01.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:31:01.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:31:01.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:31:01.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:31:01.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:31:01.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:31:01.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:31:01.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:31:01.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:31:01.703 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:31:01.773 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:30:45
2026-06-04T04:31:01.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87931, datetime.datetime(2026, 6, 4, 4, 30, 45), datetime.datetime(2026, 6, 4, 4, 30, 44), 'salt', 1.53, 100.61, None, 41.78, 143.98, -0.09, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:31:01.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:31:01.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:31:01.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:30:44, diff=17.779708s, valid=True
2026-06-04T04:31:01.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:31:01.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:31:01.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:31:12, diff=-10.217225s, valid=True
2026-06-04T04:31:01.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:31:01.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:31:01.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:30:39, diff=22.790029s, valid=True
2026-06-04T04:31:01.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:31:01.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:31:01.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:31:01.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:31:01.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:31:01.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:31:01.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:31:12, diff=-10.206726s, valid=True
2026-06-04T04:31:01.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:31:01.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:31:01.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:31:01.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114458.793979s, valid=True
2026-06-04T04:31:01.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:31:01.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:31:01.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:31:01.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:31:01.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:31:01.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:31:01.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:31:01.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:31:01.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:31:01.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:31:01.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:31:02.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:31:02.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:31:02.110 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:31:02.324 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:31:02.676 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:31:02.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:31:02.779 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:31:02.779 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:31:02.973 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:31:02.973 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:31:33.003 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:31:33.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:31:33.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:31:33.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:31:33.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:31:33.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:31:33.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:31:33.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:31:33.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:31:33.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:31:33.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:31:33.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:31:33.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:31:36.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:31:36.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:31:36.036 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:31:36.036 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:31:36.047 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:31:36.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:31:36.066 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:31:36.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:31:36.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:31:36.067 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:31:36.067 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:31:36.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:31:36.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:31:36.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:31:36.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:31:36.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:31:36.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:31:36.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:31:36.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:31:36.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:31:36.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:31:36.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:31:36.400 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:31:36.471 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:31:15
2026-06-04T04:31:36.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87932, datetime.datetime(2026, 6, 4, 4, 31, 15), datetime.datetime(2026, 6, 4, 4, 31, 14), 'salt', 1.6, 100.68, None, 38.25, 137.24, -0.1, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:31:36.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:31:36.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:31:36.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:31:14, diff=22.478419s, valid=True
2026-06-04T04:31:36.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:31:36.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:31:36.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:31:12, diff=24.481806s, valid=True
2026-06-04T04:31:36.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:31:36.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:31:36.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:31:09, diff=27.489603s, valid=True
2026-06-04T04:31:36.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:31:36.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:31:36.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:31:36.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:31:36.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:31:36.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:31:36.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:31:12, diff=24.493252s, valid=True
2026-06-04T04:31:36.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:31:36.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:31:36.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:31:36.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114493.494041s, valid=True
2026-06-04T04:31:36.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:31:36.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:31:36.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:31:36.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:31:36.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:31:36.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:31:36.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:31:36.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:31:36.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:31:36.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:31:36.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:31:36.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:31:36.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:31:36.816 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:31:37.028 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:31:37.432 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:31:37.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:31:37.534 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:31:37.534 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:31:37.735 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:31:37.735 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:32:07.765 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:32:07.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:32:07.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:32:08.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:32:08.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:32:08.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:32:08.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:32:08.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:32:08.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:32:08.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:32:08.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:32:08.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:32:08.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:32:10.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:32:10.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:32:10.977 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:32:10.977 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:32:10.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:32:11.005 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:32:11.006 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:32:11.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:32:11.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:32:11.007 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:32:11.007 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:32:11.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:32:11.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:32:11.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:32:11.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:32:11.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:32:11.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:32:11.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:32:11.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:32:11.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:32:11.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:32:11.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:32:11.341 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:32:11.410 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:31:45
2026-06-04T04:32:11.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87933, datetime.datetime(2026, 6, 4, 4, 31, 45), datetime.datetime(2026, 6, 4, 4, 31, 44), 'salt', 1.5, 100.58, None, 44.07, 133.34, -0.08, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:32:11.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:32:11.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:32:11.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:31:44, diff=27.416986s, valid=True
2026-06-04T04:32:11.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:32:11.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:32:11.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:32:12, diff=-0.580164s, valid=True
2026-06-04T04:32:11.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:32:11.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:32:11.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:31:39, diff=32.426445s, valid=True
2026-06-04T04:32:11.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:32:11.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:32:11.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:32:11.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:32:11.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:32:11.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:32:11.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:32:12, diff=-0.570498s, valid=True
2026-06-04T04:32:11.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:32:11.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:32:11.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:32:11.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114528.430172s, valid=True
2026-06-04T04:32:11.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:32:11.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:32:11.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:32:11.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:32:11.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:32:11.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:32:11.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:32:11.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:32:11.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:32:11.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:32:11.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:32:11.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:32:11.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:32:11.923 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:32:12.136 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:32:12.486 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:32:12.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:32:12.588 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:32:12.588 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:32:12.782 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:32:12.782 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:32:42.798 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:32:42.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:32:42.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:32:43.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:32:43.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:32:43.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:32:43.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:32:43.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:32:43.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:32:43.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:32:43.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:32:43.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:32:43.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:32:45.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:32:45.953 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:32:45.954 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:32:45.954 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:32:45.966 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:32:45.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:32:45.979 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:32:45.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:32:45.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:32:45.980 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:32:45.981 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:32:45.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:32:46.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:32:46.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:32:46.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:32:46.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:32:46.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:32:46.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:32:46.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:32:46.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:32:46.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:32:46.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:32:46.310 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:32:46.383 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:32:15
2026-06-04T04:32:46.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87934, datetime.datetime(2026, 6, 4, 4, 32, 15), datetime.datetime(2026, 6, 4, 4, 32, 15), 'salt', 1.5, 100.58, None, 47.31, 133.93, -0.08, 820.56, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T04:32:46.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:32:46.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:32:46.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:32:15, diff=31.391342s, valid=True
2026-06-04T04:32:46.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:32:46.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:32:46.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:32:12, diff=34.394781s, valid=True
2026-06-04T04:32:46.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:32:46.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:32:46.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:32:10, diff=36.402637s, valid=True
2026-06-04T04:32:46.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:32:46.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:32:46.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:32:46.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:32:46.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:32:46.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:32:46.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:32:12, diff=34.40634s, valid=True
2026-06-04T04:32:46.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:32:46.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:32:46.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:32:46.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114563.407132s, valid=True
2026-06-04T04:32:46.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:32:46.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:32:46.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:32:46.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:32:46.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:32:46.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:32:46.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:32:46.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:32:46.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:32:46.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:32:46.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:32:46.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:32:46.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:32:46.801 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:32:47.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:32:47.360 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:32:47.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:32:47.461 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:32:47.461 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:32:47.658 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:32:47.658 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:33:17.688 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:33:17.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:33:17.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:33:18.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:33:18.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:33:18.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:33:18.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:33:18.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:33:18.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:33:18.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:33:18.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:33:18.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:33:18.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:33:20.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:33:20.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:33:20.903 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:33:20.903 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:33:20.914 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:33:20.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:33:20.927 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:33:20.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:33:20.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:33:20.929 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:33:20.929 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:33:20.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:33:21.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:33:21.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:33:21.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:33:21.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:33:21.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:33:21.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:33:21.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:33:21.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:33:21.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:33:21.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:33:21.261 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:33:21.335 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:33:16
2026-06-04T04:33:21.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87936, datetime.datetime(2026, 6, 4, 4, 33, 16), datetime.datetime(2026, 6, 4, 4, 33, 16), 'salt', 1.53, 100.61, None, 42.13, 135.18, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:33:21.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:33:21.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:33:21.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:33:16, diff=5.342937s, valid=True
2026-06-04T04:33:21.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:33:21.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:33:21.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:33:12, diff=9.346418s, valid=True
2026-06-04T04:33:21.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:33:21.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:33:21.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:33:10, diff=11.354539s, valid=True
2026-06-04T04:33:21.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:33:21.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:33:21.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:33:21.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:33:21.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:33:21.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:33:21.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:33:12, diff=9.358369s, valid=True
2026-06-04T04:33:21.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:33:21.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:33:21.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:33:21.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114598.359199s, valid=True
2026-06-04T04:33:21.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:33:21.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:33:21.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:33:21.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:33:21.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:33:21.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:33:21.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:33:21.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:33:21.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:33:21.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:33:21.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:33:21.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:33:21.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:33:21.683 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:33:21.896 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:33:22.243 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:33:22.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:33:22.354 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:33:22.354 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:33:22.552 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:33:22.552 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:33:52.574 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:33:52.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:33:52.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:33:52.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:33:52.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:33:53.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:33:53.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:33:53.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:33:53.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:33:53.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:33:53.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:33:53.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:33:53.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:33:55.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:33:55.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:33:55.490 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:33:55.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:33:55.500 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:33:55.512 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:33:55.513 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:33:55.513 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:33:55.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:33:55.514 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:33:55.514 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:33:55.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:33:55.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:33:55.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:33:55.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:33:55.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:33:55.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:33:55.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:33:55.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:33:55.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:33:55.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:33:55.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:33:55.847 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:33:55.918 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:33:47
2026-06-04T04:33:55.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87937, datetime.datetime(2026, 6, 4, 4, 33, 47), datetime.datetime(2026, 6, 4, 4, 33, 46), 'salt', 1.47, 100.61, None, 41.88, 138.39, -0.08, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:33:55.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:33:55.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:33:55.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:33:46, diff=9.928361s, valid=True
2026-06-04T04:33:55.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:33:55.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:33:55.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:34:12, diff=-16.063361s, valid=True
2026-06-04T04:33:55.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:33:55.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:33:55.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:33:40, diff=15.945586s, valid=True
2026-06-04T04:33:55.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:33:55.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:33:55.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:33:55.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:33:55.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:33:55.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:33:55.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:34:12, diff=-16.050679s, valid=True
2026-06-04T04:33:55.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:33:55.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:33:55.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:33:55.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114632.95014s, valid=True
2026-06-04T04:33:55.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:33:55.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:33:55.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:33:55.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:33:55.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:33:56.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:33:56.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:33:56.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:33:56.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:33:56.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:33:56.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:33:56.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:33:56.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:33:56.339 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:33:56.553 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:33:56.901 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:33:57.008 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:33:57.008 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:33:57.008 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:33:57.264 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:33:57.264 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:34:27.294 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:34:27.295 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:34:27.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:34:27.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:34:27.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:34:27.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:34:27.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:34:27.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:34:27.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:34:27.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:34:27.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:34:27.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:34:27.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:34:30.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:34:30.404 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:34:30.405 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:34:30.405 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:34:30.417 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:34:30.429 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:34:30.430 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:34:30.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:34:30.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:34:30.431 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:34:30.432 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:34:30.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:34:30.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:34:30.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:34:30.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:34:30.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:34:30.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:34:30.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:34:30.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:34:30.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:34:30.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:34:30.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:34:30.710 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:34:30.780 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:34:17
2026-06-04T04:34:30.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87938, datetime.datetime(2026, 6, 4, 4, 34, 17), datetime.datetime(2026, 6, 4, 4, 34, 16), 'salt', 1.5, 100.61, None, 44.49, 137.62, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:34:30.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:34:30.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:34:30.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:34:16, diff=14.787427s, valid=True
2026-06-04T04:34:30.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:34:30.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:34:30.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:34:12, diff=18.790569s, valid=True
2026-06-04T04:34:30.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:34:30.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:34:30.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:34:11, diff=19.798071s, valid=True
2026-06-04T04:34:30.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:34:30.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:34:30.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:34:30.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:34:30.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:34:30.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:34:30.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:34:12, diff=18.801407s, valid=True
2026-06-04T04:34:30.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:34:30.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:34:30.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:34:30.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114667.80214s, valid=True
2026-06-04T04:34:30.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:34:30.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:34:30.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:34:30.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:34:30.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:34:30.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:34:30.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:34:30.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:34:30.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:34:30.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:34:30.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:34:31.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:34:31.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:34:31.119 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:34:31.333 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:34:31.680 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:34:31.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:34:31.782 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:34:31.782 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:34:32.035 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:34:32.036 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:35:02.066 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:35:02.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:35:02.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:35:02.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:35:02.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:35:02.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:35:02.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:35:02.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:35:02.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:35:02.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:35:02.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:35:02.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:35:02.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:35:05.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:35:05.008 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:35:05.009 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:35:05.009 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:35:05.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:35:05.034 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:35:05.035 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:35:05.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:35:05.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:35:05.036 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:35:05.036 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:35:05.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:35:05.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:35:05.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:35:05.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:35:05.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:35:05.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:35:05.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:35:05.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:35:05.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:35:05.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:35:05.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:35:05.418 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:35:05.487 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:34:47
2026-06-04T04:35:05.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87939, datetime.datetime(2026, 6, 4, 4, 34, 47), datetime.datetime(2026, 6, 4, 4, 34, 46), 'salt', 1.47, 100.71, None, 42.69, 132.22, -0.1, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:35:05.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:35:05.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:35:05.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:34:46, diff=19.493762s, valid=True
2026-06-04T04:35:05.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:35:05.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:35:05.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:35:12, diff=-6.503267s, valid=True
2026-06-04T04:35:05.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:35:05.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:35:05.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:34:42, diff=23.503713s, valid=True
2026-06-04T04:35:05.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:35:05.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:35:05.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:35:05.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:35:05.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:35:05.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:35:05.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:35:12, diff=-6.493252s, valid=True
2026-06-04T04:35:05.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:35:05.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:35:05.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:35:05.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114702.507392s, valid=True
2026-06-04T04:35:05.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:35:05.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:35:05.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:35:05.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:35:05.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:35:05.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:35:05.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:35:05.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:35:05.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:35:05.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:35:05.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:35:05.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:35:05.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:35:05.822 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:35:06.035 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:35:06.381 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:35:06.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:35:06.483 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:35:06.483 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:35:06.707 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:35:06.707 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:35:36.725 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:35:36.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:35:36.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:35:36.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:35:36.882 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:35:37.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:35:37.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:35:37.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:35:37.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:35:37.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:35:37.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:35:37.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:35:37.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:35:39.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:35:39.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:35:39.576 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:35:39.576 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:35:39.585 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:35:39.598 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:35:39.599 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:35:39.600 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:35:39.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:35:39.601 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:35:39.601 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:35:39.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:35:39.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:35:39.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:35:39.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:35:39.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:35:39.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:35:39.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:35:39.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:35:39.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:35:39.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:35:39.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:35:39.931 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:35:40.004 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:35:17
2026-06-04T04:35:40.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87940, datetime.datetime(2026, 6, 4, 4, 35, 17), datetime.datetime(2026, 6, 4, 4, 35, 17), 'salt', 1.47, 100.61, None, 44.88, 135.06, -0.08, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:35:40.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:35:40.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:35:40.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:35:17, diff=23.011197s, valid=True
2026-06-04T04:35:40.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:35:40.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:35:40.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:35:12, diff=28.01452s, valid=True
2026-06-04T04:35:40.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:35:40.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:35:40.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:35:12, diff=28.021761s, valid=True
2026-06-04T04:35:40.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:35:40.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:35:40.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:35:40.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:35:40.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:35:40.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:35:40.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:35:12, diff=28.025477s, valid=True
2026-06-04T04:35:40.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:35:40.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:35:40.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:35:40.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114737.026579s, valid=True
2026-06-04T04:35:40.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:35:40.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:35:40.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:35:40.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:35:40.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:35:40.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:35:40.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:35:40.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:35:40.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:35:40.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:35:40.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:35:40.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:35:40.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:35:40.368 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:35:40.581 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:35:40.981 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:35:41.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:35:41.083 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:35:41.083 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:35:41.340 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:35:41.340 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:36:11.370 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:36:11.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:36:11.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:36:11.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:36:11.939 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:36:12.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:36:12.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:36:12.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:36:12.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:36:12.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:36:12.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:36:12.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:36:12.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:36:14.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:36:14.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:36:14.673 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:36:14.673 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:36:14.684 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:36:14.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:36:14.697 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:36:14.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:36:14.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:36:14.699 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:36:14.699 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:36:14.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:36:14.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:36:14.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:36:14.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:36:14.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:36:14.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:36:14.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:36:15.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:36:15.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:36:15.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:36:15.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:36:15.035 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:36:15.108 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:35:48
2026-06-04T04:36:15.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87941, datetime.datetime(2026, 6, 4, 4, 35, 48), datetime.datetime(2026, 6, 4, 4, 35, 47), 'salt', 1.5, 100.58, None, 37.82, 139.01, -0.08, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:36:15.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:36:15.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:36:15.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:35:47, diff=28.116247s, valid=True
2026-06-04T04:36:15.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:36:15.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:36:15.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:36:12, diff=3.119761s, valid=True
2026-06-04T04:36:15.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:36:15.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:36:15.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:35:42, diff=33.127962s, valid=True
2026-06-04T04:36:15.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:36:15.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:36:15.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:36:15.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:36:15.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:36:15.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:36:15.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:36:12, diff=3.13189s, valid=True
2026-06-04T04:36:15.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:36:15.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:36:15.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:36:15.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114772.13272s, valid=True
2026-06-04T04:36:15.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:36:15.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:36:15.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:36:15.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:36:15.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:36:15.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:36:15.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:36:15.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:36:15.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:36:15.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:36:15.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:36:15.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:36:15.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:36:15.452 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:36:15.665 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:36:16.010 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:36:16.113 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:36:16.113 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:36:16.113 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:36:16.309 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:36:16.309 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:36:46.312 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:36:46.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:36:46.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:36:46.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:36:46.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:36:46.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:36:46.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:36:46.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:36:46.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:36:46.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:36:46.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:36:46.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:36:46.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:36:49.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:36:49.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:36:49.273 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:36:49.273 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:36:49.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:36:49.295 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:36:49.295 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:36:49.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:36:49.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:36:49.297 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:36:49.297 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:36:49.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:36:49.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:36:49.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:36:49.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:36:49.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:36:49.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:36:49.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:36:49.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:36:49.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:36:49.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:36:49.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:36:49.646 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:36:49.716 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:36:48
2026-06-04T04:36:49.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87943, datetime.datetime(2026, 6, 4, 4, 36, 48), datetime.datetime(2026, 6, 4, 4, 36, 47), 'salt', 1.4, 100.61, None, 41.99, 144.69, -0.09, 820.68, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:36:49.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:36:49.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:36:49.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:36:47, diff=2.724276s, valid=True
2026-06-04T04:36:49.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:36:49.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:36:49.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:37:12, diff=-22.27224s, valid=True
2026-06-04T04:36:49.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:36:49.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:36:49.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:36:43, diff=6.735847s, valid=True
2026-06-04T04:36:49.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:36:49.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:36:49.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:36:49.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:36:49.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:36:49.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:36:49.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:37:12, diff=-22.26042s, valid=True
2026-06-04T04:36:49.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:36:49.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:36:49.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:36:49.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114806.740397s, valid=True
2026-06-04T04:36:49.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:36:49.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:36:49.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:36:49.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:36:49.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:36:49.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:36:49.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:36:49.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:36:49.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:36:49.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:36:49.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:36:49.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:36:50.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:36:50.162 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:36:50.366 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:36:50.702 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:36:50.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:36:50.799 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:36:50.799 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:36:50.956 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:36:50.956 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:37:20.987 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:37:20.987 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:37:20.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:37:21.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:37:21.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:37:21.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:37:21.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:37:21.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:37:21.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:37:21.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:37:21.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:37:21.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:37:21.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:37:24.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:37:24.203 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:37:24.203 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:37:24.204 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:37:24.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:37:24.226 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:37:24.226 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:37:24.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:37:24.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:37:24.228 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:37:24.228 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:37:24.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:37:24.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:37:24.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:37:24.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:37:24.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:37:24.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:37:24.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:37:24.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:37:24.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:37:24.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:37:24.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:37:24.573 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:37:24.649 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:37:18
2026-06-04T04:37:24.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87944, datetime.datetime(2026, 6, 4, 4, 37, 18), datetime.datetime(2026, 6, 4, 4, 37, 18), 'salt', 1.43, 100.58, None, 39.48, 147.53, -0.09, 820.68, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:37:24.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:37:24.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:37:24.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:37:18, diff=6.657226s, valid=True
2026-06-04T04:37:24.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:37:24.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:37:24.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:37:12, diff=12.660773s, valid=True
2026-06-04T04:37:24.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:37:24.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:37:24.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:37:13, diff=11.669112s, valid=True
2026-06-04T04:37:24.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:37:24.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:37:24.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:37:24.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:37:24.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:37:24.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:37:24.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:37:12, diff=12.672931s, valid=True
2026-06-04T04:37:24.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:37:24.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:37:24.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:37:24.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114841.673768s, valid=True
2026-06-04T04:37:24.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:37:24.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:37:24.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:37:24.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:37:24.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:37:24.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:37:24.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:37:24.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:37:24.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:37:24.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:37:24.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:37:24.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:37:24.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:37:24.997 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:37:25.224 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:37:25.567 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:37:25.669 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:37:25.669 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:37:25.669 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:37:25.759 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:37:25.760 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:37:55.790 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:37:55.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:37:55.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:37:56.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:37:56.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:37:56.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:37:56.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:37:56.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:37:56.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:37:56.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:37:56.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:37:56.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:37:56.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:37:58.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:37:58.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:37:58.871 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:37:58.872 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:37:58.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:37:58.898 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:37:58.899 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:37:58.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:37:58.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:37:58.900 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:37:58.900 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:37:58.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:37:59.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:37:59.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:37:59.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:37:59.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:37:59.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:37:59.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:37:59.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:37:59.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:37:59.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:37:59.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:37:59.238 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:37:59.308 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:37:49
2026-06-04T04:37:59.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87945, datetime.datetime(2026, 6, 4, 4, 37, 49), datetime.datetime(2026, 6, 4, 4, 37, 48), 'salt', 1.43, 100.64, None, 42.94, 126.63, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:37:59.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:37:59.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:37:59.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:37:48, diff=11.316027s, valid=True
2026-06-04T04:37:59.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:37:59.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:37:59.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:38:12, diff=-12.680387s, valid=True
2026-06-04T04:37:59.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:37:59.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:37:59.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:37:43, diff=16.327787s, valid=True
2026-06-04T04:37:59.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:37:59.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:37:59.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:37:59.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:37:59.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:37:59.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:37:59.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:38:12, diff=-12.668521s, valid=True
2026-06-04T04:37:59.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:37:59.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:37:59.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:37:59.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114876.332297s, valid=True
2026-06-04T04:37:59.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:37:59.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:37:59.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:37:59.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:37:59.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:37:59.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:37:59.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:37:59.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:37:59.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:37:59.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:37:59.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:37:59.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:37:59.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:37:59.724 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:37:59.941 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:38:00.301 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:38:00.402 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:38:00.402 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:38:00.402 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:38:00.611 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:38:00.612 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:38:30.642 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:38:30.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:38:30.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:38:30.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:38:30.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:38:31.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:38:31.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:38:31.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:38:31.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:38:31.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:38:31.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:38:31.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:38:31.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:38:33.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:38:33.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:38:33.997 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:38:33.997 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:38:34.006 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:38:34.026 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:38:34.026 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:38:34.027 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:38:34.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:38:34.027 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:38:34.027 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:38:34.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:38:34.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:38:34.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:38:34.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:38:34.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:38:34.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:38:34.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:38:34.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:38:34.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:38:34.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:38:34.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:38:34.384 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:38:34.456 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:38:19
2026-06-04T04:38:34.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87946, datetime.datetime(2026, 6, 4, 4, 38, 19), datetime.datetime(2026, 6, 4, 4, 38, 18), 'salt', 1.47, 100.61, None, 43.36, 131.04, -0.08, 820.68, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:38:34.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:38:34.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:38:34.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:38:18, diff=16.463777s, valid=True
2026-06-04T04:38:34.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:38:34.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:38:34.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:38:12, diff=22.467263s, valid=True
2026-06-04T04:38:34.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:38:34.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:38:34.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:38:14, diff=20.475519s, valid=True
2026-06-04T04:38:34.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:38:34.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:38:34.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:38:34.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:38:34.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:38:34.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:38:34.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:38:12, diff=22.479299s, valid=True
2026-06-04T04:38:34.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:38:34.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:38:34.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:38:34.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114911.480124s, valid=True
2026-06-04T04:38:34.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:38:34.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:38:34.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:38:34.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:38:34.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:38:34.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:38:34.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:38:34.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:38:34.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:38:34.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:38:34.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:38:34.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:38:34.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:38:34.801 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:38:35.007 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:38:35.349 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:38:35.450 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:38:35.450 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:38:35.450 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:38:35.639 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:38:35.639 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:39:05.661 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:39:05.661 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:39:05.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:39:05.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:39:05.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:39:06.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:39:06.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:39:06.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:39:06.244 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:39:06.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:39:06.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:39:06.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:39:06.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:39:08.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:39:08.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:39:08.699 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:39:08.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:39:08.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:39:08.722 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:39:08.723 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:39:08.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:39:08.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:39:08.724 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:39:08.724 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:39:08.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:39:08.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:39:08.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:39:08.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:39:08.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:39:09.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:39:09.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:39:09.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:39:09.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:39:09.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:39:09.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:39:09.057 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:39:09.127 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:38:49
2026-06-04T04:39:09.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87947, datetime.datetime(2026, 6, 4, 4, 38, 49), datetime.datetime(2026, 6, 4, 4, 38, 48), 'salt', 1.33, 100.58, None, 41.6, 136.68, -0.09, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:39:09.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:39:09.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:39:09.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:38:48, diff=21.134918s, valid=True
2026-06-04T04:39:09.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:39:09.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:39:09.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:39:12, diff=-2.861579s, valid=True
2026-06-04T04:39:09.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:39:09.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:39:09.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:38:44, diff=25.146757s, valid=True
2026-06-04T04:39:09.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:39:09.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:39:09.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:39:09.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:39:09.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:39:09.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:39:09.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:39:12, diff=-2.849536s, valid=True
2026-06-04T04:39:09.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:39:09.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:39:09.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:39:09.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114946.151307s, valid=True
2026-06-04T04:39:09.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:39:09.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:39:09.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:39:09.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:39:09.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:39:09.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:39:09.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:39:09.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:39:09.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:39:09.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:39:09.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:39:09.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:39:09.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:39:09.540 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:39:09.747 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:39:10.114 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:39:10.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:39:10.218 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:39:10.218 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:39:10.404 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:39:10.404 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:39:40.434 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:39:40.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:39:40.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:39:40.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:39:40.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:39:40.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:39:40.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:39:40.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:39:40.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:39:40.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:39:40.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:39:40.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:39:40.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:39:43.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:39:43.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:39:43.289 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:39:43.289 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:39:43.299 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:39:43.312 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:39:43.312 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:39:43.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:39:43.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:39:43.313 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:39:43.314 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:39:43.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:39:43.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:39:43.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:39:43.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:39:43.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:39:43.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:39:43.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:39:43.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:39:43.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:39:43.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:39:43.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:39:43.645 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:39:43.717 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:39:19
2026-06-04T04:39:43.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87948, datetime.datetime(2026, 6, 4, 4, 39, 19), datetime.datetime(2026, 6, 4, 4, 39, 19), 'salt', 1.47, 100.68, None, 48.27, 134.8, -0.09, 820.56, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T04:39:43.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:39:43.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:39:43.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:39:19, diff=24.725587s, valid=True
2026-06-04T04:39:43.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:39:43.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:39:43.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:39:12, diff=31.729109s, valid=True
2026-06-04T04:39:43.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:39:43.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:39:43.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:39:14, diff=29.737211s, valid=True
2026-06-04T04:39:43.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:39:43.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:39:43.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:39:43.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:39:43.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:39:43.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:39:43.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:39:12, diff=31.740919s, valid=True
2026-06-04T04:39:43.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:39:43.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:39:43.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:39:43.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=114980.741727s, valid=True
2026-06-04T04:39:43.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:39:43.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:39:43.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:39:43.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:39:43.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:39:43.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:39:43.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:39:43.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:39:43.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:39:43.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:39:43.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:39:43.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:39:44.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:39:44.061 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:39:44.266 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:39:44.606 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:39:44.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:39:44.706 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:39:44.706 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:39:44.904 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:39:44.904 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:40:14.906 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:40:14.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:40:14.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:40:15.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:40:15.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:40:15.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:40:15.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:40:15.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:40:15.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:40:15.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:40:15.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:40:15.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:40:15.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:40:17.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:40:18.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:40:18.007 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:40:18.007 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:40:18.018 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:40:18.031 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:40:18.031 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:40:18.032 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:40:18.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:40:18.033 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:40:18.033 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:40:18.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:40:18.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:40:18.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:40:18.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:40:18.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:40:18.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:40:18.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:40:18.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:40:18.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:40:18.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:40:18.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:40:18.374 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:40:18.445 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:39:50
2026-06-04T04:40:18.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87949, datetime.datetime(2026, 6, 4, 4, 39, 50), datetime.datetime(2026, 6, 4, 4, 39, 49), 'salt', 1.33, 100.54, None, 51.69, 134.54, -0.08, 820.68, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T04:40:18.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:40:18.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:40:18.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:39:49, diff=29.453095s, valid=True
2026-06-04T04:40:18.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:40:18.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:40:18.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:40:12, diff=6.456593s, valid=True
2026-06-04T04:40:18.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:40:18.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:40:18.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:39:44, diff=34.464756s, valid=True
2026-06-04T04:40:18.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:40:18.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:40:18.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:40:18.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:40:18.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:40:18.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:40:18.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:40:12, diff=6.468456s, valid=True
2026-06-04T04:40:18.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:40:18.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:40:18.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:40:18.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115015.469269s, valid=True
2026-06-04T04:40:18.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:40:18.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:40:18.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:40:18.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:40:18.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:40:18.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:40:18.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:40:18.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:40:18.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:40:18.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:40:18.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:40:18.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:40:18.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:40:18.787 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:40:18.993 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:40:19.331 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:40:19.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:40:19.432 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:40:19.432 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:40:19.707 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:40:19.707 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:40:49.735 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:40:49.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:40:49.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:40:50.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:40:50.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:40:50.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:40:50.396 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:40:50.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:40:50.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:40:50.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:40:50.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:40:50.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:40:50.428 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:40:52.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:40:52.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:40:52.879 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:40:52.879 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:40:52.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:40:52.901 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:40:52.902 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:40:52.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:40:52.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:40:52.903 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:40:52.903 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:40:52.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:40:53.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:40:53.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:40:53.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:40:53.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:40:53.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:40:53.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:40:53.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:40:53.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:40:53.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:40:53.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:40:53.211 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:40:53.282 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:40:50
2026-06-04T04:40:53.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87951, datetime.datetime(2026, 6, 4, 4, 40, 50), datetime.datetime(2026, 6, 4, 4, 40, 49), 'salt', 1.43, 100.68, None, 42.9, 134.14, -0.1, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:40:53.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:40:53.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:40:53.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:40:49, diff=4.288603s, valid=True
2026-06-04T04:40:53.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:40:53.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:40:53.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:41:12, diff=-18.708477s, valid=True
2026-06-04T04:40:53.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:40:53.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:40:53.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:40:45, diff=8.299133s, valid=True
2026-06-04T04:40:53.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:40:53.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:40:53.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:40:53.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:40:53.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:40:53.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:40:53.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:41:12, diff=-18.697294s, valid=True
2026-06-04T04:40:53.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:40:53.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:40:53.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:40:53.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115050.303466s, valid=True
2026-06-04T04:40:53.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:40:53.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:40:53.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:40:53.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:40:53.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:40:53.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:40:53.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:40:53.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:40:53.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:40:53.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:40:53.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:40:53.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:40:53.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:40:53.683 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:40:53.962 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:40:54.299 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:40:54.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:40:54.399 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:40:54.399 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:40:54.669 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:40:54.669 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:41:24.694 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:41:24.694 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:41:24.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:41:24.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:41:24.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:41:25.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:41:25.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:41:25.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:41:25.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:41:25.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:41:25.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:41:25.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:41:25.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:41:27.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:41:27.622 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:41:27.623 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:41:27.623 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:41:27.634 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:41:27.646 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:41:27.647 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:41:27.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:41:27.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:41:27.648 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:41:27.648 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:41:27.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:41:27.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:41:27.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:41:27.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:41:27.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:41:27.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:41:27.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:41:27.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:41:27.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:41:27.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:41:27.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:41:27.994 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:41:28.123 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:41:20
2026-06-04T04:41:28.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87952, datetime.datetime(2026, 6, 4, 4, 41, 20), datetime.datetime(2026, 6, 4, 4, 41, 20), 'salt', 1.4, 100.61, None, 43.79, 137.2, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:41:28.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:41:28.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:41:28.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:41:20, diff=8.131308s, valid=True
2026-06-04T04:41:28.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:41:28.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:41:28.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:41:12, diff=16.134786s, valid=True
2026-06-04T04:41:28.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:41:28.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:41:28.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:41:15, diff=13.14289s, valid=True
2026-06-04T04:41:28.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:41:28.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:41:28.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:41:28.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:41:28.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:41:28.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:41:28.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:41:12, diff=16.146542s, valid=True
2026-06-04T04:41:28.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:41:28.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:41:28.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:41:28.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115085.147337s, valid=True
2026-06-04T04:41:28.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:41:28.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:41:28.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:41:28.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:41:28.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:41:28.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:41:28.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:41:28.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:41:28.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:41:28.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:41:28.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:41:28.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:41:28.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:41:28.469 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:41:28.674 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:41:29.012 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:41:29.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:41:29.112 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:41:29.112 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:41:29.197 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:41:29.198 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:41:59.223 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:41:59.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:41:59.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:41:59.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:41:59.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:41:59.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:41:59.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:41:59.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:41:59.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:41:59.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:41:59.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:41:59.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:41:59.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:42:02.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:42:02.532 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:42:02.532 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:42:02.532 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:42:02.542 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:42:02.554 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:42:02.555 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:42:02.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:42:02.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:42:02.556 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:42:02.556 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:42:02.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:42:02.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:42:02.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:42:02.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:42:02.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:42:02.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:42:02.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:42:02.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:42:02.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:42:02.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:42:02.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:42:02.907 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:42:02.977 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:41:51
2026-06-04T04:42:02.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87953, datetime.datetime(2026, 6, 4, 4, 41, 51), datetime.datetime(2026, 6, 4, 4, 41, 50), 'salt', 1.47, 100.71, None, 39.41, 128.67, -0.1, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:42:02.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:42:02.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:42:02.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:41:50, diff=12.984259s, valid=True
2026-06-04T04:42:02.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:42:02.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:42:02.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:42:12, diff=-9.012248s, valid=True
2026-06-04T04:42:02.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:42:02.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:42:02.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:41:45, diff=17.995979s, valid=True
2026-06-04T04:42:02.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:42:02.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:42:02.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:42:02.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:42:02.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:42:02.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:42:02.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:42:12, diff=-9.000288s, valid=True
2026-06-04T04:42:02.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:42:02.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:42:02.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:42:03.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115120.000523s, valid=True
2026-06-04T04:42:03.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:42:03.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:42:03.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:42:03.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:42:03.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:42:03.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:42:03.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:42:03.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:42:03.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:42:03.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:42:03.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:42:03.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:42:03.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:42:03.395 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:42:03.602 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:42:03.942 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:42:04.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:42:04.044 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:42:04.044 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:42:04.256 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:42:04.256 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:42:34.259 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:42:34.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:42:34.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:42:34.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:42:34.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:42:35.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:42:35.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:42:35.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:42:35.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:42:35.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:42:35.034 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:42:35.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:42:35.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:42:37.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:42:37.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:42:37.489 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:42:37.489 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:42:37.499 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:42:37.511 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:42:37.512 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:42:37.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:42:37.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:42:37.513 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:42:37.513 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:42:37.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:42:37.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:42:37.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:42:37.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:42:37.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:42:37.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:42:37.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:42:37.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:42:37.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:42:37.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:42:37.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:42:37.855 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:42:37.927 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:42:21
2026-06-04T04:42:37.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87954, datetime.datetime(2026, 6, 4, 4, 42, 21), datetime.datetime(2026, 6, 4, 4, 42, 20), 'salt', 1.43, 100.64, None, 33.7, 128.39, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:42:37.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:42:37.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:42:37.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:42:20, diff=17.933402s, valid=True
2026-06-04T04:42:37.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:42:37.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:42:37.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:42:12, diff=25.93623s, valid=True
2026-06-04T04:42:37.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:42:37.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:42:37.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:42:16, diff=21.942921s, valid=True
2026-06-04T04:42:37.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:42:37.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:42:37.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:42:37.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:42:37.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:42:37.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:42:37.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:42:12, diff=25.945914s, valid=True
2026-06-04T04:42:37.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:42:37.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:42:37.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:42:37.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115154.946577s, valid=True
2026-06-04T04:42:37.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:42:37.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:42:37.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:42:37.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:42:37.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:42:38.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:42:38.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:42:38.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:42:38.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:42:38.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:42:38.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:42:38.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:42:38.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:42:38.264 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:42:38.472 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:42:38.831 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:42:38.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:42:38.932 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:42:38.932 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:42:39.021 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:42:39.021 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:43:09.041 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:43:09.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:43:09.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:43:09.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:43:09.353 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:43:09.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:43:09.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:43:09.601 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:43:09.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:43:09.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:43:09.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:43:09.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:43:09.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:43:12.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:43:12.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:43:12.064 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:43:12.064 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:43:12.075 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:43:12.088 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:43:12.088 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:43:12.089 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:43:12.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:43:12.089 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:43:12.090 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:43:12.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:43:12.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:43:12.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:43:12.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:43:12.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:43:12.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:43:12.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:43:12.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:43:12.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:43:12.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:43:12.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:43:12.421 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:43:12.495 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:42:51
2026-06-04T04:43:12.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87955, datetime.datetime(2026, 6, 4, 4, 42, 51), datetime.datetime(2026, 6, 4, 4, 42, 50), 'salt', 1.47, 100.74, None, 40.58, 140.25, -0.1, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:43:12.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:43:12.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:43:12.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:42:50, diff=22.50309s, valid=True
2026-06-04T04:43:12.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:43:12.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:43:12.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:43:12, diff=0.506591s, valid=True
2026-06-04T04:43:12.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:43:12.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:43:12.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:42:46, diff=26.514877s, valid=True
2026-06-04T04:43:12.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:43:12.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:43:12.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:43:12.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:43:12.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:43:12.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:43:12.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:43:12, diff=0.518599s, valid=True
2026-06-04T04:43:12.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:43:12.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:43:12.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:43:12.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115189.519414s, valid=True
2026-06-04T04:43:12.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:43:12.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:43:12.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:43:12.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:43:12.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:43:12.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:43:12.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:43:12.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:43:12.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:43:12.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:43:12.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:43:12.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:43:12.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:43:12.909 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:43:13.115 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:43:13.456 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:43:13.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:43:13.559 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:43:13.559 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:43:13.796 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:43:13.796 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:43:43.827 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:43:43.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:43:43.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:43:44.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:43:44.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:43:44.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:43:44.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:43:44.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:43:44.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:43:44.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:43:44.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:43:44.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:43:44.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:43:46.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:43:46.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:43:46.903 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:43:46.903 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:43:46.913 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:43:46.925 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:43:46.926 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:43:46.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:43:46.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:43:46.927 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:43:46.927 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:43:46.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:43:47.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:43:47.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:43:47.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:43:47.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:43:47.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:43:47.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:43:47.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:43:47.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:43:47.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:43:47.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:43:47.274 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:43:47.349 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:43:21
2026-06-04T04:43:47.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87956, datetime.datetime(2026, 6, 4, 4, 43, 21), datetime.datetime(2026, 6, 4, 4, 43, 21), 'salt', 1.37, 100.58, None, 45.09, 139.17, -0.08, 820.86, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T04:43:47.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:43:47.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:43:47.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:43:21, diff=26.356897s, valid=True
2026-06-04T04:43:47.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:43:47.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:43:47.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:43:12, diff=35.360446s, valid=True
2026-06-04T04:43:47.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:43:47.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:43:47.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:43:16, diff=31.368701s, valid=True
2026-06-04T04:43:47.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:43:47.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:43:47.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:43:47.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:43:47.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:43:47.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:43:47.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:43:12, diff=35.372445s, valid=True
2026-06-04T04:43:47.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:43:47.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:43:47.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:43:47.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115224.373323s, valid=True
2026-06-04T04:43:47.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:43:47.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:43:47.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:43:47.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:43:47.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:43:47.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:43:47.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:43:47.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:43:47.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:43:47.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:43:47.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:43:47.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:43:47.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:43:47.696 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:43:47.904 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:43:48.249 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:43:48.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:43:48.350 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:43:48.350 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:43:48.623 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:43:48.623 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:44:18.653 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:44:18.653 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:44:18.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:44:18.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:44:18.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:44:19.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:44:19.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:44:19.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:44:19.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:44:19.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:44:19.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:44:19.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:44:19.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:44:21.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:44:21.722 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:44:21.723 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:44:21.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:44:21.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:44:21.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:44:21.749 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:44:21.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:44:21.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:44:21.750 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:44:21.750 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:44:21.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:44:21.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:44:21.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:44:21.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:44:21.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:44:22.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:44:22.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:44:22.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:44:22.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:44:22.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:44:22.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:44:22.081 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:44:22.152 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:43:52
2026-06-04T04:44:22.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87957, datetime.datetime(2026, 6, 4, 4, 43, 52), datetime.datetime(2026, 6, 4, 4, 43, 51), 'salt', 1.47, 100.68, None, 32.28, 128.74, -0.09, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:44:22.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:44:22.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:44:22.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:43:51, diff=31.159385s, valid=True
2026-06-04T04:44:22.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:44:22.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:44:22.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:44:12, diff=10.16288s, valid=True
2026-06-04T04:44:22.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:44:22.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:44:22.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:43:47, diff=35.171109s, valid=True
2026-06-04T04:44:22.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:44:22.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:44:22.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:44:22.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:44:22.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:44:22.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:44:22.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:44:12, diff=10.174888s, valid=True
2026-06-04T04:44:22.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:44:22.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:44:22.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:44:22.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115259.175709s, valid=True
2026-06-04T04:44:22.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:44:22.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:44:22.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:44:22.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:44:22.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:44:22.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:44:22.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:44:22.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:44:22.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:44:22.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:44:22.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:44:22.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:44:22.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:44:22.496 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:44:22.704 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:44:23.045 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:44:23.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:44:23.147 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:44:23.147 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:44:23.343 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:44:23.343 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:44:53.373 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:44:53.373 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:44:53.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:44:53.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:44:53.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:44:53.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:44:53.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:44:53.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:44:53.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:44:53.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:44:53.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:44:53.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:44:53.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:44:56.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:44:56.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:44:56.319 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:44:56.319 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:44:56.327 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:44:56.340 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:44:56.340 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:44:56.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:44:56.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:44:56.342 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:44:56.342 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:44:56.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:44:56.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:44:56.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:44:56.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:44:56.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:44:56.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:44:56.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:44:56.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:44:56.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:44:56.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:44:56.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:44:56.703 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:44:56.787 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:44:52
2026-06-04T04:44:56.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87959, datetime.datetime(2026, 6, 4, 4, 44, 52), datetime.datetime(2026, 6, 4, 4, 44, 51), 'salt', 1.47, 100.61, None, 41.56, 140.25, -0.08, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:44:56.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:44:56.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:44:56.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:44:51, diff=5.794989s, valid=True
2026-06-04T04:44:56.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:44:56.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:44:56.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:45:12, diff=-15.201354s, valid=True
2026-06-04T04:44:56.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:44:56.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:44:56.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:44:47, diff=9.807257s, valid=True
2026-06-04T04:44:56.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:44:56.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:44:56.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:44:56.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:44:56.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:44:56.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:44:56.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:45:12, diff=-15.188811s, valid=True
2026-06-04T04:44:56.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:44:56.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:44:56.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:44:56.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115293.812044s, valid=True
2026-06-04T04:44:56.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:44:56.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:44:56.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:44:56.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:44:56.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:44:56.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:44:56.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:44:56.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:44:56.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:44:56.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:44:57.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:44:57.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:44:57.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:44:57.135 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:44:57.341 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:44:57.739 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:44:57.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:44:57.840 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:44:57.840 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:44:58.105 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:44:58.105 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:45:28.111 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:45:28.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:45:28.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:45:28.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:45:28.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:45:28.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:45:28.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:45:28.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:45:28.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:45:28.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:45:28.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:45:28.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:45:28.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:45:30.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:45:30.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:45:30.911 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:45:30.911 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:45:30.921 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:45:30.934 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:45:30.934 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:45:30.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:45:30.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:45:30.936 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:45:30.936 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:45:30.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:45:31.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:45:31.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:45:31.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:45:31.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:45:31.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:45:31.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:45:31.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:45:31.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:45:31.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:45:31.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:45:31.263 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:45:31.335 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:45:22
2026-06-04T04:45:31.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87960, datetime.datetime(2026, 6, 4, 4, 45, 22), datetime.datetime(2026, 6, 4, 4, 45, 22), 'salt', 1.43, 100.51, None, 35.88, 132.64, -0.08, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:45:31.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:45:31.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:45:31.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:45:22, diff=9.343301s, valid=True
2026-06-04T04:45:31.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:45:31.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:45:31.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:45:12, diff=19.346899s, valid=True
2026-06-04T04:45:31.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:45:31.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:45:31.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:45:17, diff=14.355064s, valid=True
2026-06-04T04:45:31.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:45:31.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:45:31.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:45:31.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:45:31.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:45:31.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:45:31.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:45:12, diff=19.358866s, valid=True
2026-06-04T04:45:31.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:45:31.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:45:31.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:45:31.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115328.359685s, valid=True
2026-06-04T04:45:31.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:45:31.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:45:31.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:45:31.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:45:31.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:45:31.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:45:31.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:45:31.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:45:31.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:45:31.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:45:31.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:45:31.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:45:31.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:45:31.682 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:45:31.888 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:45:32.225 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:45:32.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:45:32.326 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:45:32.326 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:45:32.511 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:45:32.512 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:46:02.542 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:46:02.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:46:02.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:46:03.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:46:03.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:46:03.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:46:03.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:46:03.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:46:03.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:46:03.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:46:03.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:46:03.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:46:03.355 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:46:05.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:46:05.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:46:05.647 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:46:05.648 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:46:05.657 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:46:05.668 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:46:05.669 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:46:05.669 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:46:05.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:46:05.669 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:46:05.669 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:46:05.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:46:05.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:46:05.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:46:05.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:46:05.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:46:05.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:46:05.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:46:05.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:46:05.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:46:05.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:46:05.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:46:05.958 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:46:06.030 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:45:53
2026-06-04T04:46:06.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87961, datetime.datetime(2026, 6, 4, 4, 45, 53), datetime.datetime(2026, 6, 4, 4, 45, 52), 'salt', 1.43, 100.68, None, 39.91, 134.1, -0.1, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:46:06.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:46:06.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:46:06.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:45:52, diff=14.037348s, valid=True
2026-06-04T04:46:06.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:46:06.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:46:06.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:46:12, diff=-5.959406s, valid=True
2026-06-04T04:46:06.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:46:06.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:46:06.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:45:48, diff=18.048192s, valid=True
2026-06-04T04:46:06.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:46:06.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:46:06.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:46:06.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:46:06.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:46:06.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:46:06.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:46:12, diff=-5.948287s, valid=True
2026-06-04T04:46:06.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:46:06.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:46:06.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:46:06.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115363.052464s, valid=True
2026-06-04T04:46:06.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:46:06.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:46:06.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:46:06.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:46:06.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:46:06.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:46:06.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:46:06.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:46:06.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:46:06.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:46:06.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:46:06.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:46:06.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:46:06.444 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:46:06.670 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:46:07.008 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:46:07.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:46:07.108 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:46:07.109 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:46:07.295 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:46:07.295 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:46:37.296 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:46:37.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:46:37.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:46:37.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:46:37.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:46:37.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:46:37.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:46:37.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:46:37.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:46:37.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:46:37.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:46:37.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:46:37.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:46:40.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:46:40.339 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:46:40.340 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:46:40.340 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:46:40.350 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:46:40.363 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:46:40.363 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:46:40.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:46:40.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:46:40.365 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:46:40.365 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:46:40.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:46:40.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:46:40.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:46:40.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:46:40.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:46:40.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:46:40.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:46:40.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:46:40.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:46:40.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:46:40.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:46:40.694 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:46:40.766 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:46:23
2026-06-04T04:46:40.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87962, datetime.datetime(2026, 6, 4, 4, 46, 23), datetime.datetime(2026, 6, 4, 4, 46, 22), 'salt', 1.5, 100.68, None, 42.69, 138.35, -0.1, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:46:40.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:46:40.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:46:40.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:46:22, diff=18.773808s, valid=True
2026-06-04T04:46:40.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:46:40.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:46:40.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:46:12, diff=28.777287s, valid=True
2026-06-04T04:46:40.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:46:40.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:46:40.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:46:18, diff=22.785443s, valid=True
2026-06-04T04:46:40.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:46:40.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:46:40.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:46:40.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:46:40.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:46:40.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:46:40.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:46:12, diff=28.789186s, valid=True
2026-06-04T04:46:40.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:46:40.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:46:40.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:46:40.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115397.790007s, valid=True
2026-06-04T04:46:40.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:46:40.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:46:40.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:46:40.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:46:40.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:46:40.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:46:40.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:46:40.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:46:40.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:46:40.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:46:40.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:46:41.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:46:41.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:46:41.111 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:46:41.319 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:46:41.662 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:46:41.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:46:41.763 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:46:41.764 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:46:42.007 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:46:42.008 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:47:12.037 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:47:12.038 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:47:12.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:47:12.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:47:12.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:47:12.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:47:12.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:47:12.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:47:12.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:47:12.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:47:12.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:47:12.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:47:12.717 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:47:15.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:47:15.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:47:15.261 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:47:15.261 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:47:15.270 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:47:15.282 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:47:15.283 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:47:15.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:47:15.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:47:15.283 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:47:15.283 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:47:15.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:47:15.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:47:15.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:47:15.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:47:15.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:47:15.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:47:15.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:47:15.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:47:15.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:47:15.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:47:15.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:47:15.616 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:47:15.699 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:46:53
2026-06-04T04:47:15.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87963, datetime.datetime(2026, 6, 4, 4, 46, 53), datetime.datetime(2026, 6, 4, 4, 46, 52), 'salt', 1.43, 100.54, None, 40.43, 130.38, -0.08, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:47:15.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:47:15.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:47:15.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:46:52, diff=23.706878s, valid=True
2026-06-04T04:47:15.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:47:15.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:47:15.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:47:12, diff=3.710367s, valid=True
2026-06-04T04:47:15.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:47:15.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:47:15.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:46:48, diff=27.718565s, valid=True
2026-06-04T04:47:15.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:47:15.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:47:15.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:47:15.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:47:15.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:47:15.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:47:15.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:47:12, diff=3.72237s, valid=True
2026-06-04T04:47:15.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:47:15.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:47:15.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:47:15.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115432.723207s, valid=True
2026-06-04T04:47:15.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:47:15.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:47:15.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:47:15.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:47:15.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:47:15.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:47:15.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:47:15.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:47:15.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:47:15.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:47:15.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:47:16.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:47:16.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:47:16.117 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:47:16.333 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:47:16.673 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:47:16.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:47:16.773 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:47:16.773 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:47:17.311 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:47:17.311 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:47:47.331 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:47:47.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:47:47.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:47:47.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:47:47.661 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:47:47.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:47:47.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:47:47.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:47:47.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:47:47.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:47:47.933 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:47:47.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:47:47.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:47:50.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:47:50.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:47:50.395 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:47:50.395 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:47:50.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:47:50.415 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:47:50.415 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:47:50.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:47:50.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:47:50.415 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:47:50.415 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:47:50.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:47:50.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:47:50.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:47:50.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:47:50.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:47:50.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:47:50.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:47:50.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:47:50.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:47:50.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:47:50.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:47:50.756 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:47:50.827 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:47:23
2026-06-04T04:47:50.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87964, datetime.datetime(2026, 6, 4, 4, 47, 23), datetime.datetime(2026, 6, 4, 4, 47, 23), 'salt', 1.47, 100.74, None, 43.57, 137.92, -0.1, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:47:50.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:47:50.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:47:50.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:47:23, diff=27.835265s, valid=True
2026-06-04T04:47:50.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:47:50.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:47:50.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:47:12, diff=38.838752s, valid=True
2026-06-04T04:47:50.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:47:50.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:47:50.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:47:18, diff=32.846847s, valid=True
2026-06-04T04:47:50.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:47:50.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:47:50.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:47:50.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:47:50.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:47:50.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:47:50.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:47:12, diff=38.850565s, valid=True
2026-06-04T04:47:50.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:47:50.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:47:50.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:47:50.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115467.851381s, valid=True
2026-06-04T04:47:50.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:47:50.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:47:50.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:47:50.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:47:50.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:47:50.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:47:50.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:47:50.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:47:50.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:47:50.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:47:51.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:47:51.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:47:51.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:47:51.170 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:47:51.374 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:47:51.711 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:47:51.811 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:47:51.811 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:47:51.811 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:47:51.897 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:47:51.897 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:48:21.902 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:48:21.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:48:21.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:48:22.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:48:22.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:48:22.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:48:22.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:48:22.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:48:22.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:48:22.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:48:22.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:48:22.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:48:22.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:48:24.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:48:24.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:48:24.915 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:48:24.916 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:48:24.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:48:24.938 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:48:24.941 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:48:24.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:48:24.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:48:24.941 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:48:24.942 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:48:24.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:48:25.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-06-04T04:48:25.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:48:25.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:48:25.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:48:25.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:48:25.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:48:25.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:48:25.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:48:25.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:48:25.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:48:25.328 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:48:25.401 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:48:24
2026-06-04T04:48:25.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87966, datetime.datetime(2026, 6, 4, 4, 48, 24), datetime.datetime(2026, 6, 4, 4, 48, 23), 'salt', 1.47, 100.74, None, 42.45, 138.89, -0.1, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:48:25.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:48:25.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-06-04T04:48:25.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:48:23, diff=2.407478s, valid=True
2026-06-04T04:48:25.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:48:25.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:48:25.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:48:12, diff=13.41042s, valid=True
2026-06-04T04:48:25.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:48:25.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:48:25.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:48:19, diff=6.417275s, valid=True
2026-06-04T04:48:25.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:48:25.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:48:25.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:48:25.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:48:25.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:48:25.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:48:25.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:48:12, diff=13.420383s, valid=True
2026-06-04T04:48:25.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:48:25.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:48:25.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:48:25.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115502.421066s, valid=True
2026-06-04T04:48:25.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:48:25.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:48:25.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:48:25.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:48:25.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:48:25.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:48:25.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:48:25.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:48:25.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:48:25.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:48:25.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:48:25.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:48:25.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:48:25.735 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:48:25.939 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:48:26.276 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:48:26.379 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:48:26.379 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:48:26.379 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:48:26.531 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:48:26.531 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:48:56.544 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:48:56.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:48:56.545 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:48:56.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:48:56.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:48:56.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:48:56.952 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:48:56.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:48:56.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:48:56.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:48:56.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:48:56.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:48:56.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:48:59.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:48:59.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:48:59.388 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:48:59.388 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:48:59.399 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:48:59.411 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:48:59.412 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:48:59.412 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:48:59.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:48:59.413 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:48:59.413 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:48:59.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:48:59.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:48:59.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:48:59.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:48:59.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:48:59.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:48:59.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:48:59.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:48:59.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:48:59.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:48:59.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:48:59.750 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:48:59.820 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:48:54
2026-06-04T04:48:59.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87967, datetime.datetime(2026, 6, 4, 4, 48, 54), datetime.datetime(2026, 6, 4, 4, 48, 53), 'salt', 1.43, 100.64, None, 32.39, 133.74, -0.1, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:48:59.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:48:59.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:48:59.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:48:53, diff=6.828146s, valid=True
2026-06-04T04:48:59.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:48:59.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:48:59.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:49:12, diff=-12.168841s, valid=True
2026-06-04T04:48:59.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:48:59.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:48:59.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:48:49, diff=10.838996s, valid=True
2026-06-04T04:48:59.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:48:59.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:48:59.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:48:59.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:48:59.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:48:59.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:48:59.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:49:12, diff=-12.157631s, valid=True
2026-06-04T04:48:59.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:48:59.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:48:59.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:48:59.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115536.843261s, valid=True
2026-06-04T04:48:59.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:48:59.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:48:59.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:48:59.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:48:59.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:48:59.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:48:59.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:48:59.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:48:59.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:48:59.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:49:00.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:49:00.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:49:00.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:49:00.178 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:49:00.383 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:49:00.778 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:49:00.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:49:00.878 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:49:00.878 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:49:00.967 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:49:00.968 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:49:30.974 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:49:30.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:49:30.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:49:31.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:49:31.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:49:31.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:49:31.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:49:31.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:49:31.545 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:49:31.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:49:31.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:49:31.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:49:31.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:49:34.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:49:34.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:49:34.196 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:49:34.196 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:49:34.206 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:49:34.218 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:49:34.219 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:49:34.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:49:34.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:49:34.220 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:49:34.220 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:49:34.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:49:34.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:49:34.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:49:34.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:49:34.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:49:34.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:49:34.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:49:34.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:49:34.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:49:34.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:49:34.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:49:34.559 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:49:34.629 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:49:24
2026-06-04T04:49:34.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87968, datetime.datetime(2026, 6, 4, 4, 49, 24), datetime.datetime(2026, 6, 4, 4, 49, 24), 'salt', 1.57, 100.68, None, 29.14, 135.53, -0.09, 820.87, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:49:34.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:49:34.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:49:34.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:49:24, diff=10.635121s, valid=True
2026-06-04T04:49:34.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:49:34.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:49:34.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:49:12, diff=22.637997s, valid=True
2026-06-04T04:49:34.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:49:34.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:49:34.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:49:20, diff=14.644651s, valid=True
2026-06-04T04:49:34.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:49:34.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:49:34.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:49:34.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:49:34.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:49:34.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:49:34.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:49:12, diff=22.647892s, valid=True
2026-06-04T04:49:34.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:49:34.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:49:34.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:49:34.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115571.648603s, valid=True
2026-06-04T04:49:34.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:49:34.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:49:34.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:49:34.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:49:34.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:49:34.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:49:34.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:49:34.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:49:34.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:49:34.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:49:34.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:49:34.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:49:34.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:49:34.999 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:49:35.204 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:49:35.540 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:49:35.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:49:35.640 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:49:35.640 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:49:35.904 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:49:35.904 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:50:05.935 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:50:05.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:50:05.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:50:06.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:50:06.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:50:06.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:50:06.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:50:06.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:50:06.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:50:06.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:50:06.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:50:06.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:50:06.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:50:09.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:50:09.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:50:09.329 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:50:09.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:50:09.340 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:50:09.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:50:09.353 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:50:09.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:50:09.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:50:09.354 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:50:09.355 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:50:09.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:50:09.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:50:09.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:50:09.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:50:09.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:50:09.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:50:09.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:50:09.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:50:09.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:50:09.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:50:09.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:50:09.706 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:50:09.786 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:49:55
2026-06-04T04:50:09.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87969, datetime.datetime(2026, 6, 4, 4, 49, 55), datetime.datetime(2026, 6, 4, 4, 49, 54), 'salt', 1.4, 100.68, None, 42.66, 137.62, -0.1, 820.87, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:50:09.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:50:09.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:50:09.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:49:54, diff=15.794169s, valid=True
2026-06-04T04:50:09.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:50:09.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:50:09.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:50:12, diff=-2.202172s, valid=True
2026-06-04T04:50:09.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:50:09.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:50:09.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:49:50, diff=19.806387s, valid=True
2026-06-04T04:50:09.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:50:09.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:50:09.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:50:09.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:50:09.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:50:09.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:50:09.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:50:12, diff=-2.189727s, valid=True
2026-06-04T04:50:09.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:50:09.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:50:09.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:50:09.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115606.811113s, valid=True
2026-06-04T04:50:09.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:50:09.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:50:09.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:50:09.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:50:09.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:50:09.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:50:09.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:50:09.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:50:09.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:50:09.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:50:10.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:50:10.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:50:10.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:50:10.152 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:50:10.445 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:50:10.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:50:10.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:50:10.895 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:50:10.895 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:50:11.085 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:50:11.086 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:50:41.115 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:50:41.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:50:41.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:50:41.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:50:41.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:50:41.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:50:41.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:50:41.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:50:41.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:50:41.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:50:41.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:50:41.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:50:41.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:50:44.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:50:44.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:50:44.466 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:50:44.467 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:50:44.477 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:50:44.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:50:44.491 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:50:44.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:50:44.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:50:44.492 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:50:44.492 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:50:44.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:50:44.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:50:44.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:50:44.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:50:44.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:50:44.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:50:44.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:50:44.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:50:44.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:50:44.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:50:44.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:50:44.849 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:50:44.924 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:50:25
2026-06-04T04:50:44.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87970, datetime.datetime(2026, 6, 4, 4, 50, 25), datetime.datetime(2026, 6, 4, 4, 50, 24), 'salt', 1.53, 100.64, None, 44.24, 145.61, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:50:44.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:50:44.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:50:44.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:50:24, diff=20.93181s, valid=True
2026-06-04T04:50:44.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:50:44.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:50:44.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:50:12, diff=32.935425s, valid=True
2026-06-04T04:50:44.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:50:44.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:50:44.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:50:20, diff=24.943994s, valid=True
2026-06-04T04:50:44.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:50:44.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:50:44.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:50:44.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:50:44.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:50:44.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:50:44.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:50:12, diff=32.947865s, valid=True
2026-06-04T04:50:44.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:50:44.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:50:44.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:50:44.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115641.948701s, valid=True
2026-06-04T04:50:44.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:50:44.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:50:44.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:50:44.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:50:44.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:50:45.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:50:45.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:50:45.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:50:45.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:50:45.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:50:45.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:50:45.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:50:45.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:50:45.272 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:50:45.485 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:50:45.831 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:50:45.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:50:45.935 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:50:45.935 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:50:46.020 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:50:46.020 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:51:16.050 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:51:16.051 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:51:16.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:51:16.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:51:16.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:51:16.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:51:16.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:51:16.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:51:16.661 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:51:16.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:51:16.674 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:51:16.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:51:16.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:51:19.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:51:19.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:51:19.075 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:51:19.075 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:51:19.087 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:51:19.100 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:51:19.101 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:51:19.101 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:51:19.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:51:19.102 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:51:19.102 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:51:19.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:51:19.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:51:19.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:51:19.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:51:19.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:51:19.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:51:19.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:51:19.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:51:19.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:51:19.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:51:19.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:51:19.454 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:51:19.539 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:50:55
2026-06-04T04:51:19.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87971, datetime.datetime(2026, 6, 4, 4, 50, 55), datetime.datetime(2026, 6, 4, 4, 50, 54), 'salt', 1.43, 100.61, None, 42.45, 134.97, -0.09, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:51:19.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:51:19.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:51:19.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:50:54, diff=25.546702s, valid=True
2026-06-04T04:51:19.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:51:19.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:51:19.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:51:12, diff=7.550084s, valid=True
2026-06-04T04:51:19.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:51:19.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:51:19.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:50:50, diff=29.558039s, valid=True
2026-06-04T04:51:19.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:51:19.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:51:19.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:51:19.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:51:19.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:51:19.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:51:19.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:51:12, diff=7.561648s, valid=True
2026-06-04T04:51:19.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:51:19.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:51:19.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:51:19.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115676.562429s, valid=True
2026-06-04T04:51:19.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:51:19.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:51:19.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:51:19.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:51:19.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:51:19.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:51:19.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:51:19.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:51:19.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:51:19.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:51:19.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:51:19.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:51:19.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:51:19.972 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:51:20.208 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:51:20.559 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:51:20.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:51:20.664 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:51:20.664 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:51:20.750 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:51:20.750 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:51:50.780 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:51:50.780 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:51:50.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:51:50.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:51:50.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:51:51.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:51:51.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:51:51.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:51:51.199 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:51:51.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:51:51.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:51:51.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:51:51.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:51:53.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:51:53.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:51:53.816 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:51:53.816 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:51:53.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:51:53.837 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:51:53.838 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:51:53.838 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:51:53.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:51:53.839 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:51:53.839 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:51:53.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:51:53.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:51:53.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:51:54.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:51:54.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:51:54.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:51:54.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:51:54.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:51:54.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:51:54.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:51:54.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:51:54.186 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:51:54.257 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:51:25
2026-06-04T04:51:54.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87972, datetime.datetime(2026, 6, 4, 4, 51, 25), datetime.datetime(2026, 6, 4, 4, 51, 25), 'salt', 1.4, 100.61, None, 31.65, 119.16, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:51:54.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:51:54.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:51:54.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:51:25, diff=29.265087s, valid=True
2026-06-04T04:51:54.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:51:54.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:51:54.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:51:12, diff=42.268601s, valid=True
2026-06-04T04:51:54.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:51:54.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:51:54.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:51:21, diff=33.281275s, valid=True
2026-06-04T04:51:54.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:51:54.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:51:54.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:51:54.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:51:54.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:51:54.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:51:54.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:51:12, diff=42.285075s, valid=True
2026-06-04T04:51:54.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:51:54.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:51:54.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:51:54.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115711.285919s, valid=True
2026-06-04T04:51:54.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:51:54.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:51:54.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:51:54.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:51:54.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:51:54.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:51:54.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:51:54.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:51:54.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:51:54.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:51:54.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:51:54.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:51:54.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:51:54.611 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:51:54.827 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:51:55.176 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:51:55.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:51:55.279 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:51:55.279 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:51:55.367 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:51:55.367 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:52:25.374 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:52:25.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:52:25.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:52:25.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:52:25.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:52:25.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:52:25.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:52:25.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:52:25.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:52:25.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:52:25.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:52:25.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:52:25.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:52:28.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:52:28.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:52:28.448 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:52:28.448 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:52:28.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:52:28.472 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:52:28.473 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:52:28.474 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:52:28.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:52:28.474 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:52:28.474 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:52:28.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:52:28.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:52:28.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:52:28.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:52:28.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:52:28.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:52:28.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:52:28.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:52:28.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:52:28.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:52:28.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:52:28.817 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:52:28.888 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:52:26
2026-06-04T04:52:28.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87974, datetime.datetime(2026, 6, 4, 4, 52, 26), datetime.datetime(2026, 6, 4, 4, 52, 25), 'salt', 1.4, 100.64, None, 32.6, 122.02, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:52:28.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:52:28.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:52:28.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:52:25, diff=3.89611s, valid=True
2026-06-04T04:52:28.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:52:28.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:52:28.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:52:12, diff=16.899661s, valid=True
2026-06-04T04:52:28.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:52:28.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:52:28.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:52:21, diff=7.907595s, valid=True
2026-06-04T04:52:28.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:52:28.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:52:28.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:52:28.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:52:28.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:52:28.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:52:28.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:52:12, diff=16.911275s, valid=True
2026-06-04T04:52:28.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:52:28.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:52:28.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:52:28.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115745.912068s, valid=True
2026-06-04T04:52:28.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:52:28.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:52:28.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:52:28.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:52:28.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:52:28.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:52:28.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:52:28.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:52:28.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:52:29.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:52:29.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:52:29.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:52:29.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:52:29.233 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:52:29.448 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:52:29.795 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:52:29.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:52:29.906 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:52:29.906 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:52:30.085 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:52:30.085 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:53:00.115 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:53:00.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:53:00.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:53:00.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:53:00.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:53:00.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:53:00.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:53:00.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:53:00.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:53:00.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:53:00.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:53:00.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:53:00.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:53:03.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:53:03.040 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:53:03.041 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:53:03.041 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:53:03.053 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:53:03.066 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:53:03.066 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:53:03.067 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:53:03.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:53:03.067 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:53:03.068 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:53:03.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:53:03.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:53:03.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:53:03.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:53:03.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:53:03.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:53:03.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:53:03.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:53:03.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:53:03.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:53:03.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:53:03.399 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:53:03.472 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:52:56
2026-06-04T04:53:03.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87975, datetime.datetime(2026, 6, 4, 4, 52, 56), datetime.datetime(2026, 6, 4, 4, 52, 56), 'salt', 1.47, 100.61, None, 31.83, 138.35, -0.08, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:53:03.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:53:03.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:53:03.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:52:56, diff=7.480292s, valid=True
2026-06-04T04:53:03.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:53:03.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:53:03.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:53:12, diff=-8.516248s, valid=True
2026-06-04T04:53:03.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:53:03.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:53:03.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:52:51, diff=12.491898s, valid=True
2026-06-04T04:53:03.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:53:03.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:53:03.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:53:03.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:53:03.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:53:03.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:53:03.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:53:12, diff=-8.504371s, valid=True
2026-06-04T04:53:03.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:53:03.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:53:03.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:53:03.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115780.496429s, valid=True
2026-06-04T04:53:03.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:53:03.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:53:03.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:53:03.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:53:03.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:53:03.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:53:03.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:53:03.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:53:03.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:53:03.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:53:03.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:53:03.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:53:03.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:53:03.820 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:53:04.032 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:53:04.437 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:53:04.538 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:53:04.538 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:53:04.538 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:53:04.721 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:53:04.721 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:53:34.752 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:53:34.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:53:34.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:53:35.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:53:35.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:53:35.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:53:35.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:53:35.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:53:35.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:53:35.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:53:35.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:53:35.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:53:35.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:53:37.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:53:37.987 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:53:37.987 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:53:37.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:53:37.996 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:53:38.008 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:53:38.008 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:53:38.008 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:53:38.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:53:38.009 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:53:38.009 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:53:38.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:53:38.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:53:38.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:53:38.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:53:38.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:53:38.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:53:38.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:53:38.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:53:38.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:53:38.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:53:38.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:53:38.272 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:53:38.348 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:53:27
2026-06-04T04:53:38.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87976, datetime.datetime(2026, 6, 4, 4, 53, 27), datetime.datetime(2026, 6, 4, 4, 53, 26), 'salt', 1.5, 100.68, None, 41.18, 142.93, -0.1, 820.68, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:53:38.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:53:38.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:53:38.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:53:26, diff=12.354194s, valid=True
2026-06-04T04:53:38.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:53:38.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:53:38.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:53:12, diff=26.357033s, valid=True
2026-06-04T04:53:38.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:53:38.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:53:38.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:53:21, diff=17.363609s, valid=True
2026-06-04T04:53:38.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:53:38.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:53:38.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:53:38.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:53:38.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:53:38.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:53:38.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:53:12, diff=26.366598s, valid=True
2026-06-04T04:53:38.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:53:38.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:53:38.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:53:38.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115815.367268s, valid=True
2026-06-04T04:53:38.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:53:38.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:53:38.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:53:38.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:53:38.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:53:38.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:53:38.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:53:38.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:53:38.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:53:38.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:53:38.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:53:38.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:53:38.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:53:38.703 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:53:38.916 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:53:39.263 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:53:39.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:53:39.364 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:53:39.364 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:53:39.567 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:53:39.567 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:54:09.597 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:54:09.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:54:09.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:54:09.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:54:09.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:54:10.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:54:10.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:54:10.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:54:10.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:54:10.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:54:10.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:54:10.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:54:10.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:54:12.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:54:12.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:54:12.713 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:54:12.713 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:54:12.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:54:12.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:54:12.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:54:12.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:54:12.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:54:12.736 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:54:12.737 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:54:12.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:54:12.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:54:12.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:54:12.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:54:12.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:54:13.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:54:13.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:54:13.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:54:13.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:54:13.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:54:13.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:54:13.065 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:54:13.137 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:53:57
2026-06-04T04:54:13.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87977, datetime.datetime(2026, 6, 4, 4, 53, 57), datetime.datetime(2026, 6, 4, 4, 53, 56), 'salt', 1.4, 100.58, None, 39.59, 137.69, -0.08, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:54:13.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:54:13.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:54:13.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:53:56, diff=17.144434s, valid=True
2026-06-04T04:54:13.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:54:13.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:54:13.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:54:12, diff=1.147979s, valid=True
2026-06-04T04:54:13.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:54:13.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:54:13.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:53:52, diff=21.156373s, valid=True
2026-06-04T04:54:13.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:54:13.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:54:13.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:54:13.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:54:13.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:54:13.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:54:13.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:54:12, diff=1.160145s, valid=True
2026-06-04T04:54:13.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:54:13.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:54:13.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:54:13.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115850.160968s, valid=True
2026-06-04T04:54:13.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:54:13.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:54:13.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:54:13.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:54:13.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:54:13.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:54:13.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:54:13.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:54:13.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:54:13.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:54:13.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:54:13.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:54:13.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:54:13.555 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:54:13.767 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:54:14.112 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:54:14.213 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:54:14.213 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:54:14.213 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:54:14.460 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:54:14.461 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:54:44.482 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:54:44.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:54:44.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:54:44.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:54:44.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:54:44.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:54:44.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:54:44.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:54:44.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:54:44.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:54:44.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:54:44.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:54:44.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:54:47.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:54:47.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:54:47.384 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:54:47.385 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:54:47.395 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:54:47.408 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:54:47.409 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:54:47.409 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:54:47.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:54:47.410 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:54:47.411 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:54:47.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:54:47.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:54:47.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:54:47.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:54:47.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:54:47.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:54:47.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:54:47.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:54:47.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:54:47.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:54:47.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:54:47.752 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:54:47.822 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:54:27
2026-06-04T04:54:47.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87978, datetime.datetime(2026, 6, 4, 4, 54, 27), datetime.datetime(2026, 6, 4, 4, 54, 26), 'salt', 1.43, 100.68, None, 41.67, 137.64, -0.1, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:54:47.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:54:47.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:54:47.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:54:26, diff=21.830433s, valid=True
2026-06-04T04:54:47.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:54:47.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:54:47.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:54:12, diff=35.83393s, valid=True
2026-06-04T04:54:47.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:54:47.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:54:47.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:54:22, diff=25.842202s, valid=True
2026-06-04T04:54:47.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:54:47.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:54:47.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:54:47.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:54:47.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:54:47.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:54:47.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:54:12, diff=35.845957s, valid=True
2026-06-04T04:54:47.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:54:47.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:54:47.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:54:47.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115884.846771s, valid=True
2026-06-04T04:54:47.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:54:47.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:54:47.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:54:47.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:54:47.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:54:47.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:54:47.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:54:47.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:54:47.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:54:47.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:54:48.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:54:48.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:54:48.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:54:48.171 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:54:48.400 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:54:48.745 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:54:48.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:54:48.848 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:54:48.848 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:54:48.936 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:54:48.936 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:55:18.966 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:55:18.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:55:18.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:55:19.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:55:19.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:55:19.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:55:19.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:55:19.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:55:19.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:55:19.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:55:19.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:55:19.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:55:19.573 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:55:21.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:55:21.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:55:21.990 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:55:21.990 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:55:22.002 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:55:22.014 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:55:22.015 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:55:22.015 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:55:22.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:55:22.016 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:55:22.016 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:55:22.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:55:22.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:55:22.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:55:22.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:55:22.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:55:22.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:55:22.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:55:22.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:55:22.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:55:22.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:55:22.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:55:22.350 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:55:22.420 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:54:57
2026-06-04T04:55:22.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87979, datetime.datetime(2026, 6, 4, 4, 54, 57), datetime.datetime(2026, 6, 4, 4, 54, 57), 'salt', 1.33, 100.61, None, 40.36, 137.67, -0.09, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:55:22.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:55:22.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:55:22.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:54:57, diff=25.427876s, valid=True
2026-06-04T04:55:22.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:55:22.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:55:22.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:55:12, diff=10.431344s, valid=True
2026-06-04T04:55:22.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:55:22.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:55:22.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:54:52, diff=30.439517s, valid=True
2026-06-04T04:55:22.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:55:22.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:55:22.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:55:22.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:55:22.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:55:22.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:55:22.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:55:12, diff=10.443349s, valid=True
2026-06-04T04:55:22.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:55:22.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:55:22.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:55:22.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115919.444201s, valid=True
2026-06-04T04:55:22.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:55:22.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:55:22.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:55:22.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:55:22.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:55:22.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:55:22.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:55:22.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:55:22.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:55:22.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:55:22.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:55:22.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:55:22.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:55:22.834 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:55:23.049 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:55:23.397 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:55:23.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:55:23.502 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:55:23.502 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:55:23.779 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:55:23.780 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:55:53.781 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:55:53.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:55:53.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:55:54.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:55:54.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:55:54.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:55:54.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:55:54.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:55:54.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:55:54.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:55:54.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:55:54.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:55:54.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:55:56.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:55:56.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:55:56.827 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:55:56.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:55:56.838 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:55:56.851 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:55:56.851 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:55:56.852 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:55:56.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:55:56.853 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:55:56.853 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:55:56.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:55:56.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:55:56.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:55:57.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:55:57.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:55:57.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:55:57.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:55:57.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:55:57.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:55:57.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:55:57.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:55:57.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:55:57.260 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:55:28
2026-06-04T04:55:57.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87980, datetime.datetime(2026, 6, 4, 4, 55, 28), datetime.datetime(2026, 6, 4, 4, 55, 27), 'salt', 1.4, 100.58, None, 43.36, 136.87, -0.08, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:55:57.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:55:57.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:55:57.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:55:27, diff=30.267884s, valid=True
2026-06-04T04:55:57.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:55:57.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:55:57.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:55:12, diff=45.271442s, valid=True
2026-06-04T04:55:57.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:55:57.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:55:57.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:55:22, diff=35.279638s, valid=True
2026-06-04T04:55:57.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:55:57.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:55:57.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:55:57.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:55:57.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:55:57.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:55:57.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:55:12, diff=45.283469s, valid=True
2026-06-04T04:55:57.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:55:57.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:55:57.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:55:57.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115954.284306s, valid=True
2026-06-04T04:55:57.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:55:57.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:55:57.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:55:57.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:55:57.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:55:57.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:55:57.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:55:57.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:55:57.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:55:57.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:55:57.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:55:57.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:55:57.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:55:57.603 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:55:57.824 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:55:58.175 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:55:58.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:55:58.278 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:55:58.278 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:55:58.487 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:55:58.487 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:56:28.518 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:56:28.518 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:56:28.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:56:28.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:56:28.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:56:29.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:56:29.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:56:29.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:56:29.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:56:29.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:56:29.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:56:29.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:56:29.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:56:31.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:56:31.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:56:31.485 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:56:31.486 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:56:31.495 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:56:31.508 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:56:31.509 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:56:31.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:56:31.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:56:31.510 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:56:31.510 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:56:31.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:56:31.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:56:31.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:56:31.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:56:31.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:56:31.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:56:31.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:56:31.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:56:31.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:56:31.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:56:31.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:56:31.894 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:56:31.966 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:56:28
2026-06-04T04:56:31.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87982, datetime.datetime(2026, 6, 4, 4, 56, 28), datetime.datetime(2026, 6, 4, 4, 56, 27), 'salt', 1.43, 100.64, None, 39.06, 131.3, -0.09, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:56:31.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:56:31.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:56:31.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:56:27, diff=4.972453s, valid=True
2026-06-04T04:56:31.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:56:31.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:56:31.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:56:12, diff=19.975432s, valid=True
2026-06-04T04:56:31.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:56:31.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:56:31.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:56:23, diff=8.982335s, valid=True
2026-06-04T04:56:31.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:56:31.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:56:31.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:56:31.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:56:31.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:56:31.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:56:31.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:56:12, diff=19.985522s, valid=True
2026-06-04T04:56:31.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:56:31.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:56:31.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:56:31.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=115988.98622s, valid=True
2026-06-04T04:56:31.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:56:31.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:56:31.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:56:31.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:56:31.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:56:32.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:56:32.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:56:32.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:56:32.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:56:32.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:56:32.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:56:32.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:56:32.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:56:32.301 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:56:32.515 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:56:32.862 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:56:32.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:56:32.964 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:56:32.964 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:56:33.170 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:56:33.170 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:57:03.198 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:57:03.198 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:57:03.199 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:57:03.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:57:03.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:57:03.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:57:03.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:57:03.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:57:03.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:57:03.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:57:03.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:57:03.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:57:03.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:57:06.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:57:06.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:57:06.360 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:57:06.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:57:06.371 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:57:06.382 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:57:06.383 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:57:06.383 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:57:06.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:57:06.384 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:57:06.384 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:57:06.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:57:06.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:57:06.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:57:06.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:57:06.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:57:06.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:57:06.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:57:06.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:57:06.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:57:06.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:57:06.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:57:06.711 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:57:06.784 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:56:58
2026-06-04T04:57:06.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87983, datetime.datetime(2026, 6, 4, 4, 56, 58), datetime.datetime(2026, 6, 4, 4, 56, 58), 'salt', 1.43, 100.68, None, 40.65, 131.75, -0.1, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:57:06.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:57:06.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:57:06.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:56:58, diff=8.791881s, valid=True
2026-06-04T04:57:06.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:57:06.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:57:06.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:57:12, diff=-5.204641s, valid=True
2026-06-04T04:57:06.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:57:06.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:57:06.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:56:53, diff=13.803469s, valid=True
2026-06-04T04:57:06.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:57:06.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:57:06.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:57:06.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:57:06.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:57:06.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:57:06.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:57:12, diff=-5.192729s, valid=True
2026-06-04T04:57:06.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:57:06.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:57:06.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:57:06.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116023.808096s, valid=True
2026-06-04T04:57:06.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:57:06.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:57:06.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:57:06.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:57:06.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:57:06.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:57:06.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:57:06.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:57:06.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:57:06.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:57:07.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:57:07.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:57:07.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:57:07.138 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:57:07.353 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:57:07.754 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:57:07.857 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:57:07.857 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:57:07.857 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:57:07.948 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:57:07.948 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:57:37.978 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:57:37.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:57:37.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:57:38.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:57:38.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:57:38.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:57:38.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:57:38.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:57:38.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:57:38.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:57:38.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:57:38.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:57:38.698 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:57:41.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:57:41.107 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:57:41.108 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:57:41.109 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:57:41.119 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:57:41.131 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:57:41.132 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:57:41.132 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:57:41.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:57:41.133 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:57:41.133 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:57:41.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:57:41.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:57:41.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:57:41.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:57:41.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:57:41.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:57:41.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:57:41.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:57:41.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:57:41.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:57:41.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:57:41.465 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:57:41.536 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:57:29
2026-06-04T04:57:41.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87984, datetime.datetime(2026, 6, 4, 4, 57, 29), datetime.datetime(2026, 6, 4, 4, 57, 28), 'salt', 1.43, 100.61, None, 44.07, 136.0, -0.09, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:57:41.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:57:41.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:57:41.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:57:28, diff=13.543955s, valid=True
2026-06-04T04:57:41.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:57:41.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:57:41.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:57:12, diff=29.54741s, valid=True
2026-06-04T04:57:41.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:57:41.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:57:41.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:57:23, diff=18.555674s, valid=True
2026-06-04T04:57:41.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:57:41.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:57:41.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:57:41.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:57:41.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:57:41.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:57:41.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:57:12, diff=29.559388s, valid=True
2026-06-04T04:57:41.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:57:41.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:57:41.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:57:41.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116058.560205s, valid=True
2026-06-04T04:57:41.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:57:41.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:57:41.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:57:41.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:57:41.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:57:41.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:57:41.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:57:41.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:57:41.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:57:41.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:57:41.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:57:41.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:57:41.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:57:41.882 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:57:42.097 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:57:42.445 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:57:42.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:57:42.549 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:57:42.549 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:57:42.782 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:57:42.782 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:58:12.812 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:58:12.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:58:12.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:58:13.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:58:13.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:58:13.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:58:13.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:58:13.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:58:13.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:58:13.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:58:13.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:58:13.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:58:13.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:58:15.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:58:15.838 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:58:15.839 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:58:15.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:58:15.849 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:58:15.861 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:58:15.862 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:58:15.863 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:58:15.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:58:15.863 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:58:15.863 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:58:15.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:58:16.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:58:16.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:58:16.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:58:16.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:58:16.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:58:16.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:58:16.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:58:16.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:58:16.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:58:16.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:58:16.210 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:58:16.281 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:57:59
2026-06-04T04:58:16.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87985, datetime.datetime(2026, 6, 4, 4, 57, 59), datetime.datetime(2026, 6, 4, 4, 57, 58), 'salt', 1.37, 100.68, None, 42.73, 137.48, -0.09, 820.68, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:58:16.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:58:16.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:58:16.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:57:58, diff=18.294018s, valid=True
2026-06-04T04:58:16.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:58:16.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:58:16.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:58:12, diff=4.297656s, valid=True
2026-06-04T04:58:16.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:58:16.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:58:16.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:57:54, diff=22.306211s, valid=True
2026-06-04T04:58:16.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:58:16.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:58:16.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:58:16.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:58:16.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:58:16.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:58:16.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:58:12, diff=4.310096s, valid=True
2026-06-04T04:58:16.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:58:16.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:58:16.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:58:16.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116093.310937s, valid=True
2026-06-04T04:58:16.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:58:16.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:58:16.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:58:16.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:58:16.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:58:16.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:58:16.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:58:16.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:58:16.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:58:16.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:58:16.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:58:16.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:58:16.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:58:16.706 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:58:16.922 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:58:17.270 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:58:17.375 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:58:17.375 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:58:17.375 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:58:17.657 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:58:17.657 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:58:47.687 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:58:47.687 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:58:47.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:58:48.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:58:48.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:58:48.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:58:48.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:58:48.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:58:48.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:58:48.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:58:48.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:58:48.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:58:48.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:58:50.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:58:50.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:58:50.879 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:58:50.879 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:58:50.887 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:58:50.900 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:58:50.900 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:58:50.901 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:58:50.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:58:50.902 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:58:50.902 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:58:50.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:58:51.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:58:51.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:58:51.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:58:51.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:58:51.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:58:51.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:58:51.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:58:51.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:58:51.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:58:51.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:58:51.227 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:58:51.298 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:58:29
2026-06-04T04:58:51.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87986, datetime.datetime(2026, 6, 4, 4, 58, 29), datetime.datetime(2026, 6, 4, 4, 58, 29), 'salt', 1.4, 100.61, None, 39.13, 137.85, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:58:51.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:58:51.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:58:51.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:58:29, diff=22.305473s, valid=True
2026-06-04T04:58:51.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:58:51.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:58:51.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:58:12, diff=39.308971s, valid=True
2026-06-04T04:58:51.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:58:51.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:58:51.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:58:24, diff=27.317315s, valid=True
2026-06-04T04:58:51.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:58:51.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:58:51.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:58:51.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:58:51.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:58:51.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:58:51.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:58:12, diff=39.321056s, valid=True
2026-06-04T04:58:51.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:58:51.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:58:51.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:58:51.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116128.321873s, valid=True
2026-06-04T04:58:51.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:58:51.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:58:51.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:58:51.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:58:51.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:58:51.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:58:51.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:58:51.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:58:51.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:58:51.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:58:51.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:58:51.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:58:51.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:58:51.643 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:58:51.858 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:58:52.203 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:58:52.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:58:52.305 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:58:52.305 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:58:52.505 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:58:52.506 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:59:22.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:59:22.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:59:22.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:59:22.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:59:22.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:59:23.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:59:23.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:59:23.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:59:23.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:59:23.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:59:23.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:59:23.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:59:23.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T04:59:25.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T04:59:25.535 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T04:59:25.536 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T04:59:25.536 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T04:59:25.547 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T04:59:25.560 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T04:59:25.561 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T04:59:25.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T04:59:25.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T04:59:25.563 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T04:59:25.563 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T04:59:25.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T04:59:25.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T04:59:25.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T04:59:25.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T04:59:25.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:59:25.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:59:25.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T04:59:25.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T04:59:25.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T04:59:25.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T04:59:25.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T04:59:25.897 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T04:59:25.968 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:59:00
2026-06-04T04:59:25.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87987, datetime.datetime(2026, 6, 4, 4, 59), datetime.datetime(2026, 6, 4, 4, 58, 59), 'salt', 1.37, 100.61, None, 36.13, 146.85, -0.08, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T04:59:25.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T04:59:25.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T04:59:25.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:58:59, diff=26.975971s, valid=True
2026-06-04T04:59:25.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T04:59:25.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:59:25.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:59:12, diff=13.979457s, valid=True
2026-06-04T04:59:25.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T04:59:25.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T04:59:25.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:58:54, diff=31.987756s, valid=True
2026-06-04T04:59:25.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T04:59:25.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:59:25.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T04:59:25.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T04:59:25.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T04:59:25.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T04:59:25.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:59:12, diff=13.991465s, valid=True
2026-06-04T04:59:25.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T04:59:25.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T04:59:25.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T04:59:25.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116162.992279s, valid=True
2026-06-04T04:59:25.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T04:59:25.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T04:59:25.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T04:59:25.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T04:59:25.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T04:59:26.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T04:59:26.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T04:59:26.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T04:59:26.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T04:59:26.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T04:59:26.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T04:59:26.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T04:59:26.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T04:59:26.386 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T04:59:26.602 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:59:26.952 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T04:59:27.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T04:59:27.054 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T04:59:27.054 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T04:59:27.258 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T04:59:27.258 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T04:59:57.289 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T04:59:57.289 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T04:59:57.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T04:59:57.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T04:59:57.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T04:59:57.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T04:59:57.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T04:59:57.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T04:59:57.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T04:59:57.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T04:59:57.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T04:59:57.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T04:59:57.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:00:00.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:00:00.203 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:00:00.204 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:00:00.204 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:00:00.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:00:00.226 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:00:00.226 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:00:00.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:00:00.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:00:00.227 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:00:00.227 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:00:00.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:00:00.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:00:00.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:00:00.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:00:00.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:00:00.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T05:00:00.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:00:00.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T05:00:00.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:00:00.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:00:00.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:00:00.547 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:00:00.618 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 04:59:31
2026-06-04T05:00:00.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87988, datetime.datetime(2026, 6, 4, 4, 59, 31), datetime.datetime(2026, 6, 4, 4, 59, 29), 'salt', 1.37, 100.58, None, 37.65, 132.69, -0.08, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:00:00.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:00:00.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:00:00.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:59:29, diff=31.625408s, valid=True
2026-06-04T05:00:00.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:00:00.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T05:00:00.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:59:12, diff=48.628905s, valid=True
2026-06-04T05:00:00.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:00:00.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:00:00.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:59:24, diff=36.637031s, valid=True
2026-06-04T05:00:00.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:00:00.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:00:00.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:00:00.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:00:00.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:00:00.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T05:00:00.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:59:12, diff=48.640689s, valid=True
2026-06-04T05:00:00.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:00:00.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:00:00.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:00:00.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116197.641472s, valid=True
2026-06-04T05:00:00.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:00:00.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:00:00.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:00:00.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:00:00.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:00:00.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:00:00.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:00:00.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:00:00.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:00:00.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:00:00.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:00:00.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:00:00.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:00:00.960 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:00:01.172 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:00:01.518 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:00:01.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:00:01.667 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:00:01.667 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:00:01.771 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:00:01.771 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:00:31.801 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:00:31.801 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:00:31.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:00:32.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:00:32.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:00:32.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:00:32.573 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:00:32.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:00:32.587 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:00:32.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:00:32.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:00:32.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:00:32.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:00:35.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:00:35.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:00:35.012 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:00:35.013 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:00:35.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:00:35.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:00:35.033 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:00:35.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:00:35.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:00:35.034 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:00:35.034 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:00:35.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:00:35.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:00:35.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:00:35.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:00:35.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:00:35.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:00:35.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:00:35.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:00:35.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:00:35.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:00:35.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:00:35.378 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:00:35.449 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:00:32
2026-06-04T05:00:35.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87990, datetime.datetime(2026, 6, 4, 5, 0, 32), datetime.datetime(2026, 6, 4, 5, 0, 31), 'salt', 1.4, 100.68, None, 32.74, 134.0, -0.1, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:00:35.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:00:35.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:00:35.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:00:31, diff=4.457178s, valid=True
2026-06-04T05:00:35.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:00:35.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:00:35.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:59:12, diff=83.460657s, valid=True
2026-06-04T05:00:35.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:00:35.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:00:35.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:00:25, diff=10.468897s, valid=True
2026-06-04T05:00:35.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:00:35.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:00:35.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:00:35.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:00:35.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:00:35.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:00:35.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:59:12, diff=83.472647s, valid=True
2026-06-04T05:00:35.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:00:35.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:00:35.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:00:35.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116232.473446s, valid=True
2026-06-04T05:00:35.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:00:35.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:00:35.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:00:35.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:00:35.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:00:35.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:00:35.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:00:35.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:00:35.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:00:35.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:00:35.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:00:35.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:00:35.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:00:35.858 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:00:36.072 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:00:36.417 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:00:36.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:00:36.519 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:00:36.519 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:00:36.786 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:00:36.786 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:01:06.816 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:01:06.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:01:06.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:01:07.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:01:07.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:01:07.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:01:07.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:01:07.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:01:07.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:01:07.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:01:07.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:01:07.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:01:07.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:01:09.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:01:10.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:01:10.004 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:01:10.004 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:01:10.014 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:01:10.025 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:01:10.026 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:01:10.026 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:01:10.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:01:10.026 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:01:10.026 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:01:10.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:01:10.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:01:10.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:01:10.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:01:10.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:01:10.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T05:01:10.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:01:10.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T05:01:10.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:01:10.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:01:10.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:01:10.316 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:01:10.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:01:02
2026-06-04T05:01:10.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87991, datetime.datetime(2026, 6, 4, 5, 1, 2), datetime.datetime(2026, 6, 4, 5, 1, 1), 'salt', 1.43, 100.64, None, 33.06, 139.29, -0.09, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:01:10.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:01:10.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:01:10.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:01:01, diff=9.393874s, valid=True
2026-06-04T05:01:10.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:01:10.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T05:01:10.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:59:12, diff=118.397362s, valid=True
2026-06-04T05:01:10.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:01:10.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:01:10.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:00:55, diff=15.405322s, valid=True
2026-06-04T05:01:10.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:01:10.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:01:10.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:01:10.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:01:10.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:01:10.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T05:01:10.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:59:12, diff=118.409049s, valid=True
2026-06-04T05:01:10.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:01:10.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:01:10.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:01:10.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116267.409868s, valid=True
2026-06-04T05:01:10.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:01:10.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:01:10.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:01:10.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:01:10.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:01:10.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:01:10.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:01:10.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:01:10.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:01:10.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:01:10.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:01:10.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:01:10.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:01:10.728 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:01:10.941 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:01:11.292 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:01:11.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:01:11.394 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:01:11.394 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:01:11.588 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:01:11.588 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:01:41.618 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:01:41.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:01:41.619 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:01:42.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:01:42.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:01:42.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:01:42.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:01:42.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:01:42.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:01:42.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:01:42.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:01:42.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:01:42.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:01:44.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:01:44.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:01:44.820 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:01:44.821 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:01:44.831 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:01:44.843 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:01:44.844 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:01:44.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:01:44.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:01:44.845 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:01:44.845 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:01:44.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:01:44.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:01:44.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:01:45.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:01:45.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:01:45.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T05:01:45.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:01:45.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T05:01:45.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:01:45.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:01:45.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:01:45.198 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:01:45.278 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:01:32
2026-06-04T05:01:45.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87992, datetime.datetime(2026, 6, 4, 5, 1, 32), datetime.datetime(2026, 6, 4, 5, 1, 31), 'salt', 1.43, 100.61, None, 32.67, 135.46, -0.09, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:01:45.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:01:45.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:01:45.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:01:31, diff=14.285718s, valid=True
2026-06-04T05:01:45.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:01:45.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T05:01:45.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:59:12, diff=153.289334s, valid=True
2026-06-04T05:01:45.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:01:45.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:01:45.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:01:25, diff=20.297671s, valid=True
2026-06-04T05:01:45.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:01:45.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:01:45.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:01:45.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:01:45.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:01:45.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T05:01:45.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:59:12, diff=153.301532s, valid=True
2026-06-04T05:01:45.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:01:45.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:01:45.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:01:45.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116302.302376s, valid=True
2026-06-04T05:01:45.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:01:45.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:01:45.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:01:45.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:01:45.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:01:45.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:01:45.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:01:45.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:01:45.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:01:45.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:01:45.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:01:45.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:01:45.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:01:45.622 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:01:45.835 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:01:46.181 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:01:46.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:01:46.283 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:01:46.283 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:01:46.477 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:01:46.477 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:02:16.478 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:02:16.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:02:16.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:02:16.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:02:16.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:02:16.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:02:16.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:02:16.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:02:16.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:02:16.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:02:16.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:02:16.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:02:16.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:02:19.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:02:19.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:02:19.251 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:02:19.251 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:02:19.263 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:02:19.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:02:19.277 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:02:19.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:02:19.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:02:19.278 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:02:19.278 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:02:19.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:02:19.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:02:19.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:02:19.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:02:19.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:02:19.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T05:02:19.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:02:19.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T05:02:19.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:02:19.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:02:19.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:02:19.612 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:02:19.683 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:02:02
2026-06-04T05:02:19.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87993, datetime.datetime(2026, 6, 4, 5, 2, 2), datetime.datetime(2026, 6, 4, 5, 2, 2), 'salt', 1.4, 100.64, None, 36.8, 138.7, -0.09, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:02:19.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:02:19.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:02:19.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:02:02, diff=17.690999s, valid=True
2026-06-04T05:02:19.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:02:19.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T05:02:19.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:59:12, diff=187.694473s, valid=True
2026-06-04T05:02:19.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:02:19.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:02:19.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:01:56, diff=23.702524s, valid=True
2026-06-04T05:02:19.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:02:19.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:02:19.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:02:19.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:02:19.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:02:19.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T05:02:19.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:59:12, diff=187.706259s, valid=True
2026-06-04T05:02:19.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:02:19.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:02:19.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:02:19.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116336.70707s, valid=True
2026-06-04T05:02:19.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:02:19.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:02:19.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:02:19.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:02:19.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:02:19.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:02:19.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:02:19.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:02:19.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:02:19.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:02:19.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:02:19.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:02:20.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:02:20.078 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:02:20.376 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:02:20.722 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:02:20.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:02:20.826 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:02:20.826 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:02:21.029 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:02:21.029 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:02:51.051 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:02:51.052 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:02:51.052 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:02:51.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:02:51.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:02:51.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:02:51.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:02:51.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:02:51.674 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:02:51.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:02:51.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:02:51.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:02:51.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:02:54.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:02:54.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:02:54.145 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:02:54.145 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:02:54.155 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:02:54.168 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:02:54.169 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:02:54.169 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:02:54.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:02:54.170 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:02:54.170 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:02:54.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:02:54.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:02:54.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:02:54.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:02:54.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:02:54.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T05:02:54.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:02:54.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T05:02:54.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:02:54.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:02:54.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:02:54.496 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:02:54.569 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:02:33
2026-06-04T05:02:54.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87994, datetime.datetime(2026, 6, 4, 5, 2, 33), datetime.datetime(2026, 6, 4, 5, 2, 32), 'salt', 1.4, 100.61, None, 37.51, 141.57, -0.09, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:02:54.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:02:54.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:02:54.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:02:32, diff=22.576891s, valid=True
2026-06-04T05:02:54.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:02:54.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T05:02:54.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:59:12, diff=222.580347s, valid=True
2026-06-04T05:02:54.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:02:54.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:02:54.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:02:26, diff=28.58855s, valid=True
2026-06-04T05:02:54.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:02:54.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:02:54.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:02:54.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:02:54.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:02:54.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T05:02:54.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:59:12, diff=222.592276s, valid=True
2026-06-04T05:02:54.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:02:54.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:02:54.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:02:54.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116371.5931s, valid=True
2026-06-04T05:02:54.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:02:54.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:02:54.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:02:54.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:02:54.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:02:54.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:02:54.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:02:54.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:02:54.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:02:54.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:02:54.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:02:54.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:02:54.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:02:54.917 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:02:55.136 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:02:55.485 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:02:55.587 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:02:55.587 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:02:55.588 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:02:55.818 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:02:55.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:03:25.834 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:03:25.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:03:25.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:03:26.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:03:26.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:03:26.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:03:26.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:03:26.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:03:26.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:03:26.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:03:26.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:03:26.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:03:26.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:03:28.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:03:28.843 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:03:28.844 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:03:28.844 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:03:28.855 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:03:28.868 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:03:28.869 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:03:28.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:03:28.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:03:28.870 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:03:28.870 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:03:28.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:03:29.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:03:29.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:03:29.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:03:29.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:03:29.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:03:29.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:03:29.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:03:29.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:03:29.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:03:29.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:03:29.204 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:03:29.274 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:03:03
2026-06-04T05:03:29.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87995, datetime.datetime(2026, 6, 4, 5, 3, 3), datetime.datetime(2026, 6, 4, 5, 3, 2), 'salt', 1.4, 100.64, None, 39.76, 136.26, -0.09, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:03:29.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:03:29.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:03:29.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:03:02, diff=27.282278s, valid=True
2026-06-04T05:03:29.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:03:29.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:03:29.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:59:12, diff=257.285755s, valid=True
2026-06-04T05:03:29.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:03:29.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:03:29.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:02:56, diff=33.293862s, valid=True
2026-06-04T05:03:29.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:03:29.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:03:29.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:03:29.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:03:29.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:03:29.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:03:29.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:59:12, diff=257.297572s, valid=True
2026-06-04T05:03:29.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:03:29.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:03:29.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:03:29.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116406.298381s, valid=True
2026-06-04T05:03:29.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:03:29.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:03:29.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:03:29.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:03:29.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:03:29.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:03:29.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:03:29.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:03:29.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:03:29.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:03:29.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:03:29.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:03:29.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:03:29.691 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:03:29.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:03:30.266 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:03:30.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:03:30.368 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:03:30.368 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:03:30.633 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:03:30.633 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:04:00.663 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:04:00.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:04:00.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:04:00.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:04:00.993 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:04:01.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:04:01.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:04:01.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:04:01.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:04:01.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:04:01.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:04:01.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:04:01.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:04:03.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:04:03.600 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:04:03.601 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:04:03.602 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:04:03.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:04:03.625 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:04:03.626 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:04:03.626 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:04:03.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:04:03.627 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:04:03.627 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:04:03.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:04:03.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-06-04T05:04:03.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:04:03.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-06-04T05:04:03.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:04:03.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:04:03.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:04:03.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:04:03.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:04:03.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:04:03.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:04:03.957 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:04:04.027 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:04:03
2026-06-04T05:04:04.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87997, datetime.datetime(2026, 6, 4, 5, 4, 3), datetime.datetime(2026, 6, 4, 5, 4, 3), 'salt', 1.4, 100.58, None, 38.11, 136.23, -0.08, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:04:04.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:04:04.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-06-04T05:04:04.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:04:03, diff=1.035296s, valid=True
2026-06-04T05:04:04.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:04:04.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:04:04.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:59:12, diff=292.038799s, valid=True
2026-06-04T05:04:04.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:04:04.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-06-04T05:04:04.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:03:57, diff=7.047079s, valid=True
2026-06-04T05:04:04.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:04:04.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:04:04.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:04:04.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:04:04.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:04:04.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:04:04.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 04:59:12, diff=292.050817s, valid=True
2026-06-04T05:04:04.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:04:04.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:04:04.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:04:04.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116441.051605s, valid=True
2026-06-04T05:04:04.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:04:04.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:04:04.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:04:04.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:04:04.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:04:04.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:04:04.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:04:04.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:04:04.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:04:04.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:04:04.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:04:04.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:04:04.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:04:04.372 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:04:04.586 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:04:04.930 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:04:05.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:04:05.034 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:04:05.035 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:04:05.228 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:04:05.274 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:04:35.294 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:04:35.295 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:04:35.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:04:35.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:04:35.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:04:35.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:04:35.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:04:35.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:04:35.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:04:35.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:04:35.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:04:35.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:04:35.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:04:38.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:04:38.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:04:38.326 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:04:38.326 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:04:38.335 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:04:38.347 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:04:38.347 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:04:38.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:04:38.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:04:38.347 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:04:38.347 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:04:38.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:04:38.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:04:38.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:04:38.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:04:38.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:04:38.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:04:38.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:04:38.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:04:38.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:04:38.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:04:38.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:04:38.637 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:04:38.707 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:04:34
2026-06-04T05:04:38.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87998, datetime.datetime(2026, 6, 4, 5, 4, 34), datetime.datetime(2026, 6, 4, 5, 4, 33), 'salt', 1.33, 100.54, None, 27.42, 148.52, -0.08, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:04:38.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:04:38.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:04:38.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:04:33, diff=5.714386s, valid=True
2026-06-04T05:04:38.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:04:38.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:04:38.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:05:12, diff=-33.282185s, valid=True
2026-06-04T05:04:38.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:04:38.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:04:38.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:04:27, diff=11.72684s, valid=True
2026-06-04T05:04:38.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:04:38.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:04:38.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:04:38.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:04:38.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:04:38.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:04:38.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:05:12, diff=-33.268024s, valid=True
2026-06-04T05:04:38.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:04:38.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:04:38.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:04:38.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116475.73291s, valid=True
2026-06-04T05:04:38.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:04:38.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:04:38.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:04:38.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:04:38.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:04:38.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:04:38.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:04:38.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:04:38.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:04:38.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:04:39.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:04:39.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:04:39.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:04:39.135 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:04:39.351 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:04:39.699 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:04:39.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:04:39.803 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:04:39.803 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:04:39.989 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:04:39.990 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:05:10.019 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:05:10.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:05:10.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:05:10.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:05:10.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:05:10.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:05:10.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:05:10.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:05:10.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:05:10.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:05:10.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:05:10.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:05:10.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:05:13.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:05:13.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:05:13.073 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:05:13.074 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:05:13.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:05:13.097 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:05:13.098 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:05:13.098 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:05:13.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:05:13.099 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:05:13.099 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:05:13.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:05:13.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:05:13.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:05:13.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:05:13.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:05:13.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:05:13.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:05:13.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:05:13.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:05:13.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:05:13.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:05:13.430 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:05:13.502 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:05:04
2026-06-04T05:05:13.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(87999, datetime.datetime(2026, 6, 4, 5, 5, 4), datetime.datetime(2026, 6, 4, 5, 5, 3), 'salt', 1.47, 100.64, None, 30.31, 134.31, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:05:13.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:05:13.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:05:13.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:05:03, diff=10.50955s, valid=True
2026-06-04T05:05:13.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:05:13.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:05:13.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:05:12, diff=1.512942s, valid=True
2026-06-04T05:05:13.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:05:13.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:05:13.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:04:58, diff=15.520999s, valid=True
2026-06-04T05:05:13.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:05:13.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:05:13.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:05:13.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:05:13.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:05:13.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:05:13.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:05:12, diff=1.52463s, valid=True
2026-06-04T05:05:13.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:05:13.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:05:13.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:05:13.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116510.525414s, valid=True
2026-06-04T05:05:13.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:05:13.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:05:13.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:05:13.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:05:13.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:05:13.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:05:13.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:05:13.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:05:13.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:05:13.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:05:13.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:05:13.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:05:13.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:05:13.854 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:05:14.075 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:05:14.429 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:05:14.533 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:05:14.533 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:05:14.533 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:05:14.729 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:05:14.729 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:05:44.734 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:05:44.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:05:44.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:05:45.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:05:45.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:05:45.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:05:45.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:05:45.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:05:45.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:05:45.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:05:45.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:05:45.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:05:45.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:05:47.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:05:47.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:05:47.832 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:05:47.832 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:05:47.842 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:05:47.855 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:05:47.855 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:05:47.856 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:05:47.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:05:47.856 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:05:47.857 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:05:47.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:05:47.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:05:47.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:05:48.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:05:48.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:05:48.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:05:48.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:05:48.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:05:48.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:05:48.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:05:48.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:05:48.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:05:48.267 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:05:34
2026-06-04T05:05:48.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88000, datetime.datetime(2026, 6, 4, 5, 5, 34), datetime.datetime(2026, 6, 4, 5, 5, 33), 'salt', 1.5, 100.61, None, 34.75, 138.58, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:05:48.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:05:48.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:05:48.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:05:33, diff=15.275364s, valid=True
2026-06-04T05:05:48.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:05:48.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:05:48.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:06:12, diff=-23.721169s, valid=True
2026-06-04T05:05:48.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:05:48.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:05:48.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:05:28, diff=20.287235s, valid=True
2026-06-04T05:05:48.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:05:48.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:05:48.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:05:48.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:05:48.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:05:48.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:05:48.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:06:12, diff=-23.709026s, valid=True
2026-06-04T05:05:48.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:05:48.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:05:48.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:05:48.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116545.2918s, valid=True
2026-06-04T05:05:48.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:05:48.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:05:48.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:05:48.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:05:48.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:05:48.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:05:48.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:05:48.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:05:48.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:05:48.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:05:48.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:05:48.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:05:48.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:05:48.617 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:05:48.856 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:05:49.202 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:05:49.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:05:49.303 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:05:49.303 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:05:49.460 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:05:49.460 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:06:19.486 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:06:19.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:06:19.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:06:19.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:06:19.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:06:20.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:06:20.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:06:20.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:06:20.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:06:20.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:06:20.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:06:20.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:06:20.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:06:22.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:06:22.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:06:22.480 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:06:22.481 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:06:22.491 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:06:22.504 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:06:22.504 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:06:22.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:06:22.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:06:22.506 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:06:22.506 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:06:22.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:06:22.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:06:22.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:06:22.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:06:22.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:06:22.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:06:22.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:06:22.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:06:22.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:06:22.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:06:22.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:06:22.836 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:06:22.918 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:06:04
2026-06-04T05:06:22.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88001, datetime.datetime(2026, 6, 4, 5, 6, 4), datetime.datetime(2026, 6, 4, 5, 6, 3), 'salt', 1.5, 100.64, None, 36.02, 139.62, -0.09, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:06:22.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:06:22.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:06:22.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:06:03, diff=19.925876s, valid=True
2026-06-04T05:06:22.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:06:22.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:06:22.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:06:12, diff=10.929428s, valid=True
2026-06-04T05:06:22.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:06:22.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:06:22.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:05:58, diff=24.942405s, valid=True
2026-06-04T05:06:22.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:06:22.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:06:22.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:06:22.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:06:22.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:06:22.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:06:22.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:06:12, diff=10.946195s, valid=True
2026-06-04T05:06:22.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:06:22.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:06:22.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:06:22.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116579.947042s, valid=True
2026-06-04T05:06:22.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:06:22.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:06:22.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:06:22.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:06:22.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:06:23.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:06:23.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:06:23.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:06:23.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:06:23.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:06:23.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:06:23.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:06:23.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:06:23.270 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:06:23.557 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:06:23.903 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:06:24.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:06:24.007 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:06:24.008 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:06:26.762 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:06:26.762 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:06:56.792 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:06:56.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:06:56.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:06:57.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:06:57.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:06:57.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:06:57.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:06:57.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:06:57.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:06:57.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:06:57.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:06:57.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:06:57.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:06:59.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:06:59.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:06:59.815 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:06:59.815 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:06:59.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:06:59.837 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:06:59.838 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:06:59.838 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:06:59.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:06:59.838 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:06:59.838 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:06:59.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:06:59.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:06:59.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:07:00.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:07:00.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:07:00.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:07:00.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:07:00.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:07:00.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:07:00.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:07:00.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:07:00.114 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:07:00.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:06:34
2026-06-04T05:07:00.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88002, datetime.datetime(2026, 6, 4, 5, 6, 34), datetime.datetime(2026, 6, 4, 5, 6, 34), 'salt', 1.47, 100.68, None, 30.73, 148.47, -0.09, 820.68, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:07:00.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:07:00.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:07:00.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:06:34, diff=26.194423s, valid=True
2026-06-04T05:07:00.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:07:00.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:07:00.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:07:12, diff=-11.802423s, valid=True
2026-06-04T05:07:00.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:07:00.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:07:00.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:06:28, diff=32.204915s, valid=True
2026-06-04T05:07:00.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:07:00.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:07:00.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:07:00.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:07:00.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:07:00.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:07:00.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:07:12, diff=-11.791782s, valid=True
2026-06-04T05:07:00.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:07:00.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:07:00.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:07:00.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116617.208936s, valid=True
2026-06-04T05:07:00.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:07:00.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:07:00.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:07:00.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:07:00.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:07:00.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:07:00.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:07:00.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:07:00.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:07:00.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:07:00.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:07:00.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:07:00.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:07:00.527 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:07:00.740 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:07:01.084 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:07:01.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:07:01.186 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:07:01.186 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:07:01.550 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:07:01.551 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:07:31.581 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:07:31.581 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:07:31.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:07:31.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:07:31.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:07:31.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:07:31.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:07:31.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:07:31.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:07:31.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:07:31.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:07:31.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:07:31.993 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:07:34.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:07:34.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:07:34.671 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:07:34.671 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:07:34.681 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:07:34.694 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:07:34.695 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:07:34.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:07:34.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:07:34.696 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:07:34.696 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:07:34.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:07:34.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:07:34.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:07:34.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:07:34.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:07:34.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:07:34.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:07:35.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:07:35.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:07:35.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:07:35.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:07:35.035 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:07:35.106 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:07:05
2026-06-04T05:07:35.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88003, datetime.datetime(2026, 6, 4, 5, 7, 5), datetime.datetime(2026, 6, 4, 5, 7, 4), 'salt', 1.5, 100.64, None, 32.92, 131.65, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:07:35.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:07:35.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:07:35.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:07:04, diff=31.113944s, valid=True
2026-06-04T05:07:35.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:07:35.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:07:35.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:07:12, diff=23.117422s, valid=True
2026-06-04T05:07:35.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:07:35.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:07:35.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:06:59, diff=36.125593s, valid=True
2026-06-04T05:07:35.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:07:35.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:07:35.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:07:35.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:07:35.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:07:35.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:07:35.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:07:12, diff=23.129324s, valid=True
2026-06-04T05:07:35.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:07:35.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:07:35.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:07:35.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116652.13015s, valid=True
2026-06-04T05:07:35.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:07:35.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:07:35.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:07:35.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:07:35.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:07:35.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:07:35.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:07:35.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:07:35.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:07:35.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:07:35.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:07:35.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:07:35.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:07:35.529 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:07:35.749 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:07:36.110 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:07:36.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:07:36.212 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:07:36.213 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:07:36.416 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:07:36.416 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:08:06.446 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:08:06.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:08:06.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:08:06.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:08:06.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:08:06.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:08:06.860 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:08:06.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:08:06.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:08:06.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:08:06.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:08:06.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:08:06.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:08:09.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:08:09.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:08:09.303 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:08:09.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:08:09.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:08:09.327 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:08:09.328 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:08:09.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:08:09.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:08:09.329 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:08:09.329 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:08:09.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:08:09.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:08:09.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:08:09.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:08:09.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:08:09.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:08:09.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:08:09.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:08:09.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:08:09.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:08:09.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:08:09.664 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:08:09.733 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:08:05
2026-06-04T05:08:09.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88005, datetime.datetime(2026, 6, 4, 5, 8, 5), datetime.datetime(2026, 6, 4, 5, 8, 4), 'salt', 1.47, 100.64, None, 27.91, 134.5, -0.09, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:08:09.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:08:09.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:08:09.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:08:04, diff=5.741195s, valid=True
2026-06-04T05:08:09.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:08:09.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:08:09.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:08:12, diff=-2.255325s, valid=True
2026-06-04T05:08:09.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:08:09.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:08:09.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:07:59, diff=10.752814s, valid=True
2026-06-04T05:08:09.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:08:09.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:08:09.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:08:09.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:08:09.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:08:09.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:08:09.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:08:12, diff=-2.243485s, valid=True
2026-06-04T05:08:09.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:08:09.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:08:09.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:08:09.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116686.757353s, valid=True
2026-06-04T05:08:09.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:08:09.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:08:09.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:08:09.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:08:09.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:08:09.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:08:09.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:08:09.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:08:09.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:08:09.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:08:09.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:08:10.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:08:10.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:08:10.105 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:08:10.327 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:08:10.699 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:08:10.807 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:08:10.807 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:08:10.807 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:08:10.989 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:08:10.989 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:08:40.994 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:08:40.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:08:40.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:08:41.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:08:41.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:08:41.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:08:41.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:08:41.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:08:41.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:08:41.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:08:41.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:08:41.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:08:41.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:08:44.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:08:44.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:08:44.154 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:08:44.155 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:08:44.164 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:08:44.184 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:08:44.185 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:08:44.185 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:08:44.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:08:44.186 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:08:44.186 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:08:44.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:08:44.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:08:44.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:08:44.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:08:44.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:08:44.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:08:44.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:08:44.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:08:44.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:08:44.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:08:44.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:08:44.535 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:08:44.607 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:08:35
2026-06-04T05:08:44.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88006, datetime.datetime(2026, 6, 4, 5, 8, 35), datetime.datetime(2026, 6, 4, 5, 8, 35), 'salt', 1.47, 100.61, None, 33.17, 136.23, -0.08, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:08:44.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:08:44.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:08:44.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:08:35, diff=9.615138s, valid=True
2026-06-04T05:08:44.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:08:44.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:08:44.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:09:12, diff=-27.380982s, valid=True
2026-06-04T05:08:44.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:08:44.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:08:44.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:08:30, diff=14.628013s, valid=True
2026-06-04T05:08:44.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:08:44.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:08:44.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:08:44.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:08:44.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:08:44.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:08:44.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:09:12, diff=-27.367963s, valid=True
2026-06-04T05:08:44.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:08:44.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:08:44.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:08:44.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116721.632898s, valid=True
2026-06-04T05:08:44.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:08:44.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:08:44.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:08:44.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:08:44.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:08:44.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:08:44.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:08:44.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:08:44.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:08:44.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:08:44.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:08:44.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:08:44.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:08:45.038 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:08:45.253 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:08:45.598 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:08:45.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:08:45.701 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:08:45.701 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:08:45.899 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:08:45.899 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:09:15.929 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:09:15.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:09:15.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:09:16.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:09:16.199 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:09:16.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:09:16.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:09:16.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:09:16.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:09:16.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:09:16.477 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:09:16.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:09:16.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:09:18.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:09:18.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:09:18.931 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:09:18.932 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:09:18.943 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:09:18.955 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:09:18.956 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:09:18.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:09:18.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:09:18.957 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:09:18.957 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:09:18.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:09:19.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:09:19.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:09:19.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:09:19.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:09:19.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:09:19.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:09:19.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:09:19.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:09:19.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:09:19.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:09:19.255 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:09:19.327 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:09:06
2026-06-04T05:09:19.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88007, datetime.datetime(2026, 6, 4, 5, 9, 6), datetime.datetime(2026, 6, 4, 5, 9, 5), 'salt', 1.43, 100.64, None, 30.24, 131.49, -0.09, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:09:19.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:09:19.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:09:19.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:09:05, diff=14.334997s, valid=True
2026-06-04T05:09:19.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:09:19.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:09:19.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:09:12, diff=7.33825s, valid=True
2026-06-04T05:09:19.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:09:19.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:09:19.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:09:00, diff=19.345848s, valid=True
2026-06-04T05:09:19.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:09:19.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:09:19.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:09:19.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:09:19.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:09:19.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:09:19.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:09:12, diff=7.349302s, valid=True
2026-06-04T05:09:19.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:09:19.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:09:19.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:09:19.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116756.350056s, valid=True
2026-06-04T05:09:19.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:09:19.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:09:19.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:09:19.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:09:19.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:09:19.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:09:19.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:09:19.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:09:19.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:09:19.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:09:19.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:09:19.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:09:19.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:09:19.669 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:09:19.892 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:09:20.247 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:09:20.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:09:20.349 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:09:20.349 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:09:20.587 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:09:20.587 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:09:50.598 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:09:50.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:09:50.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:09:50.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:09:50.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:09:51.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:09:51.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:09:51.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:09:51.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:09:51.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:09:51.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:09:51.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:09:51.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:09:53.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:09:53.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:09:53.395 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:09:53.395 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:09:53.404 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:09:53.417 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:09:53.417 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:09:53.418 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:09:53.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:09:53.418 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:09:53.419 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:09:53.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:09:53.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:09:53.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:09:53.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:09:53.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:09:53.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:09:53.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:09:53.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:09:53.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:09:53.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:09:53.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:09:53.706 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:09:53.777 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:09:36
2026-06-04T05:09:53.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88008, datetime.datetime(2026, 6, 4, 5, 9, 36), datetime.datetime(2026, 6, 4, 5, 9, 35), 'salt', 1.6, 100.71, None, 27.35, 157.61, -0.1, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:09:53.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:09:53.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:09:53.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:09:35, diff=18.784558s, valid=True
2026-06-04T05:09:53.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:09:53.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:09:53.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:10:12, diff=-18.212124s, valid=True
2026-06-04T05:09:53.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:09:53.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:09:53.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:09:30, diff=23.795673s, valid=True
2026-06-04T05:09:53.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:09:53.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:09:53.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:09:53.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:09:53.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:09:53.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:09:53.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:10:12, diff=-18.200827s, valid=True
2026-06-04T05:09:53.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:09:53.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:09:53.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:09:53.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116790.800119s, valid=True
2026-06-04T05:09:53.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:09:53.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:09:53.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:09:53.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:09:53.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:09:53.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:09:53.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:09:53.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:09:53.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:09:53.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:09:53.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:09:54.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:09:54.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:09:54.118 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:09:54.331 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:09:54.676 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:09:54.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:09:54.777 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:09:54.777 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:09:54.973 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:09:54.973 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:10:25.003 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:10:25.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:10:25.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:10:25.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:10:25.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:10:25.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:10:25.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:10:25.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:10:25.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:10:25.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:10:25.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:10:25.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:10:25.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:10:28.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:10:28.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:10:28.021 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:10:28.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:10:28.030 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:10:28.042 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:10:28.042 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:10:28.042 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:10:28.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:10:28.042 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:10:28.043 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:10:28.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:10:28.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:10:28.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:10:28.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:10:28.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:10:28.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:10:28.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:10:28.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:10:28.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:10:28.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:10:28.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:10:28.388 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:10:28.459 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:10:06
2026-06-04T05:10:28.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88009, datetime.datetime(2026, 6, 4, 5, 10, 6), datetime.datetime(2026, 6, 4, 5, 10, 5), 'salt', 1.47, 100.58, None, 39.27, 130.29, -0.08, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:10:28.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:10:28.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:10:28.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:10:05, diff=23.466838s, valid=True
2026-06-04T05:10:28.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:10:28.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:10:28.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:10:12, diff=16.47029s, valid=True
2026-06-04T05:10:28.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:10:28.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:10:28.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:10:01, diff=27.47839s, valid=True
2026-06-04T05:10:28.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:10:28.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:10:28.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:10:28.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:10:28.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:10:28.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:10:28.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:10:12, diff=16.482117s, valid=True
2026-06-04T05:10:28.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:10:28.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:10:28.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:10:28.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116825.482932s, valid=True
2026-06-04T05:10:28.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:10:28.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:10:28.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:10:28.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:10:28.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:10:28.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:10:28.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:10:28.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:10:28.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:10:28.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:10:28.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:10:28.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:10:28.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:10:28.802 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:10:29.074 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:10:29.418 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:10:29.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:10:29.520 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:10:29.520 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:10:29.608 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:10:29.608 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:10:59.639 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:10:59.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:10:59.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:11:00.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:11:00.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:11:00.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:11:00.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:11:00.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:11:00.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:11:00.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:11:00.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:11:00.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:11:00.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:11:02.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:11:03.002 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:11:03.003 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:11:03.004 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:11:03.014 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:11:03.027 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:11:03.027 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:11:03.028 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:11:03.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:11:03.028 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:11:03.029 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:11:03.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:11:03.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:11:03.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:11:03.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:11:03.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:11:03.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:11:03.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:11:03.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:11:03.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:11:03.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:11:03.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:11:03.372 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:11:03.443 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:10:36
2026-06-04T05:11:03.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88010, datetime.datetime(2026, 6, 4, 5, 10, 36), datetime.datetime(2026, 6, 4, 5, 10, 36), 'salt', 1.47, 100.64, None, 31.4, 133.13, -0.09, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:11:03.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:11:03.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:11:03.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:10:36, diff=27.451289s, valid=True
2026-06-04T05:11:03.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:11:03.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:11:03.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:11:12, diff=-8.545182s, valid=True
2026-06-04T05:11:03.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:11:03.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:11:03.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:10:31, diff=32.462966s, valid=True
2026-06-04T05:11:03.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:11:03.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:11:03.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:11:03.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:11:03.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:11:03.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:11:03.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:11:12, diff=-8.533318s, valid=True
2026-06-04T05:11:03.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:11:03.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:11:03.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:11:03.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116860.467495s, valid=True
2026-06-04T05:11:03.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:11:03.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:11:03.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:11:03.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:11:03.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:11:03.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:11:03.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:11:03.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:11:03.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:11:03.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:11:03.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:11:03.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:11:03.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:11:03.788 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:11:04.003 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:11:04.350 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:11:04.452 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:11:04.452 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:11:04.452 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:11:04.701 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:11:04.701 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:11:34.718 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:11:34.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:11:34.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:11:34.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:11:34.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:11:35.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:11:35.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:11:35.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:11:35.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:11:35.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:11:35.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:11:35.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:11:35.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:11:37.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:11:37.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:11:37.535 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:11:37.535 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:11:37.546 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:11:37.558 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:11:37.559 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:11:37.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:11:37.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:11:37.560 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:11:37.560 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:11:37.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:11:37.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-06-04T05:11:37.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:11:37.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-06-04T05:11:37.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:11:37.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:11:37.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:11:37.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:11:37.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:11:37.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:11:37.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:11:37.918 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:11:37.993 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:11:37
2026-06-04T05:11:37.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88012, datetime.datetime(2026, 6, 4, 5, 11, 37), datetime.datetime(2026, 6, 4, 5, 11, 36), 'salt', 1.47, 100.74, None, 42.23, 138.11, -0.1, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:11:37.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:11:37.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-06-04T05:11:37.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:11:36, diff=1.999384s, valid=True
2026-06-04T05:11:37.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:11:37.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:11:38.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:12:12, diff=-33.997673s, valid=True
2026-06-04T05:11:38.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:11:38.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-06-04T05:11:38.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:11:31, diff=7.010846s, valid=True
2026-06-04T05:11:38.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:11:38.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:11:38.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:11:38.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:11:38.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:11:38.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:11:38.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:12:12, diff=-33.985112s, valid=True
2026-06-04T05:11:38.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:11:38.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:11:38.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:11:38.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116895.015549s, valid=True
2026-06-04T05:11:38.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:11:38.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:11:38.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:11:38.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:11:38.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:11:38.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:11:38.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:11:38.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:11:38.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:11:38.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:11:38.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:11:38.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:11:38.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:11:38.455 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:11:38.726 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:11:39.110 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:11:39.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:11:39.222 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:11:39.222 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:11:39.468 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:11:39.469 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:12:09.486 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:12:09.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:12:09.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:12:09.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:12:09.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:12:09.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:12:09.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:12:09.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:12:09.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:12:09.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:12:09.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:12:09.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:12:09.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:12:12.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:12:12.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:12:12.218 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:12:12.218 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:12:12.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:12:12.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:12:12.243 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:12:12.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:12:12.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:12:12.244 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:12:12.244 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:12:12.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:12:12.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:12:12.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:12:12.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:12:12.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:12:12.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:12:12.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:12:12.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:12:12.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:12:12.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:12:12.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:12:12.573 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:12:12.643 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:12:07
2026-06-04T05:12:12.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88013, datetime.datetime(2026, 6, 4, 5, 12, 7), datetime.datetime(2026, 6, 4, 5, 12, 6), 'salt', 1.5, 100.71, None, 35.81, 126.91, -0.1, 821.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:12:12.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:12:12.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:12:12.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:12:06, diff=6.651262s, valid=True
2026-06-04T05:12:12.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:12:12.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:12:12.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:12:12, diff=0.654734s, valid=True
2026-06-04T05:12:12.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:12:12.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:12:12.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:12:01, diff=11.663021s, valid=True
2026-06-04T05:12:12.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:12:12.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:12:12.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:12:12.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:12:12.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:12:12.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:12:12.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:12:12, diff=0.666796s, valid=True
2026-06-04T05:12:12.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:12:12.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:12:12.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:12:12.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116929.667611s, valid=True
2026-06-04T05:12:12.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:12:12.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:12:12.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:12:12.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:12:12.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:12:12.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:12:12.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:12:12.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:12:12.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:12:12.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:12:12.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:12:12.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:12:12.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:12:12.988 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:12:13.203 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:12:13.552 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:12:13.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:12:13.655 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:12:13.655 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:12:13.863 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:12:13.863 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:12:43.870 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:12:43.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:12:43.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:12:44.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:12:44.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:12:44.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:12:44.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:12:44.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:12:44.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:12:44.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:12:44.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:12:44.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:12:44.461 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:12:46.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:12:46.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:12:46.928 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:12:46.928 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:12:46.936 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:12:46.949 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:12:46.950 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:12:46.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:12:46.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:12:46.951 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:12:46.951 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:12:46.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:12:47.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:12:47.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:12:47.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:12:47.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:12:47.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:12:47.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:12:47.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:12:47.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:12:47.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:12:47.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:12:47.277 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:12:47.349 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:12:37
2026-06-04T05:12:47.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88014, datetime.datetime(2026, 6, 4, 5, 12, 37), datetime.datetime(2026, 6, 4, 5, 12, 37), 'salt', 1.47, 100.58, None, 34.23, 143.42, -0.08, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:12:47.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:12:47.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:12:47.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:12:37, diff=10.356526s, valid=True
2026-06-04T05:12:47.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:12:47.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:12:47.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:13:12, diff=-24.639943s, valid=True
2026-06-04T05:12:47.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:12:47.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:12:47.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:12:32, diff=15.368343s, valid=True
2026-06-04T05:12:47.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:12:47.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:12:47.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:12:47.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:12:47.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:12:47.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:12:47.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:13:12, diff=-24.627949s, valid=True
2026-06-04T05:12:47.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:12:47.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:12:47.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:12:47.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116964.372866s, valid=True
2026-06-04T05:12:47.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:12:47.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:12:47.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:12:47.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:12:47.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:12:47.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:12:47.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:12:47.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:12:47.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:12:47.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:12:47.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:12:47.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:12:47.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:12:47.763 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:12:47.980 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:12:48.332 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:12:48.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:12:48.437 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:12:48.437 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:12:48.749 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:12:48.749 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:13:18.779 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:13:18.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:13:18.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:13:19.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:13:19.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:13:19.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:13:19.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:13:19.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:13:19.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:13:19.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:13:19.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:13:19.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:13:19.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:13:21.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:13:21.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:13:21.805 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:13:21.805 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:13:21.815 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:13:21.827 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:13:21.828 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:13:21.828 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:13:21.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:13:21.828 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:13:21.828 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:13:21.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:13:21.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:13:21.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:13:22.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:13:22.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:13:22.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:13:22.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:13:22.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:13:22.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:13:22.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:13:22.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:13:22.153 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:13:22.222 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:13:08
2026-06-04T05:13:22.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88015, datetime.datetime(2026, 6, 4, 5, 13, 8), datetime.datetime(2026, 6, 4, 5, 13, 7), 'salt', 1.47, 100.68, None, 39.06, 133.86, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:13:22.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:13:22.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:13:22.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:13:07, diff=15.230101s, valid=True
2026-06-04T05:13:22.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:13:22.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:13:22.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:13:12, diff=10.233568s, valid=True
2026-06-04T05:13:22.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:13:22.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:13:22.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:13:03, diff=19.24182s, valid=True
2026-06-04T05:13:22.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:13:22.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:13:22.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:13:22.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:13:22.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:13:22.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:13:22.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:13:12, diff=10.24557s, valid=True
2026-06-04T05:13:22.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:13:22.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:13:22.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:13:22.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=116999.246387s, valid=True
2026-06-04T05:13:22.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:13:22.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:13:22.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:13:22.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:13:22.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:13:22.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:13:22.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:13:22.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:13:22.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:13:22.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:13:22.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:13:22.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:13:22.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:13:22.568 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:13:22.783 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:13:23.132 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:13:23.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:13:23.234 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:13:23.234 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:13:23.743 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:13:23.743 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:13:53.758 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:13:53.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:13:53.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:13:54.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:13:54.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:13:54.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:13:54.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:13:54.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:13:54.618 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:13:54.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:13:54.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:13:54.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:13:54.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:13:57.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:13:57.151 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:13:57.152 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:13:57.152 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:13:57.163 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:13:57.176 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:13:57.177 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:13:57.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:13:57.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:13:57.178 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:13:57.178 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:13:57.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:13:57.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:13:57.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:13:57.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:13:57.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:13:57.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:13:57.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:13:57.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:13:57.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:13:57.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:13:57.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:13:57.517 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:13:57.588 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:13:38
2026-06-04T05:13:57.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88016, datetime.datetime(2026, 6, 4, 5, 13, 38), datetime.datetime(2026, 6, 4, 5, 13, 37), 'salt', 1.43, 100.64, None, 38.49, 130.43, -0.09, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:13:57.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:13:57.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:13:57.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:13:37, diff=20.595609s, valid=True
2026-06-04T05:13:57.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:13:57.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:13:57.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:14:12, diff=-14.400931s, valid=True
2026-06-04T05:13:57.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:13:57.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:13:57.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:13:32, diff=25.607168s, valid=True
2026-06-04T05:13:57.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:13:57.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:13:57.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:13:57.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:13:57.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:13:57.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:13:57.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:14:12, diff=-14.38895s, valid=True
2026-06-04T05:13:57.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:13:57.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:13:57.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:13:57.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117034.611868s, valid=True
2026-06-04T05:13:57.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:13:57.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:13:57.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:13:57.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:13:57.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:13:57.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:13:57.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:13:57.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:13:57.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:13:57.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:13:57.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:13:57.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:13:57.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:13:57.931 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:13:58.146 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:13:58.494 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:13:58.596 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:13:58.596 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:13:58.596 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:13:58.778 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:13:58.778 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:14:28.782 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:14:28.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:14:28.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:14:28.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:14:28.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:14:29.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:14:29.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:14:29.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:14:29.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:14:29.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:14:29.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:14:29.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:14:29.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:14:32.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:14:32.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:14:32.155 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:14:32.156 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:14:32.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:14:32.185 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:14:32.185 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:14:32.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:14:32.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:14:32.187 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:14:32.187 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:14:32.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:14:32.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:14:32.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:14:32.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:14:32.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:14:32.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:14:32.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:14:32.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:14:32.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:14:32.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:14:32.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:14:32.518 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:14:32.589 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:14:08
2026-06-04T05:14:32.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88017, datetime.datetime(2026, 6, 4, 5, 14, 8), datetime.datetime(2026, 6, 4, 5, 14, 7), 'salt', 1.47, 100.71, None, 34.23, 139.55, -0.1, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:14:32.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:14:32.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:14:32.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:14:07, diff=25.596784s, valid=True
2026-06-04T05:14:32.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:14:32.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:14:32.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:14:12, diff=20.600282s, valid=True
2026-06-04T05:14:32.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:14:32.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:14:32.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:14:03, diff=29.608413s, valid=True
2026-06-04T05:14:32.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:14:32.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:14:32.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:14:32.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:14:32.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:14:32.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:14:32.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:14:12, diff=20.612228s, valid=True
2026-06-04T05:14:32.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:14:32.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:14:32.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:14:32.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117069.61305s, valid=True
2026-06-04T05:14:32.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:14:32.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:14:32.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:14:32.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:14:32.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:14:32.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:14:32.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:14:32.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:14:32.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:14:32.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:14:32.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:14:32.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:14:32.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:14:32.933 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:14:33.206 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:14:33.553 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:14:33.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:14:33.655 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:14:33.655 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:14:33.837 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:14:33.838 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:15:03.868 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:15:03.868 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:15:03.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:15:03.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:15:03.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:15:04.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:15:04.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:15:04.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:15:04.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:15:04.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:15:04.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:15:04.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:15:04.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:15:06.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:15:06.533 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:15:06.534 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:15:06.534 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:15:06.544 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:15:06.556 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:15:06.557 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:15:06.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:15:06.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:15:06.558 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:15:06.558 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:15:06.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:15:06.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:15:06.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:15:06.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:15:06.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:15:06.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:15:06.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:15:06.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:15:06.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:15:06.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:15:06.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:15:06.890 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:15:06.961 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:14:38
2026-06-04T05:15:06.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88018, datetime.datetime(2026, 6, 4, 5, 14, 38), datetime.datetime(2026, 6, 4, 5, 14, 38), 'salt', 1.53, 100.74, None, 28.93, 137.36, -0.11, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:15:06.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:15:06.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:15:06.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:14:38, diff=28.969337s, valid=True
2026-06-04T05:15:06.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:15:06.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:15:06.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:15:12, diff=-5.027175s, valid=True
2026-06-04T05:15:06.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:15:06.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:15:06.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:14:33, diff=33.980819s, valid=True
2026-06-04T05:15:06.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:15:06.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:15:06.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:15:06.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:15:06.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:15:06.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:15:06.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:15:12, diff=-5.015582s, valid=True
2026-06-04T05:15:06.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:15:06.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:15:06.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:15:06.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117103.985212s, valid=True
2026-06-04T05:15:06.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:15:06.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:15:06.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:15:06.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:15:06.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:15:07.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:15:07.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:15:07.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:15:07.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:15:07.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:15:07.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:15:07.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:15:07.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:15:07.306 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:15:07.518 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:15:07.861 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:15:07.962 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:15:07.962 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:15:07.962 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:15:08.148 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:15:08.148 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:15:38.178 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:15:38.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:15:38.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:15:38.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:15:38.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:15:38.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:15:38.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:15:38.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:15:38.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:15:38.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:15:38.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:15:38.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:15:38.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:15:41.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:15:41.172 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:15:41.172 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:15:41.172 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:15:41.183 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:15:41.200 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:15:41.201 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:15:41.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:15:41.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:15:41.202 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:15:41.202 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:15:41.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:15:41.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:15:41.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:15:41.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:15:41.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:15:41.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:15:41.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:15:41.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:15:41.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:15:41.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:15:41.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:15:41.549 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:15:41.632 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:15:39
2026-06-04T05:15:41.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88020, datetime.datetime(2026, 6, 4, 5, 15, 39), datetime.datetime(2026, 6, 4, 5, 15, 38), 'salt', 1.53, 100.64, None, 28.19, 132.47, -0.09, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:15:41.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:15:41.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:15:41.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:15:38, diff=3.638897s, valid=True
2026-06-04T05:15:41.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:15:41.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:15:41.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:16:12, diff=-30.358262s, valid=True
2026-06-04T05:15:41.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:15:41.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:15:41.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:15:35, diff=6.648478s, valid=True
2026-06-04T05:15:41.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:15:41.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:15:41.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:15:41.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:15:41.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:15:41.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:15:41.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:16:12, diff=-30.348454s, valid=True
2026-06-04T05:15:41.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:15:41.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:15:41.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:15:41.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117138.652211s, valid=True
2026-06-04T05:15:41.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:15:41.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:15:41.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:15:41.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:15:41.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:15:41.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:15:41.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:15:41.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:15:41.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:15:41.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:15:41.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:15:41.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:15:41.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:15:42.040 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:15:42.250 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:15:42.593 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:15:42.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:15:42.695 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:15:42.695 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:15:42.878 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:15:42.878 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:16:12.908 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:16:12.908 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:16:12.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:16:13.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:16:13.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:16:13.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:16:13.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:16:13.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:16:13.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:16:13.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:16:13.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:16:13.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:16:13.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:16:16.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:16:16.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:16:16.172 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:16:16.172 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:16:16.182 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:16:16.194 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:16:16.195 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:16:16.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:16:16.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:16:16.196 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:16:16.196 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:16:16.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:16:16.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:16:16.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:16:16.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:16:16.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:16:16.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:16:16.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:16:16.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:16:16.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:16:16.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:16:16.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:16:16.528 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:16:16.623 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:16:09
2026-06-04T05:16:16.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88021, datetime.datetime(2026, 6, 4, 5, 16, 9), datetime.datetime(2026, 6, 4, 5, 16, 8), 'salt', 1.53, 100.71, None, 29.99, 141.45, -0.1, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:16:16.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:16:16.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:16:16.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:16:08, diff=8.629753s, valid=True
2026-06-04T05:16:16.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:16:16.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:16:16.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:16:12, diff=4.632527s, valid=True
2026-06-04T05:16:16.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:16:16.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:16:16.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:16:04, diff=12.639137s, valid=True
2026-06-04T05:16:16.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:16:16.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:16:16.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:16:16.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:16:16.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:16:16.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:16:16.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:16:12, diff=4.642116s, valid=True
2026-06-04T05:16:16.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:16:16.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:16:16.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:16:16.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117173.642775s, valid=True
2026-06-04T05:16:16.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:16:16.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:16:16.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:16:16.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:16:16.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:16:16.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:16:16.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:16:16.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:16:16.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:16:16.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:16:16.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:16:16.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:16:16.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:16:16.962 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:16:17.172 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:16:17.518 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:16:17.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:16:17.619 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:16:17.619 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:16:17.854 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:16:17.855 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:16:47.885 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:16:47.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:16:47.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:16:48.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:16:48.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:16:48.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:16:48.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:16:48.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:16:48.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:16:48.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:16:48.427 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:16:48.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:16:48.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:16:50.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:16:50.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:16:50.788 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:16:50.788 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:16:50.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:16:50.810 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:16:50.810 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:16:50.811 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:16:50.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:16:50.812 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:16:50.812 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:16:50.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:16:50.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:16:50.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:16:51.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:16:51.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:16:51.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:16:51.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:16:51.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:16:51.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:16:51.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:16:51.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:16:51.148 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:16:51.225 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:16:39
2026-06-04T05:16:51.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88022, datetime.datetime(2026, 6, 4, 5, 16, 39), datetime.datetime(2026, 6, 4, 5, 16, 39), 'salt', 1.57, 100.74, None, 27.2, 136.52, -0.1, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:16:51.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:16:51.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:16:51.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:16:39, diff=12.233533s, valid=True
2026-06-04T05:16:51.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:16:51.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:16:51.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:17:12, diff=-20.762929s, valid=True
2026-06-04T05:16:51.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:16:51.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:16:51.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:16:37, diff=14.245656s, valid=True
2026-06-04T05:16:51.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:16:51.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:16:51.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:16:51.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:16:51.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:16:51.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:16:51.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:17:12, diff=-20.750569s, valid=True
2026-06-04T05:16:51.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:16:51.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:16:51.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:16:51.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117208.250254s, valid=True
2026-06-04T05:16:51.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:16:51.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:16:51.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:16:51.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:16:51.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:16:51.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:16:51.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:16:51.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:16:51.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:16:51.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:16:51.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:16:51.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:16:51.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:16:51.643 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:16:51.854 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:16:52.199 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:16:52.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:16:52.301 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:16:52.301 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:16:52.554 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:16:52.555 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:17:22.562 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:17:22.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:17:22.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:17:22.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:17:22.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:17:22.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:17:22.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:17:22.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:17:22.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:17:23.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:17:23.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:17:23.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:17:23.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:17:25.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:17:25.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:17:25.407 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:17:25.407 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:17:25.418 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:17:25.430 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:17:25.431 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:17:25.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:17:25.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:17:25.432 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:17:25.432 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:17:25.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:17:25.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:17:25.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:17:25.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:17:25.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:17:25.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:17:25.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:17:25.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:17:25.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:17:25.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:17:25.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:17:25.764 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:17:25.842 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:17:10
2026-06-04T05:17:25.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88023, datetime.datetime(2026, 6, 4, 5, 17, 10), datetime.datetime(2026, 6, 4, 5, 17, 9), 'salt', 1.53, 100.68, None, 26.36, 135.41, -0.1, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:17:25.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:17:25.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:17:25.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:17:09, diff=16.849955s, valid=True
2026-06-04T05:17:25.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:17:25.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:17:25.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:17:12, diff=13.853419s, valid=True
2026-06-04T05:17:25.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:17:25.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:17:25.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:17:04, diff=21.861675s, valid=True
2026-06-04T05:17:25.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:17:25.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:17:25.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:17:25.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:17:25.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:17:25.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:17:25.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:17:12, diff=13.865364s, valid=True
2026-06-04T05:17:25.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:17:25.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:17:25.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:17:25.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117242.866197s, valid=True
2026-06-04T05:17:25.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:17:25.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:17:25.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:17:25.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:17:25.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:17:25.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:17:25.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:17:25.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:17:25.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:17:26.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:17:26.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:17:26.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:17:26.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:17:26.187 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:17:26.396 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:17:26.740 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:17:26.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:17:26.842 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:17:26.842 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:17:27.087 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:17:27.088 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:17:57.098 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:17:57.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:17:57.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:17:57.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:17:57.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:17:57.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:17:57.661 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:17:57.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:17:57.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:17:57.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:17:57.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:17:57.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:17:57.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:18:00.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:18:00.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:18:00.168 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:18:00.168 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:18:00.176 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:18:00.189 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:18:00.190 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:18:00.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:18:00.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:18:00.191 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:18:00.191 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:18:00.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:18:00.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:18:00.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:18:00.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:18:00.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:18:00.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:18:00.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:18:00.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:18:00.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:18:00.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:18:00.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:18:00.616 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:18:00.687 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:17:40
2026-06-04T05:18:00.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88024, datetime.datetime(2026, 6, 4, 5, 17, 40), datetime.datetime(2026, 6, 4, 5, 17, 39), 'salt', 1.57, 100.68, None, 29.6, 134.0, -0.09, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:18:00.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:18:00.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:18:00.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:17:39, diff=21.695227s, valid=True
2026-06-04T05:18:00.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:18:00.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:18:00.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:18:12, diff=-11.301952s, valid=True
2026-06-04T05:18:00.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:18:00.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:18:00.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:17:35, diff=25.704836s, valid=True
2026-06-04T05:18:00.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:18:00.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:18:00.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:18:00.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:18:00.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:18:00.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:18:00.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:18:12, diff=-11.292181s, valid=True
2026-06-04T05:18:00.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:18:00.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:18:00.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:18:00.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117277.708458s, valid=True
2026-06-04T05:18:00.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:18:00.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:18:00.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:18:00.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:18:00.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:18:00.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:18:00.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:18:00.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:18:00.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:18:00.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:18:00.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:18:00.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:18:00.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:18:01.026 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:18:01.266 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:18:01.635 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:18:01.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:18:01.740 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:18:01.740 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:18:01.919 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:18:01.919 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:18:31.929 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:18:31.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:18:31.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:18:32.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:18:32.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:18:32.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:18:32.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:18:32.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:18:32.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:18:32.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:18:32.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:18:32.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:18:32.525 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:18:34.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:18:34.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:18:34.926 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:18:34.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:18:34.937 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:18:34.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:18:34.950 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:18:34.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:18:34.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:18:34.952 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:18:34.952 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:18:34.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:18:35.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:18:35.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:18:35.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:18:35.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:18:35.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:18:35.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:18:35.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:18:35.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:18:35.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:18:35.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:18:35.296 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:18:35.368 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:18:10
2026-06-04T05:18:35.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88025, datetime.datetime(2026, 6, 4, 5, 18, 10), datetime.datetime(2026, 6, 4, 5, 18, 9), 'salt', 1.5, 100.68, None, 34.47, 133.51, -0.1, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:18:35.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:18:35.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:18:35.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:18:09, diff=26.376308s, valid=True
2026-06-04T05:18:35.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:18:35.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:18:35.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:18:12, diff=23.37975s, valid=True
2026-06-04T05:18:35.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:18:35.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:18:35.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:18:05, diff=30.388112s, valid=True
2026-06-04T05:18:35.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:18:35.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:18:35.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:18:35.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:18:35.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:18:35.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:18:35.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:18:12, diff=23.391839s, valid=True
2026-06-04T05:18:35.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:18:35.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:18:35.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:18:35.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117312.39277s, valid=True
2026-06-04T05:18:35.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:18:35.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:18:35.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:18:35.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:18:35.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:18:35.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:18:35.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:18:35.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:18:35.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:18:35.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:18:35.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:18:35.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:18:35.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:18:35.712 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:18:35.923 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:18:36.268 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:18:36.426 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:18:36.426 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:18:36.426 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:18:36.611 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:18:36.611 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:19:06.613 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:19:06.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:19:06.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:19:06.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:19:06.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:19:07.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:19:07.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:19:07.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:19:07.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:19:07.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:19:07.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:19:07.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:19:07.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:19:09.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:19:09.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:19:09.652 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:19:09.652 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:19:09.663 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:19:09.676 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:19:09.677 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:19:09.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:19:09.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:19:09.678 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:19:09.678 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:19:09.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:19:09.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:19:09.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:19:09.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:19:09.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:19:09.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:19:09.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:19:10.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:19:10.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:19:10.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:19:10.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:19:10.040 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:19:10.111 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:18:40
2026-06-04T05:19:10.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88026, datetime.datetime(2026, 6, 4, 5, 18, 40), datetime.datetime(2026, 6, 4, 5, 18, 40), 'salt', 1.57, 100.74, None, 29.29, 137.22, -0.1, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:19:10.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:19:10.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:19:10.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:18:40, diff=30.118493s, valid=True
2026-06-04T05:19:10.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:19:10.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:19:10.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:19:12, diff=-1.878306s, valid=True
2026-06-04T05:19:10.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:19:10.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:19:10.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:18:35, diff=35.129627s, valid=True
2026-06-04T05:19:10.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:19:10.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:19:10.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:19:10.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:19:10.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:19:10.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:19:10.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:19:12, diff=-1.866787s, valid=True
2026-06-04T05:19:10.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:19:10.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:19:10.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:19:10.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117347.134s, valid=True
2026-06-04T05:19:10.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:19:10.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:19:10.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:19:10.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:19:10.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:19:10.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:19:10.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:19:10.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:19:10.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:19:10.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:19:10.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:19:10.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:19:10.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:19:10.457 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:19:10.701 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:19:11.075 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:19:11.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:19:11.182 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:19:11.182 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:19:11.364 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:19:11.365 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:19:41.382 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:19:41.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:19:41.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:19:41.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:19:41.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:19:41.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:19:41.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:19:41.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:19:41.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:19:41.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:19:41.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:19:41.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:19:41.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:19:44.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:19:44.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:19:44.361 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:19:44.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:19:44.372 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:19:44.384 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:19:44.385 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:19:44.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:19:44.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:19:44.386 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:19:44.386 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:19:44.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:19:44.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:19:44.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:19:44.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:19:44.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:19:44.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:19:44.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:19:44.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:19:44.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:19:44.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:19:44.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:19:44.736 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:19:44.809 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:19:41
2026-06-04T05:19:44.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88028, datetime.datetime(2026, 6, 4, 5, 19, 41), datetime.datetime(2026, 6, 4, 5, 19, 40), 'salt', 1.57, 100.61, None, 25.79, 145.96, -0.08, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:19:44.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:19:44.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:19:44.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:19:40, diff=4.816861s, valid=True
2026-06-04T05:19:44.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:19:44.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:19:44.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:20:12, diff=-27.179627s, valid=True
2026-06-04T05:19:44.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:19:44.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:19:44.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:19:36, diff=8.828887s, valid=True
2026-06-04T05:19:44.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:19:44.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:19:44.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:19:44.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:19:44.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:19:44.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:19:44.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:20:12, diff=-27.167357s, valid=True
2026-06-04T05:19:44.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:19:44.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:19:44.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:19:44.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117381.833449s, valid=True
2026-06-04T05:19:44.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:19:44.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:19:44.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:19:44.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:19:44.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:19:44.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:19:44.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:19:44.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:19:44.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:19:44.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:19:45.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:19:45.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:19:45.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:19:45.163 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:19:45.447 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:19:45.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:19:45.892 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:19:45.892 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:19:45.892 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:19:46.144 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:19:46.144 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:20:16.175 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:20:16.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:20:16.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:20:16.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:20:16.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:20:16.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:20:16.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:20:16.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:20:16.768 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:20:16.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:20:16.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:20:16.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:20:16.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:20:19.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:20:19.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:20:19.175 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:20:19.175 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:20:19.186 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:20:19.199 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:20:19.199 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:20:19.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:20:19.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:20:19.200 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:20:19.201 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:20:19.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:20:19.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:20:19.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:20:19.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:20:19.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:20:19.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:20:19.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:20:19.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:20:19.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:20:19.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:20:19.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:20:19.529 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:20:19.602 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:20:11
2026-06-04T05:20:19.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88029, datetime.datetime(2026, 6, 4, 5, 20, 11), datetime.datetime(2026, 6, 4, 5, 20, 10), 'salt', 1.53, 100.68, None, 34.97, 137.01, -0.1, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:20:19.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:20:19.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:20:19.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:20:10, diff=9.609476s, valid=True
2026-06-04T05:20:19.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:20:19.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:20:19.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:20:12, diff=7.612984s, valid=True
2026-06-04T05:20:19.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:20:19.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:20:19.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:20:11, diff=8.621142s, valid=True
2026-06-04T05:20:19.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:20:19.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:20:19.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:20:19.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:20:19.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:20:19.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:20:19.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:20:12, diff=7.624835s, valid=True
2026-06-04T05:20:19.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:20:19.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:20:19.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:20:19.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117416.625654s, valid=True
2026-06-04T05:20:19.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:20:19.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:20:19.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:20:19.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:20:19.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:20:19.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:20:19.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:20:19.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:20:19.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:20:19.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:20:19.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:20:19.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:20:19.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:20:19.966 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:20:20.198 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:20:20.542 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:20:20.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:20:20.646 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:20:20.647 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:20:20.854 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:20:20.854 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:20:50.884 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:20:50.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:20:50.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:20:51.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:20:51.230 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:20:51.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:20:51.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:20:51.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:20:51.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:20:51.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:20:51.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:20:51.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:20:51.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:20:53.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:20:53.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:20:53.829 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:20:53.830 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:20:53.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:20:53.852 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:20:53.853 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:20:53.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:20:53.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:20:53.854 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:20:53.854 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:20:53.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:20:53.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:20:53.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:20:54.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:20:54.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:20:54.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:20:54.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:20:54.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:20:54.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:20:54.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:20:54.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:20:54.190 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:20:54.263 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:20:41
2026-06-04T05:20:54.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88030, datetime.datetime(2026, 6, 4, 5, 20, 41), datetime.datetime(2026, 6, 4, 5, 20, 41), 'salt', 1.53, 100.68, None, 32.6, 139.01, -0.1, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:20:54.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:20:54.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:20:54.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:20:41, diff=13.27088s, valid=True
2026-06-04T05:20:54.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:20:54.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:20:54.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:21:12, diff=-17.725682s, valid=True
2026-06-04T05:20:54.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:20:54.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:20:54.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:20:36, diff=18.282485s, valid=True
2026-06-04T05:20:54.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:20:54.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:20:54.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:20:54.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:20:54.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:20:54.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:20:54.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:21:12, diff=-17.713804s, valid=True
2026-06-04T05:20:54.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:20:54.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:20:54.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:20:54.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117451.287022s, valid=True
2026-06-04T05:20:54.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:20:54.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:20:54.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:20:54.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:20:54.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:20:54.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:20:54.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:20:54.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:20:54.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:20:54.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:20:54.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:20:54.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:20:54.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:20:54.677 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:20:54.887 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:20:55.233 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:20:55.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:20:55.336 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:20:55.336 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:20:55.543 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:20:55.544 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:21:25.574 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:21:25.574 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:21:25.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:21:25.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:21:25.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:21:26.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:21:26.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:21:26.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:21:26.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:21:26.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:21:26.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:21:26.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:21:26.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:21:28.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:21:28.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:21:28.575 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:21:28.576 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:21:28.588 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:21:28.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:21:28.663 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:21:28.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:21:28.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:21:28.663 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:21:28.664 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:21:28.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:21:28.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:21:28.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:21:28.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:21:28.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:21:28.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:21:28.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:21:28.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:21:28.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:21:28.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:21:28.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:21:28.968 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:21:29.043 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:21:12
2026-06-04T05:21:29.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88031, datetime.datetime(2026, 6, 4, 5, 21, 12), datetime.datetime(2026, 6, 4, 5, 21, 11), 'salt', 1.5, 100.68, None, 23.32, 140.63, -0.1, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:21:29.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:21:29.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:21:29.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:21:11, diff=18.050138s, valid=True
2026-06-04T05:21:29.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:21:29.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:21:29.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:21:12, diff=17.053487s, valid=True
2026-06-04T05:21:29.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:21:29.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:21:29.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:21:06, diff=23.061279s, valid=True
2026-06-04T05:21:29.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:21:29.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:21:29.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:21:29.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:21:29.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:21:29.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:21:29.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:21:12, diff=17.064898s, valid=True
2026-06-04T05:21:29.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:21:29.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:21:29.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:21:29.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117486.065685s, valid=True
2026-06-04T05:21:29.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:21:29.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:21:29.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:21:29.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:21:29.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:21:29.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:21:29.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:21:29.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:21:29.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:21:29.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:21:29.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:21:29.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:21:29.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:21:29.384 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:21:29.595 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:21:29.949 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:21:30.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:21:30.057 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:21:30.058 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:21:30.136 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:21:30.136 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:22:00.137 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:22:00.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:22:00.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:22:00.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:22:00.444 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:22:00.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:22:00.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:22:00.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:22:00.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:22:00.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:22:00.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:22:00.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:22:00.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:22:03.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:22:03.168 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:22:03.169 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:22:03.169 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:22:03.180 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:22:03.192 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:22:03.193 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:22:03.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:22:03.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:22:03.194 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:22:03.194 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:22:03.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:22:03.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:22:03.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:22:03.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:22:03.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:22:03.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:22:03.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:22:03.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:22:03.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:22:03.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:22:03.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:22:03.524 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:22:03.595 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:21:42
2026-06-04T05:22:03.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88032, datetime.datetime(2026, 6, 4, 5, 21, 42), datetime.datetime(2026, 6, 4, 5, 21, 41), 'salt', 1.5, 100.71, None, 35.74, 151.01, -0.1, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:22:03.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:22:03.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:22:03.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:21:41, diff=22.603191s, valid=True
2026-06-04T05:22:03.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:22:03.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:22:03.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:22:12, diff=-8.393324s, valid=True
2026-06-04T05:22:03.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:22:03.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:22:03.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:21:37, diff=26.614787s, valid=True
2026-06-04T05:22:03.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:22:03.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:22:03.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:22:03.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:22:03.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:22:03.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:22:03.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:22:12, diff=-8.381504s, valid=True
2026-06-04T05:22:03.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:22:03.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:22:03.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:22:03.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117520.619317s, valid=True
2026-06-04T05:22:03.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:22:03.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:22:03.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:22:03.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:22:03.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:22:03.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:22:03.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:22:03.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:22:03.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:22:03.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:22:03.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:22:03.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:22:03.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:22:04.010 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:22:04.224 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:22:04.570 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:22:04.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:22:04.672 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:22:04.672 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:22:04.916 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:22:04.916 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:22:34.933 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:22:34.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:22:34.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:22:35.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:22:35.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:22:35.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:22:35.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:22:35.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:22:35.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:22:35.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:22:35.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:22:35.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:22:35.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:22:37.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:22:37.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:22:37.924 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:22:37.925 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:22:37.934 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:22:37.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:22:37.946 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:22:37.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:22:37.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:22:37.946 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:22:37.946 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:22:37.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:22:38.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:22:38.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:22:38.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:22:38.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:22:38.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:22:38.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:22:38.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:22:38.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:22:38.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:22:38.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:22:38.220 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:22:38.290 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:22:12
2026-06-04T05:22:38.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88033, datetime.datetime(2026, 6, 4, 5, 22, 12), datetime.datetime(2026, 6, 4, 5, 22, 11), 'salt', 1.63, 100.64, None, 32.67, 146.69, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:22:38.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:22:38.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:22:38.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:22:11, diff=27.296086s, valid=True
2026-06-04T05:22:38.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:22:38.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:22:38.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:22:12, diff=26.298879s, valid=True
2026-06-04T05:22:38.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:22:38.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:22:38.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:22:07, diff=31.305389s, valid=True
2026-06-04T05:22:38.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:22:38.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:22:38.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:22:38.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:22:38.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:22:38.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:22:38.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:22:12, diff=26.308346s, valid=True
2026-06-04T05:22:38.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:22:38.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:22:38.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:22:38.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117555.309013s, valid=True
2026-06-04T05:22:38.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:22:38.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:22:38.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:22:38.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:22:38.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:22:38.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:22:38.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:22:38.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:22:38.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:22:38.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:22:38.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:22:38.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:22:38.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:22:38.640 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:22:38.851 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:22:39.198 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:22:39.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:22:39.300 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:22:39.300 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:22:39.517 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:22:39.517 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:23:09.547 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:23:09.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:23:09.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:23:09.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:23:09.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:23:09.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:23:09.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:23:09.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:23:09.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:23:09.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:23:09.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:23:09.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:23:09.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:23:12.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:23:12.352 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:23:12.352 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:23:12.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:23:12.364 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:23:12.377 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:23:12.377 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:23:12.378 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:23:12.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:23:12.378 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:23:12.379 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:23:12.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:23:12.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:23:12.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:23:12.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:23:12.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:23:12.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:23:12.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:23:12.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:23:12.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:23:12.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:23:12.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:23:12.762 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:23:12.832 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:22:42
2026-06-04T05:23:12.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88034, datetime.datetime(2026, 6, 4, 5, 22, 42), datetime.datetime(2026, 6, 4, 5, 22, 42), 'salt', 1.5, 100.74, None, 28.19, 136.42, -0.11, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:23:12.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:23:12.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:23:12.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:22:42, diff=30.838187s, valid=True
2026-06-04T05:23:12.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:23:12.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:23:12.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:23:12, diff=0.841031s, valid=True
2026-06-04T05:23:12.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:23:12.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:23:12.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:22:37, diff=35.848053s, valid=True
2026-06-04T05:23:12.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:23:12.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:23:12.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:23:12.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:23:12.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:23:12.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:23:12.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:23:12, diff=0.851199s, valid=True
2026-06-04T05:23:12.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:23:12.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:23:12.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:23:12.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117589.851891s, valid=True
2026-06-04T05:23:12.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:23:12.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:23:12.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:23:12.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:23:12.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:23:12.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:23:12.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:23:12.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:23:12.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:23:12.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:23:13.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:23:13.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:23:13.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:23:13.165 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:23:13.376 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:23:13.725 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:23:13.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:23:13.827 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:23:13.827 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:23:14.001 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:23:14.001 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:23:44.031 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:23:44.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:23:44.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:23:44.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:23:44.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:23:44.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:23:44.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:23:44.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:23:44.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:23:44.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:23:44.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:23:44.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:23:44.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:23:47.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:23:47.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:23:47.354 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:23:47.354 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:23:47.362 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:23:47.374 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:23:47.374 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:23:47.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:23:47.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:23:47.374 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:23:47.374 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:23:47.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:23:47.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:23:47.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:23:47.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:23:47.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:23:47.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:23:47.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:23:47.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:23:47.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:23:47.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:23:47.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:23:47.653 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:23:47.725 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:23:43
2026-06-04T05:23:47.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88036, datetime.datetime(2026, 6, 4, 5, 23, 43), datetime.datetime(2026, 6, 4, 5, 23, 42), 'salt', 1.5, 100.64, None, 35.78, 141.66, -0.09, 820.87, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:23:47.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:23:47.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:23:47.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:23:42, diff=5.732101s, valid=True
2026-06-04T05:23:47.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:23:47.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:23:47.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:24:12, diff=-24.264638s, valid=True
2026-06-04T05:23:47.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:23:47.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:23:47.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:23:38, diff=9.742878s, valid=True
2026-06-04T05:23:47.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:23:47.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:23:47.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:23:47.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:23:47.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:23:47.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:23:47.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:24:12, diff=-24.253671s, valid=True
2026-06-04T05:23:47.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:23:47.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:23:47.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:23:47.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117624.747082s, valid=True
2026-06-04T05:23:47.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:23:47.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:23:47.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:23:47.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:23:47.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:23:47.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:23:47.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:23:47.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:23:47.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:23:47.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:23:47.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:23:47.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:23:48.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:23:48.065 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:23:48.276 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:23:48.674 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:23:48.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:23:48.774 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:23:48.774 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:23:48.863 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:23:48.863 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:24:18.893 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:24:18.893 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:24:18.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:24:19.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:24:19.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:24:19.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:24:19.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:24:19.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:24:19.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:24:19.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:24:19.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:24:19.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:24:19.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:24:21.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:24:21.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:24:21.791 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:24:21.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:24:21.801 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:24:21.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:24:21.814 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:24:21.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:24:21.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:24:21.814 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:24:21.814 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:24:21.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:24:21.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:24:21.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:24:22.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:24:22.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:24:22.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:24:22.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:24:22.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:24:22.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:24:22.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:24:22.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:24:22.104 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:24:22.174 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:24:13
2026-06-04T05:24:22.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88037, datetime.datetime(2026, 6, 4, 5, 24, 13), datetime.datetime(2026, 6, 4, 5, 24, 13), 'salt', 1.37, 100.54, None, 31.19, 139.19, -0.07, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:24:22.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:24:22.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:24:22.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:24:13, diff=9.181227s, valid=True
2026-06-04T05:24:22.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:24:22.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:24:22.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:24:12, diff=10.184485s, valid=True
2026-06-04T05:24:22.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:24:22.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:24:22.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:24:08, diff=14.192359s, valid=True
2026-06-04T05:24:22.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:24:22.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:24:22.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:24:22.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:24:22.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:24:22.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:24:22.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:24:12, diff=10.195915s, valid=True
2026-06-04T05:24:22.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:24:22.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:24:22.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:24:22.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117659.196689s, valid=True
2026-06-04T05:24:22.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:24:22.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:24:22.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:24:22.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:24:22.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:24:22.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:24:22.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:24:22.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:24:22.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:24:22.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:24:22.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:24:22.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:24:22.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:24:22.520 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:24:22.735 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:24:23.084 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:24:23.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:24:23.189 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:24:23.189 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:24:23.323 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:24:23.323 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:24:53.338 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:24:53.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:24:53.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:24:53.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:24:53.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:24:53.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:24:53.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:24:53.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:24:53.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:24:53.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:24:53.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:24:53.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:24:53.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:24:56.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:24:56.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:24:56.081 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:24:56.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:24:56.091 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:24:56.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:24:56.104 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:24:56.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:24:56.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:24:56.105 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:24:56.105 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:24:56.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:24:56.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:24:56.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:24:56.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:24:56.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:24:56.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T05:24:56.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:24:56.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T05:24:56.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:24:56.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:24:56.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:24:56.437 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:24:56.508 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:24:44
2026-06-04T05:24:56.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88038, datetime.datetime(2026, 6, 4, 5, 24, 44), datetime.datetime(2026, 6, 4, 5, 24, 43), 'salt', 1.5, 100.74, None, 33.41, 145.39, -0.11, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:24:56.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:24:56.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:24:56.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:24:43, diff=13.515628s, valid=True
2026-06-04T05:24:56.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:24:56.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T05:24:56.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:25:12, diff=-15.481011s, valid=True
2026-06-04T05:24:56.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:24:56.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:24:56.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:24:38, diff=18.52697s, valid=True
2026-06-04T05:24:56.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:24:56.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:24:56.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:24:56.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:24:56.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:24:56.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T05:24:56.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:25:12, diff=-15.46946s, valid=True
2026-06-04T05:24:56.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:24:56.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:24:56.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:24:56.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117693.531333s, valid=True
2026-06-04T05:24:56.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:24:56.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:24:56.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:24:56.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:24:56.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:24:56.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:24:56.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:24:56.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:24:56.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:24:56.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:24:56.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:24:56.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:24:56.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:24:56.852 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:24:57.134 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:24:57.481 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:24:57.579 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:24:57.579 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:24:57.579 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:24:57.779 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:24:57.779 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:25:27.779 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:25:27.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:25:27.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:25:27.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:25:27.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:25:28.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:25:28.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:25:28.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:25:28.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:25:28.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:25:28.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:25:28.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:25:28.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:25:30.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:25:30.669 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:25:30.670 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:25:30.671 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:25:30.681 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:25:30.694 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:25:30.695 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:25:30.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:25:30.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:25:30.696 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:25:30.696 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:25:30.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:25:30.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:25:30.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:25:30.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:25:30.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:25:30.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T05:25:30.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:25:30.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T05:25:30.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:25:30.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:25:30.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:25:30.976 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:25:31.049 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:25:14
2026-06-04T05:25:31.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88039, datetime.datetime(2026, 6, 4, 5, 25, 14), datetime.datetime(2026, 6, 4, 5, 25, 13), 'salt', 1.5, 100.74, None, 46.93, 146.69, -0.11, 820.99, 'RAIN', 1, 1, 0, 2, 1, 2)]
2026-06-04T05:25:31.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:25:31.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:25:31.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:25:13, diff=18.055863s, valid=True
2026-06-04T05:25:31.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:25:31.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T05:25:31.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:25:12, diff=19.059135s, valid=True
2026-06-04T05:25:31.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:25:31.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:25:31.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:25:08, diff=23.066849s, valid=True
2026-06-04T05:25:31.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:25:31.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:25:31.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:25:31.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:25:31.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:25:31.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T05:25:31.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:25:12, diff=19.07031s, valid=True
2026-06-04T05:25:31.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:25:31.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:25:31.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:25:31.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117728.071063s, valid=True
2026-06-04T05:25:31.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:25:31.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:25:31.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:25:31.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:25:31.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:25:31.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:25:31.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:25:31.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:25:31.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:25:31.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:25:31.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:25:31.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:25:31.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:25:31.392 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:25:31.601 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:25:31.945 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:25:32.051 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:25:32.051 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:25:32.051 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:25:32.307 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:25:32.308 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:26:02.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:26:02.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:26:02.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:26:02.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:26:02.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:26:02.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:26:02.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:26:02.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:26:02.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:26:02.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:26:02.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:26:02.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:26:02.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:26:05.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:26:05.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:26:05.238 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:26:05.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:26:05.247 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:26:05.258 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:26:05.259 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:26:05.259 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:26:05.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:26:05.259 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:26:05.259 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:26:05.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:26:05.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:26:05.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:26:05.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:26:05.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:26:05.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T05:26:05.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:26:05.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T05:26:05.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:26:05.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:26:05.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:26:05.585 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:26:05.657 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:25:44
2026-06-04T05:26:05.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88040, datetime.datetime(2026, 6, 4, 5, 25, 44), datetime.datetime(2026, 6, 4, 5, 25, 43), 'salt', 1.5, 100.74, None, 34.75, 157.3, -0.11, 821.11, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:26:05.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:26:05.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:26:05.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:25:43, diff=22.665145s, valid=True
2026-06-04T05:26:05.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:26:05.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T05:26:05.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:26:12, diff=-6.331401s, valid=True
2026-06-04T05:26:05.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:26:05.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:26:05.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:25:38, diff=27.676833s, valid=True
2026-06-04T05:26:05.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:26:05.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:26:05.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:26:05.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:26:05.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:26:05.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T05:26:05.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:26:12, diff=-6.319414s, valid=True
2026-06-04T05:26:05.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:26:05.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:26:05.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:26:05.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117762.6814s, valid=True
2026-06-04T05:26:05.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:26:05.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:26:05.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:26:05.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:26:05.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:26:05.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:26:05.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:26:05.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:26:05.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:26:05.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:26:05.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:26:05.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:26:06.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:26:06.074 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:26:06.287 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:26:06.635 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:26:06.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:26:06.738 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:26:06.739 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:26:06.958 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:26:06.958 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:26:36.989 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:26:36.989 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:26:36.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:26:37.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:26:37.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:26:37.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:26:37.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:26:37.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:26:37.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:26:37.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:26:37.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:26:37.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:26:37.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:26:40.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:26:40.266 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:26:40.267 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:26:40.267 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:26:40.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:26:40.291 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:26:40.291 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:26:40.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:26:40.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:26:40.292 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:26:40.293 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:26:40.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:26:40.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:26:40.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:26:40.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:26:40.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:26:40.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T05:26:40.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:26:40.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T05:26:40.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:26:40.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:26:40.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:26:40.636 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:26:40.707 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:26:14
2026-06-04T05:26:40.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88041, datetime.datetime(2026, 6, 4, 5, 26, 14), datetime.datetime(2026, 6, 4, 5, 26, 14), 'salt', 1.53, 100.74, None, 30.49, 141.92, -0.11, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:26:40.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:26:40.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:26:40.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:26:14, diff=26.714776s, valid=True
2026-06-04T05:26:40.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:26:40.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T05:26:40.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:26:12, diff=28.718267s, valid=True
2026-06-04T05:26:40.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:26:40.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:26:40.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:26:09, diff=31.726433s, valid=True
2026-06-04T05:26:40.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:26:40.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:26:40.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:26:40.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:26:40.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:26:40.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T05:26:40.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:26:12, diff=28.730199s, valid=True
2026-06-04T05:26:40.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:26:40.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:26:40.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:26:40.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117797.731025s, valid=True
2026-06-04T05:26:40.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:26:40.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:26:40.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:26:40.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:26:40.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:26:40.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:26:40.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:26:40.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:26:40.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:26:40.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:26:40.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:26:40.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:26:41.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:26:41.051 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:26:41.268 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:26:41.615 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:26:41.717 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:26:41.718 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:26:41.718 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:26:41.876 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:26:41.876 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:27:11.887 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:27:11.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:27:11.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:27:12.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:27:12.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:27:12.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:27:12.461 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:27:12.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:27:12.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:27:12.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:27:12.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:27:12.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:27:12.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:27:14.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:27:14.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:27:14.936 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:27:14.936 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:27:14.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:27:14.959 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:27:14.960 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:27:14.961 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:27:14.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:27:14.962 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:27:14.962 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:27:14.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:27:15.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-06-04T05:27:15.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:27:15.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-06-04T05:27:15.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:27:15.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:27:15.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:27:15.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:27:15.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:27:15.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:27:15.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:27:15.307 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:27:15.382 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:27:15
2026-06-04T05:27:15.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88043, datetime.datetime(2026, 6, 4, 5, 27, 15), datetime.datetime(2026, 6, 4, 5, 27, 14), 'salt', 1.57, 100.68, None, 33.52, 140.44, -0.09, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:27:15.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:27:15.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-06-04T05:27:15.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:27:14, diff=1.38969s, valid=True
2026-06-04T05:27:15.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:27:15.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:27:15.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:27:12, diff=3.393162s, valid=True
2026-06-04T05:27:15.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:27:15.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-06-04T05:27:15.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:27:09, diff=6.401416s, valid=True
2026-06-04T05:27:15.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:27:15.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:27:15.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:27:15.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:27:15.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:27:15.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:27:15.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:27:12, diff=3.405151s, valid=True
2026-06-04T05:27:15.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:27:15.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:27:15.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:27:15.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117832.405956s, valid=True
2026-06-04T05:27:15.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:27:15.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:27:15.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:27:15.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:27:15.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:27:15.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:27:15.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:27:15.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:27:15.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:27:15.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:27:15.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:27:15.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:27:15.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:27:15.796 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:27:16.007 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:27:16.353 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:27:16.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:27:16.455 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:27:16.455 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:27:16.705 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:27:16.705 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:27:46.718 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:27:46.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:27:46.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:27:47.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:27:47.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:27:47.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:27:47.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:27:47.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:27:47.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:27:47.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:27:47.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:27:47.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:27:47.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:27:49.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:27:49.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:27:49.944 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:27:49.944 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:27:49.951 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:27:49.963 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:27:49.963 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:27:49.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:27:49.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:27:49.964 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:27:49.964 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:27:49.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:27:50.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:27:50.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:27:50.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:27:50.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:27:50.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:27:50.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:27:50.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:27:50.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:27:50.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:27:50.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:27:50.251 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:27:50.324 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:27:45
2026-06-04T05:27:50.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88044, datetime.datetime(2026, 6, 4, 5, 27, 45), datetime.datetime(2026, 6, 4, 5, 27, 44), 'salt', 1.57, 100.71, None, 31.61, 135.81, -0.1, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:27:50.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:27:50.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:27:50.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:27:44, diff=6.330793s, valid=True
2026-06-04T05:27:50.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:27:50.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:27:50.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:28:12, diff=-21.666197s, valid=True
2026-06-04T05:27:50.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:27:50.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:27:50.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:27:39, diff=11.340943s, valid=True
2026-06-04T05:27:50.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:27:50.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:27:50.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:27:50.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:27:50.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:27:50.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:27:50.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:28:12, diff=-21.655822s, valid=True
2026-06-04T05:27:50.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:27:50.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:27:50.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:27:50.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117867.344893s, valid=True
2026-06-04T05:27:50.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:27:50.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:27:50.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:27:50.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:27:50.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:27:50.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:27:50.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:27:50.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:27:50.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:27:50.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:27:50.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:27:50.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:27:50.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:27:50.663 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:27:50.873 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:27:51.238 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:27:51.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:27:51.343 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:27:51.343 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:27:51.597 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:27:51.598 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:28:21.606 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:28:21.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:28:21.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:28:21.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:28:21.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:28:22.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:28:22.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:28:22.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:28:22.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:28:22.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:28:22.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:28:22.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:28:22.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:28:24.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:28:24.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:28:24.639 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:28:24.640 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:28:24.651 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:28:24.664 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:28:24.664 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:28:24.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:28:24.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:28:24.665 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:28:24.666 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:28:24.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:28:24.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:28:24.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:28:24.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:28:24.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:28:25.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:28:25.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:28:25.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:28:25.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:28:25.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:28:25.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:28:25.050 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:28:25.122 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:28:15
2026-06-04T05:28:25.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88045, datetime.datetime(2026, 6, 4, 5, 28, 15), datetime.datetime(2026, 6, 4, 5, 28, 15), 'salt', 1.57, 100.74, None, 34.79, 139.71, -0.1, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:28:25.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:28:25.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:28:25.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:28:15, diff=10.128526s, valid=True
2026-06-04T05:28:25.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:28:25.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:28:25.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:28:12, diff=13.131477s, valid=True
2026-06-04T05:28:25.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:28:25.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:28:25.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:28:10, diff=15.13834s, valid=True
2026-06-04T05:28:25.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:28:25.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:28:25.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:28:25.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:28:25.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:28:25.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:28:25.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:28:12, diff=13.141448s, valid=True
2026-06-04T05:28:25.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:28:25.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:28:25.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:28:25.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117902.14213s, valid=True
2026-06-04T05:28:25.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:28:25.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:28:25.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:28:25.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:28:25.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:28:25.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:28:25.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:28:25.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:28:25.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:28:25.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:28:25.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:28:25.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:28:25.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:28:25.456 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:28:25.666 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:28:26.010 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:28:26.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:28:26.115 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:28:26.115 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:28:26.299 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:28:26.299 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:28:56.322 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:28:56.322 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:28:56.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:28:56.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:28:56.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:28:56.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:28:56.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:28:56.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:28:56.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:28:56.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:28:56.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:28:56.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:28:56.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:28:59.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:28:59.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:28:59.377 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:28:59.377 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:28:59.388 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:28:59.400 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:28:59.401 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:28:59.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:28:59.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:28:59.402 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:28:59.402 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:28:59.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:28:59.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:28:59.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:28:59.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:28:59.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:28:59.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:28:59.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:28:59.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:28:59.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:28:59.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:28:59.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:28:59.807 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:28:59.924 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:28:46
2026-06-04T05:28:59.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88046, datetime.datetime(2026, 6, 4, 5, 28, 46), datetime.datetime(2026, 6, 4, 5, 28, 45), 'salt', 1.53, 100.64, None, 29.18, 138.25, -0.09, 821.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:28:59.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:28:59.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:28:59.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:28:45, diff=14.930924s, valid=True
2026-06-04T05:28:59.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:28:59.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:28:59.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:29:12, diff=-12.066158s, valid=True
2026-06-04T05:28:59.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:28:59.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:28:59.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:28:40, diff=19.941573s, valid=True
2026-06-04T05:28:59.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:28:59.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:28:59.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:28:59.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:28:59.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:28:59.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:28:59.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:29:12, diff=-12.054999s, valid=True
2026-06-04T05:28:59.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:28:59.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:28:59.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:28:59.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117936.945709s, valid=True
2026-06-04T05:28:59.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:28:59.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:28:59.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:28:59.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:28:59.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:29:00.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:29:00.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:29:00.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:29:00.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:29:00.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:29:00.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:29:00.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:29:00.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:29:00.277 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:29:00.488 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:29:00.893 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:29:00.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:29:00.994 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:29:00.994 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:29:01.147 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:29:01.147 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:29:31.177 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:29:31.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:29:31.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:29:31.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:29:31.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:29:31.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:29:31.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:29:31.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:29:31.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:29:31.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:29:31.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:29:31.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:29:31.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:29:34.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:29:34.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:29:34.076 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:29:34.076 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:29:34.087 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:29:34.100 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:29:34.100 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:29:34.101 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:29:34.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:29:34.101 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:29:34.102 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:29:34.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:29:34.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:29:34.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:29:34.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:29:34.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:29:34.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:29:34.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:29:34.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:29:34.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:29:34.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:29:34.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:29:34.443 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:29:34.528 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:29:16
2026-06-04T05:29:34.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88047, datetime.datetime(2026, 6, 4, 5, 29, 16), datetime.datetime(2026, 6, 4, 5, 29, 16), 'salt', 1.6, 100.74, None, 29.22, 136.42, -0.11, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:29:34.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:29:34.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:29:34.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:29:16, diff=18.535434s, valid=True
2026-06-04T05:29:34.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:29:34.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:29:34.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:29:12, diff=22.538923s, valid=True
2026-06-04T05:29:34.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:29:34.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:29:34.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:29:10, diff=24.547123s, valid=True
2026-06-04T05:29:34.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:29:34.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:29:34.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:29:34.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:29:34.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:29:34.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:29:34.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:29:12, diff=22.550895s, valid=True
2026-06-04T05:29:34.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:29:34.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:29:34.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:29:34.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=117971.551724s, valid=True
2026-06-04T05:29:34.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:29:34.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:29:34.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:29:34.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:29:34.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:29:34.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:29:34.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:29:34.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:29:34.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:29:34.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:29:34.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:29:34.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:29:34.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:29:34.870 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:29:35.081 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:29:35.426 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:29:35.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:29:35.529 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:29:35.529 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:29:35.785 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:29:35.786 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:30:05.815 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:30:05.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:30:05.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:30:05.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:30:05.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:30:06.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:30:06.199 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:30:06.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:30:06.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:30:06.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:30:06.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:30:06.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:30:06.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:30:08.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:30:08.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:30:08.656 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:30:08.656 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:30:08.667 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:30:08.679 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:30:08.680 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:30:08.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:30:08.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:30:08.681 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:30:08.681 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:30:08.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:30:08.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:30:08.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:30:08.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:30:08.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:30:09.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:30:09.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:30:09.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:30:09.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:30:09.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:30:09.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:30:09.066 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:30:09.137 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:29:47
2026-06-04T05:30:09.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88048, datetime.datetime(2026, 6, 4, 5, 29, 47), datetime.datetime(2026, 6, 4, 5, 29, 46), 'salt', 1.53, 100.68, None, 21.56, 150.0, -0.1, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:30:09.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:30:09.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:30:09.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:29:46, diff=23.145061s, valid=True
2026-06-04T05:30:09.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:30:09.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:30:09.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:30:12, diff=-2.851325s, valid=True
2026-06-04T05:30:09.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:30:09.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:30:09.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:29:41, diff=28.157207s, valid=True
2026-06-04T05:30:09.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:30:09.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:30:09.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:30:09.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:30:09.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:30:09.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:30:09.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:30:12, diff=-2.838933s, valid=True
2026-06-04T05:30:09.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:30:09.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:30:09.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:30:09.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118006.161915s, valid=True
2026-06-04T05:30:09.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:30:09.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:30:09.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:30:09.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:30:09.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:30:09.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:30:09.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:30:09.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:30:09.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:30:09.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:30:09.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:30:09.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:30:09.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:30:09.558 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:30:09.769 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:30:10.136 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:30:10.240 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:30:10.240 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:30:10.240 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:30:10.472 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:30:10.472 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:30:40.495 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:30:40.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:30:40.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:30:40.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:30:40.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:30:40.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:30:40.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:30:40.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:30:40.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:30:40.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:30:40.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:30:40.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:30:40.926 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:30:43.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:30:43.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:30:43.351 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:30:43.351 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:30:43.362 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:30:43.375 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:30:43.375 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:30:43.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:30:43.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:30:43.376 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:30:43.377 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:30:43.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:30:43.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:30:43.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:30:43.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:30:43.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:30:43.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:30:43.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:30:43.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:30:43.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:30:43.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:30:43.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:30:43.714 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:30:43.792 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:30:17
2026-06-04T05:30:43.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88049, datetime.datetime(2026, 6, 4, 5, 30, 17), datetime.datetime(2026, 6, 4, 5, 30, 16), 'salt', 1.57, 100.71, None, 30.91, 152.54, -0.1, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:30:43.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:30:43.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:30:43.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:30:16, diff=27.800096s, valid=True
2026-06-04T05:30:43.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:30:43.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:30:43.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:30:12, diff=31.803586s, valid=True
2026-06-04T05:30:43.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:30:43.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:30:43.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:30:11, diff=32.811752s, valid=True
2026-06-04T05:30:43.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:30:43.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:30:43.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:30:43.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:30:43.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:30:43.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:30:43.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:30:12, diff=31.815461s, valid=True
2026-06-04T05:30:43.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:30:43.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:30:43.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:30:43.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118040.816276s, valid=True
2026-06-04T05:30:43.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:30:43.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:30:43.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:30:43.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:30:43.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:30:43.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:30:43.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:30:43.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:30:43.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:30:43.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:30:44.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:30:44.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:30:44.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:30:44.138 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:30:44.353 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:30:44.699 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:30:44.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:30:44.803 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:30:44.803 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:30:44.992 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:30:44.992 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:31:15.000 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:31:15.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:31:15.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:31:15.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:31:15.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:31:15.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:31:15.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:31:15.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:31:15.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:31:15.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:31:15.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:31:15.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:31:15.437 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:31:17.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:31:17.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:31:17.769 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:31:17.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:31:17.780 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:31:17.796 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:31:17.796 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:31:17.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:31:17.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:31:17.797 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:31:17.797 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:31:17.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:31:17.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-06-04T05:31:17.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:31:18.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-06-04T05:31:18.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:31:18.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:31:18.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:31:18.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:31:18.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:31:18.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:31:18.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:31:18.145 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:31:18.219 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:31:18
2026-06-04T05:31:18.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88051, datetime.datetime(2026, 6, 4, 5, 31, 18), datetime.datetime(2026, 6, 4, 5, 31, 17), 'salt', 1.57, 100.74, None, 26.0, 153.24, -0.1, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:31:18.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:31:18.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-06-04T05:31:18.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:31:17, diff=1.226593s, valid=True
2026-06-04T05:31:18.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:31:18.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:31:18.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:31:12, diff=6.230122s, valid=True
2026-06-04T05:31:18.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:31:18.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-06-04T05:31:18.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:31:11, diff=7.238509s, valid=True
2026-06-04T05:31:18.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:31:18.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:31:18.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:31:18.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:31:18.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:31:18.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:31:18.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:31:12, diff=6.242313s, valid=True
2026-06-04T05:31:18.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:31:18.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:31:18.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:31:18.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118075.243143s, valid=True
2026-06-04T05:31:18.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:31:18.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:31:18.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:31:18.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:31:18.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:31:18.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:31:18.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:31:18.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:31:18.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:31:18.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:31:18.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:31:18.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:31:18.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:31:18.638 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:31:18.853 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:31:19.202 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:31:19.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:31:19.305 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:31:19.306 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:31:19.533 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:31:19.533 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:31:49.550 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:31:49.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:31:49.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:31:49.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:31:49.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:31:49.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:31:49.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:31:49.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:31:49.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:31:49.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:31:49.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:31:49.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:31:49.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:31:52.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:31:52.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:31:52.422 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:31:52.422 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:31:52.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:31:52.445 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:31:52.446 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:31:52.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:31:52.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:31:52.447 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:31:52.447 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:31:52.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:31:52.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:31:52.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:31:52.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:31:52.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:31:52.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:31:52.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:31:52.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:31:52.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:31:52.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:31:52.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:31:52.790 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:31:52.861 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:31:48
2026-06-04T05:31:52.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88052, datetime.datetime(2026, 6, 4, 5, 31, 48), datetime.datetime(2026, 6, 4, 5, 31, 47), 'salt', 1.5, 100.68, None, 27.63, 154.82, -0.1, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:31:52.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:31:52.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:31:52.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:31:47, diff=5.868888s, valid=True
2026-06-04T05:31:52.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:31:52.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:31:52.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:32:12, diff=-19.127589s, valid=True
2026-06-04T05:31:52.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:31:52.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:31:52.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:31:42, diff=10.880641s, valid=True
2026-06-04T05:31:52.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:31:52.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:31:52.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:31:52.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:31:52.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:31:52.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:31:52.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:32:12, diff=-19.115653s, valid=True
2026-06-04T05:31:52.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:31:52.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:31:52.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:31:52.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118109.885182s, valid=True
2026-06-04T05:31:52.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:31:52.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:31:52.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:31:52.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:31:52.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:31:52.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:31:52.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:31:52.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:31:52.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:31:53.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:31:53.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:31:53.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:31:53.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:31:53.207 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:31:53.418 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:31:53.763 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:31:53.865 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:31:53.865 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:31:53.865 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:31:54.109 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:31:54.109 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:32:24.110 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:32:24.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:32:24.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:32:24.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:32:24.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:32:24.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:32:24.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:32:24.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:32:24.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:32:24.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:32:24.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:32:24.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:32:24.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:32:27.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:32:27.213 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:32:27.213 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:32:27.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:32:27.225 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:32:27.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:32:27.239 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:32:27.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:32:27.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:32:27.240 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:32:27.240 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:32:27.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:32:27.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:32:27.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:32:27.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:32:27.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:32:27.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:32:27.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:32:27.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:32:27.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:32:27.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:32:27.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:32:27.629 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:32:27.698 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:32:18
2026-06-04T05:32:27.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88053, datetime.datetime(2026, 6, 4, 5, 32, 18), datetime.datetime(2026, 6, 4, 5, 32, 17), 'salt', 1.43, 100.64, None, 34.58, 149.46, -0.1, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:32:27.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:32:27.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:32:27.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:32:17, diff=10.70441s, valid=True
2026-06-04T05:32:27.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:32:27.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:32:27.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:32:12, diff=15.707198s, valid=True
2026-06-04T05:32:27.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:32:27.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:32:27.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:32:12, diff=15.713788s, valid=True
2026-06-04T05:32:27.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:32:27.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:32:27.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:32:27.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:32:27.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:32:27.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:32:27.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:32:12, diff=15.716762s, valid=True
2026-06-04T05:32:27.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:32:27.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:32:27.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:32:27.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118144.717393s, valid=True
2026-06-04T05:32:27.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:32:27.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:32:27.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:32:27.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:32:27.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:32:27.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:32:27.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:32:27.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:32:27.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:32:27.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:32:27.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:32:27.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:32:27.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:32:28.031 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:32:28.242 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:32:28.589 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:32:28.690 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:32:28.690 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:32:28.690 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:32:28.875 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:32:28.875 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:32:58.879 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:32:58.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:32:58.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:32:59.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:32:59.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:32:59.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:32:59.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:32:59.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:32:59.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:32:59.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:32:59.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:32:59.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:32:59.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:33:01.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:33:01.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:33:01.898 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:33:01.899 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:33:01.907 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:33:01.919 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:33:01.919 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:33:01.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:33:01.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:33:01.919 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:33:01.920 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:33:01.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:33:02.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:33:02.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:33:02.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:33:02.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:33:02.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:33:02.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:33:02.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:33:02.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:33:02.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:33:02.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:33:02.217 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:33:02.289 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:32:49
2026-06-04T05:33:02.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88054, datetime.datetime(2026, 6, 4, 5, 32, 49), datetime.datetime(2026, 6, 4, 5, 32, 48), 'salt', 1.4, 100.61, None, 33.73, 156.22, -0.09, 821.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:33:02.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:33:02.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:33:02.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:32:48, diff=14.296456s, valid=True
2026-06-04T05:33:02.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:33:02.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:33:02.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:33:12, diff=-9.700135s, valid=True
2026-06-04T05:33:02.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:33:02.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:33:02.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:32:42, diff=20.307722s, valid=True
2026-06-04T05:33:02.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:33:02.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:33:02.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:33:02.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:33:02.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:33:02.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:33:02.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:33:12, diff=-9.688612s, valid=True
2026-06-04T05:33:02.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:33:02.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:33:02.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:33:02.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118179.312168s, valid=True
2026-06-04T05:33:02.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:33:02.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:33:02.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:33:02.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:33:02.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:33:02.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:33:02.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:33:02.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:33:02.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:33:02.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:33:02.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:33:02.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:33:02.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:33:02.636 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:33:02.851 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:33:03.265 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:33:03.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:33:03.367 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:33:03.367 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:33:03.546 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:33:03.546 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:33:33.576 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:33:33.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:33:33.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:33:33.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:33:33.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:33:33.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:33:33.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:33:33.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:33:33.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:33:34.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:33:34.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:33:34.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:33:34.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:33:36.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:33:36.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:33:36.705 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:33:36.705 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:33:36.718 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:33:36.730 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:33:36.731 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:33:36.731 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:33:36.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:33:36.732 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:33:36.732 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:33:36.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:33:36.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:33:36.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:33:36.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:33:36.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:33:37.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:33:37.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:33:37.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:33:37.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:33:37.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:33:37.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:33:37.064 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:33:37.135 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:33:19
2026-06-04T05:33:37.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88055, datetime.datetime(2026, 6, 4, 5, 33, 19), datetime.datetime(2026, 6, 4, 5, 33, 18), 'salt', 1.5, 100.71, None, 35.67, 148.8, -0.1, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:33:37.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:33:37.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:33:37.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:33:18, diff=19.143335s, valid=True
2026-06-04T05:33:37.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:33:37.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:33:37.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:33:12, diff=25.146856s, valid=True
2026-06-04T05:33:37.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:33:37.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:33:37.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:33:12, diff=25.155062s, valid=True
2026-06-04T05:33:37.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:33:37.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:33:37.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:33:37.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:33:37.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:33:37.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:33:37.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:33:12, diff=25.158777s, valid=True
2026-06-04T05:33:37.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:33:37.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:33:37.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:33:37.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118214.1596s, valid=True
2026-06-04T05:33:37.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:33:37.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:33:37.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:33:37.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:33:37.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:33:37.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:33:37.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:33:37.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:33:37.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:33:37.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:33:37.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:33:37.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:33:37.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:33:37.479 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:33:37.689 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:33:38.035 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:33:38.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:33:38.138 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:33:38.138 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:33:38.568 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:33:38.569 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:34:08.574 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:34:08.574 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:34:08.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:34:08.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:34:08.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:34:08.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:34:08.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:34:09.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:34:09.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:34:09.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:34:09.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:34:09.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:34:09.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:34:11.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:34:11.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:34:11.435 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:34:11.435 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:34:11.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:34:11.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:34:11.460 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:34:11.460 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:34:11.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:34:11.461 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:34:11.461 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:34:11.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:34:11.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:34:11.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:34:11.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:34:11.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:34:11.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:34:11.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:34:11.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:34:11.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:34:11.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:34:11.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:34:11.765 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:34:11.836 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:33:49
2026-06-04T05:34:11.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88056, datetime.datetime(2026, 6, 4, 5, 33, 49), datetime.datetime(2026, 6, 4, 5, 33, 49), 'salt', 1.5, 100.68, None, 27.91, 143.07, -0.1, 821.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:34:11.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:34:11.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:34:11.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:33:49, diff=22.844938s, valid=True
2026-06-04T05:34:11.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:34:11.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:34:11.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:34:12, diff=-0.150272s, valid=True
2026-06-04T05:34:11.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:34:11.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:34:11.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:33:42, diff=29.862067s, valid=True
2026-06-04T05:34:11.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:34:11.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:34:11.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:34:11.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:34:11.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:34:11.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:34:11.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:34:12, diff=-0.132981s, valid=True
2026-06-04T05:34:11.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:34:11.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:34:11.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:34:11.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118248.868263s, valid=True
2026-06-04T05:34:11.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:34:11.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:34:11.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:34:11.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:34:11.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:34:11.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:34:11.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:34:11.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:34:11.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:34:12.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:34:12.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:34:12.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:34:12.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:34:12.282 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:34:12.492 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:34:12.836 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:34:12.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:34:12.938 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:34:12.938 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:34:13.181 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:34:13.182 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:34:43.185 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:34:43.185 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:34:43.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:34:43.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:34:43.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:34:43.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:34:43.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:34:43.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:34:43.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:34:43.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:34:43.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:34:43.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:34:43.634 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:34:46.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:34:46.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:34:46.076 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:34:46.076 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:34:46.088 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:34:46.101 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:34:46.102 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:34:46.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:34:46.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:34:46.103 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:34:46.103 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:34:46.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:34:46.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:34:46.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:34:46.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:34:46.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:34:46.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:34:46.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:34:46.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:34:46.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:34:46.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:34:46.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:34:46.447 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:34:46.519 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:34:20
2026-06-04T05:34:46.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88057, datetime.datetime(2026, 6, 4, 5, 34, 20), datetime.datetime(2026, 6, 4, 5, 34, 19), 'salt', 1.47, 100.68, None, 29.57, 139.48, -0.09, 821.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:34:46.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:34:46.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:34:46.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:34:19, diff=27.526632s, valid=True
2026-06-04T05:34:46.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:34:46.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:34:46.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:34:12, diff=34.529895s, valid=True
2026-06-04T05:34:46.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:34:46.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:34:46.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:34:13, diff=33.537472s, valid=True
2026-06-04T05:34:46.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:34:46.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:34:46.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:34:46.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:34:46.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:34:46.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:34:46.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:34:12, diff=34.540954s, valid=True
2026-06-04T05:34:46.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:34:46.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:34:46.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:34:46.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118283.541714s, valid=True
2026-06-04T05:34:46.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:34:46.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:34:46.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:34:46.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:34:46.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:34:46.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:34:46.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:34:46.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:34:46.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:34:46.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:34:46.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:34:46.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:34:46.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:34:46.860 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:34:47.072 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:34:47.430 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:34:47.532 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:34:47.532 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:34:47.532 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:34:47.741 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:34:47.741 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:35:17.771 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:35:17.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:35:17.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:35:17.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:35:17.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:35:18.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:35:18.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:35:18.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:35:18.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:35:18.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:35:18.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:35:18.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:35:18.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:35:20.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:35:20.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:35:20.509 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:35:20.509 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:35:20.521 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:35:20.534 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:35:20.534 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:35:20.535 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:35:20.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:35:20.535 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:35:20.536 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:35:20.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:35:20.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:35:20.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:35:20.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:35:20.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:35:20.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:35:20.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:35:20.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:35:20.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:35:20.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:35:20.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:35:20.875 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:35:20.946 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:35:20
2026-06-04T05:35:20.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88059, datetime.datetime(2026, 6, 4, 5, 35, 20), datetime.datetime(2026, 6, 4, 5, 35, 20), 'salt', 1.53, 100.61, None, 31.12, 138.82, -0.09, 821.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:35:20.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:35:20.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:35:20.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:35:20, diff=0.953915s, valid=True
2026-06-04T05:35:20.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:35:20.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:35:20.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:35:12, diff=8.957394s, valid=True
2026-06-04T05:35:20.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:35:20.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:35:20.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:35:13, diff=7.965648s, valid=True
2026-06-04T05:35:20.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:35:20.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:35:20.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:35:20.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:35:20.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:35:20.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:35:20.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:35:12, diff=8.969366s, valid=True
2026-06-04T05:35:20.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:35:20.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:35:20.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:35:20.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118317.970198s, valid=True
2026-06-04T05:35:20.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:35:20.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:35:20.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:35:20.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:35:20.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:35:21.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:35:21.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:35:21.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:35:21.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:35:21.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:35:21.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:35:21.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:35:21.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:35:21.361 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:35:21.590 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:35:21.940 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:35:22.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:35:22.043 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:35:22.043 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:35:22.258 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:35:22.258 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:35:52.288 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:35:52.289 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:35:52.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:35:52.601 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:35:52.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:35:52.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:35:52.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:35:52.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:35:52.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:35:52.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:35:52.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:35:52.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:35:52.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:35:55.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:35:55.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:35:55.179 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:35:55.180 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:35:55.189 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:35:55.202 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:35:55.202 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:35:55.203 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:35:55.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:35:55.204 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:35:55.204 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:35:55.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:35:55.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:35:55.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:35:55.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:35:55.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:35:55.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:35:55.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:35:55.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:35:55.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:35:55.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:35:55.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:35:55.539 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:35:55.611 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:35:51
2026-06-04T05:35:55.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88060, datetime.datetime(2026, 6, 4, 5, 35, 51), datetime.datetime(2026, 6, 4, 5, 35, 50), 'salt', 1.57, 100.68, None, 38.18, 134.64, -0.09, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:35:55.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:35:55.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:35:55.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:35:50, diff=5.618742s, valid=True
2026-06-04T05:35:55.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:35:55.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:35:55.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:36:12, diff=-16.377779s, valid=True
2026-06-04T05:35:55.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:35:55.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:35:55.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:35:44, diff=11.63046s, valid=True
2026-06-04T05:35:55.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:35:55.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:35:55.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:35:55.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:35:55.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:35:55.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:35:55.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:36:12, diff=-16.365725s, valid=True
2026-06-04T05:35:55.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:35:55.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:35:55.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:35:55.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118352.635094s, valid=True
2026-06-04T05:35:55.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:35:55.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:35:55.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:35:55.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:35:55.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:35:55.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:35:55.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:35:55.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:35:55.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:35:55.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:35:55.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:35:55.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:35:55.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:35:55.955 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:35:56.165 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:35:56.510 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:35:56.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:35:56.614 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:35:56.614 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:35:57.139 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:35:57.139 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:36:27.155 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:36:27.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:36:27.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:36:27.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:36:27.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:36:27.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:36:27.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:36:27.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:36:27.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:36:27.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:36:27.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:36:27.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:36:27.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:36:29.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:36:29.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:36:29.975 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:36:29.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:36:29.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:36:29.998 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:36:29.998 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:36:29.998 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:36:29.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:36:29.998 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:36:29.998 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:36:30.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:36:30.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:36:30.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:36:30.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:36:30.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:36:30.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:36:30.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:36:30.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:36:30.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:36:30.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:36:30.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:36:30.371 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:36:30.442 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:36:21
2026-06-04T05:36:30.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88061, datetime.datetime(2026, 6, 4, 5, 36, 21), datetime.datetime(2026, 6, 4, 5, 36, 20), 'salt', 1.53, 100.68, None, 37.79, 136.37, -0.1, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:36:30.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:36:30.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:36:30.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:36:20, diff=10.44815s, valid=True
2026-06-04T05:36:30.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:36:30.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:36:30.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:36:12, diff=18.450926s, valid=True
2026-06-04T05:36:30.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:36:30.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:36:30.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:36:14, diff=16.45738s, valid=True
2026-06-04T05:36:30.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:36:30.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:36:30.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:36:30.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:36:30.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:36:30.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:36:30.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:36:12, diff=18.460336s, valid=True
2026-06-04T05:36:30.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:36:30.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:36:30.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:36:30.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118387.460984s, valid=True
2026-06-04T05:36:30.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:36:30.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:36:30.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:36:30.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:36:30.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:36:30.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:36:30.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:36:30.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:36:30.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:36:30.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:36:30.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:36:30.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:36:30.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:36:30.774 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:36:30.987 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:36:31.338 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:36:31.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:36:31.441 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:36:31.441 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:36:31.643 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:36:31.643 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:37:01.673 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:37:01.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:37:01.674 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:37:02.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:37:02.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:37:02.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:37:02.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:37:02.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:37:02.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:37:02.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:37:02.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:37:02.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:37:02.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:37:05.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:37:05.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:37:05.092 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:37:05.092 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:37:05.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:37:05.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:37:05.117 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:37:05.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:37:05.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:37:05.118 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:37:05.118 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:37:05.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:37:05.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:37:05.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:37:05.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:37:05.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:37:05.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:37:05.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:37:05.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:37:05.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:37:05.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:37:05.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:37:05.450 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:37:05.523 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:36:51
2026-06-04T05:37:05.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88062, datetime.datetime(2026, 6, 4, 5, 36, 51), datetime.datetime(2026, 6, 4, 5, 36, 51), 'salt', 1.5, 100.74, None, 28.02, 151.83, -0.11, 821.11, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:37:05.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:37:05.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:37:05.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:36:51, diff=14.530817s, valid=True
2026-06-04T05:37:05.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:37:05.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:37:05.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:37:12, diff=-6.465703s, valid=True
2026-06-04T05:37:05.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:37:05.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:37:05.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:36:44, diff=21.542349s, valid=True
2026-06-04T05:37:05.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:37:05.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:37:05.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:37:05.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:37:05.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:37:05.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:37:05.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:37:12, diff=-6.453927s, valid=True
2026-06-04T05:37:05.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:37:05.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:37:05.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:37:05.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118422.546887s, valid=True
2026-06-04T05:37:05.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:37:05.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:37:05.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:37:05.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:37:05.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:37:05.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:37:05.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:37:05.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:37:05.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:37:05.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:37:05.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:37:05.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:37:05.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:37:05.865 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:37:06.066 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:37:06.457 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:37:06.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:37:06.557 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:37:06.557 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:37:06.738 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:37:06.739 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:37:36.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:37:36.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:37:36.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:37:36.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:37:36.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:37:37.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:37:37.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:37:37.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:37:37.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:37:37.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:37:37.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:37:37.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:37:37.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:37:39.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:37:39.715 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:37:39.716 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:37:39.717 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:37:39.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:37:39.740 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:37:39.741 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:37:39.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:37:39.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:37:39.742 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:37:39.742 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:37:39.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:37:39.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:37:39.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:37:39.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:37:39.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:37:40.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:37:40.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:37:40.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:37:40.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:37:40.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:37:40.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:37:40.055 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:37:40.124 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:37:22
2026-06-04T05:37:40.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88063, datetime.datetime(2026, 6, 4, 5, 37, 22), datetime.datetime(2026, 6, 4, 5, 37, 21), 'salt', 1.5, 100.68, None, 30.03, 133.56, -0.1, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:37:40.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:37:40.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:37:40.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:37:21, diff=19.130913s, valid=True
2026-06-04T05:37:40.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:37:40.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:37:40.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:37:12, diff=28.133808s, valid=True
2026-06-04T05:37:40.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:37:40.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:37:40.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:37:15, diff=25.14103s, valid=True
2026-06-04T05:37:40.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:37:40.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:37:40.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:37:40.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:37:40.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:37:40.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:37:40.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:37:12, diff=28.144421s, valid=True
2026-06-04T05:37:40.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:37:40.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:37:40.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:37:40.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118457.145168s, valid=True
2026-06-04T05:37:40.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:37:40.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:37:40.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:37:40.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:37:40.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:37:40.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:37:40.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:37:40.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:37:40.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:37:40.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:37:40.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:37:40.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:37:40.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:37:40.462 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:37:40.665 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:37:41.016 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:37:41.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:37:41.117 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:37:41.117 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:37:41.204 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:37:41.204 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:38:11.234 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:38:11.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:38:11.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:38:11.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:38:11.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:38:11.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:38:11.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:38:11.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:38:11.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:38:11.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:38:11.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:38:11.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:38:11.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:38:14.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:38:14.525 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:38:14.526 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:38:14.526 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:38:14.538 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:38:14.551 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:38:14.551 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:38:14.552 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:38:14.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:38:14.552 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:38:14.553 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:38:14.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:38:14.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:38:14.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:38:14.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:38:14.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:38:14.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:38:14.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:38:14.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:38:14.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:38:14.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:38:14.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:38:14.891 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:38:14.963 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:37:52
2026-06-04T05:38:14.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88064, datetime.datetime(2026, 6, 4, 5, 37, 52), datetime.datetime(2026, 6, 4, 5, 37, 51), 'salt', 1.5, 100.71, None, 31.72, 143.02, -0.1, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:38:14.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:38:14.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:38:14.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:37:51, diff=23.97135s, valid=True
2026-06-04T05:38:14.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:38:14.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:38:14.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:38:12, diff=2.974869s, valid=True
2026-06-04T05:38:14.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:38:14.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:38:14.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:37:45, diff=29.983032s, valid=True
2026-06-04T05:38:14.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:38:14.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:38:14.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:38:14.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:38:14.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:38:14.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:38:14.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:38:12, diff=2.986779s, valid=True
2026-06-04T05:38:14.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:38:14.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:38:14.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:38:14.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118491.987586s, valid=True
2026-06-04T05:38:14.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:38:14.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:38:14.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:38:14.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:38:14.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:38:15.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:38:15.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:38:15.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:38:15.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:38:15.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:38:15.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:38:15.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:38:15.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:38:15.311 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:38:15.591 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:38:15.950 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:38:16.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:38:16.053 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:38:16.053 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:38:16.138 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:38:16.138 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:38:46.142 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:38:46.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:38:46.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:38:46.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:38:46.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:38:46.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:38:46.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:38:46.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:38:46.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:38:46.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:38:46.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:38:46.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:38:46.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:38:49.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:38:49.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:38:49.328 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:38:49.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:38:49.338 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:38:49.350 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:38:49.351 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:38:49.351 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:38:49.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:38:49.352 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:38:49.352 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:38:49.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:38:49.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:38:49.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:38:49.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:38:49.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:38:49.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:38:49.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:38:49.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:38:49.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:38:49.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:38:49.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:38:49.701 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:38:49.777 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:38:22
2026-06-04T05:38:49.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88065, datetime.datetime(2026, 6, 4, 5, 38, 22), datetime.datetime(2026, 6, 4, 5, 38, 21), 'salt', 1.47, 100.68, None, 35.74, 135.46, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:38:49.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:38:49.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:38:49.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:38:21, diff=28.784987s, valid=True
2026-06-04T05:38:49.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:38:49.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:38:49.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:38:12, diff=37.788445s, valid=True
2026-06-04T05:38:49.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:38:49.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:38:49.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:38:15, diff=34.796545s, valid=True
2026-06-04T05:38:49.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:38:49.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:38:49.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:38:49.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:38:49.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:38:49.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:38:49.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:38:12, diff=37.800378s, valid=True
2026-06-04T05:38:49.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:38:49.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:38:49.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:38:49.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118526.801212s, valid=True
2026-06-04T05:38:49.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:38:49.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:38:49.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:38:49.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:38:49.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:38:49.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:38:49.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:38:49.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:38:49.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:38:49.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:38:50.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:38:50.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:38:50.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:38:50.137 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:38:50.340 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:38:50.676 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:38:50.778 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:38:50.778 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:38:50.778 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:38:50.916 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:38:50.916 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:39:20.928 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:39:20.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:39:20.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:39:21.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:39:21.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:39:21.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:39:21.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:39:21.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:39:21.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:39:21.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:39:21.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:39:21.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:39:21.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:39:24.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:39:24.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:39:24.138 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:39:24.138 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:39:24.149 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:39:24.161 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:39:24.162 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:39:24.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:39:24.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:39:24.163 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:39:24.163 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:39:24.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:39:24.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:39:24.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:39:24.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:39:24.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:39:24.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:39:24.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:39:24.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:39:24.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:39:24.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:39:24.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:39:24.518 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:39:24.596 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:39:23
2026-06-04T05:39:24.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88067, datetime.datetime(2026, 6, 4, 5, 39, 23), datetime.datetime(2026, 6, 4, 5, 39, 22), 'salt', 1.4, 100.64, None, 26.5, 139.05, -0.09, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:39:24.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:39:24.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:39:24.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:39:22, diff=2.604024s, valid=True
2026-06-04T05:39:24.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:39:24.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:39:24.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:39:12, diff=12.607551s, valid=True
2026-06-04T05:39:24.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:39:24.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:39:24.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:39:16, diff=8.615821s, valid=True
2026-06-04T05:39:24.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:39:24.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:39:24.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:39:24.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:39:24.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:39:24.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:39:24.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:39:12, diff=12.619589s, valid=True
2026-06-04T05:39:24.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:39:24.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:39:24.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:39:24.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118561.620418s, valid=True
2026-06-04T05:39:24.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:39:24.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:39:24.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:39:24.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:39:24.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:39:24.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:39:24.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:39:24.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:39:24.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:39:24.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:39:24.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:39:24.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:39:24.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:39:25.018 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:39:25.221 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:39:25.559 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:39:25.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:39:25.659 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:39:25.659 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:39:25.903 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:39:25.903 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:39:55.916 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:39:55.916 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:39:55.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:39:56.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:39:56.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:39:56.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:39:56.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:39:56.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:39:56.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:39:56.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:39:56.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:39:56.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:39:56.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:39:58.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:39:58.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:39:58.622 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:39:58.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:39:58.633 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:39:58.646 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:39:58.646 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:39:58.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:39:58.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:39:58.647 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:39:58.648 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:39:58.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:39:58.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:39:58.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:39:58.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:39:58.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:39:58.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:39:58.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:39:58.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:39:58.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:39:58.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:39:58.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:39:58.995 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:39:59.074 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:39:53
2026-06-04T05:39:59.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88068, datetime.datetime(2026, 6, 4, 5, 39, 53), datetime.datetime(2026, 6, 4, 5, 39, 52), 'salt', 1.53, 100.74, None, 37.4, 149.48, -0.11, 820.87, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:39:59.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:39:59.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:39:59.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:39:52, diff=7.081985s, valid=True
2026-06-04T05:39:59.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:39:59.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:39:59.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:40:12, diff=-12.914665s, valid=True
2026-06-04T05:39:59.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:39:59.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:39:59.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:39:46, diff=13.093072s, valid=True
2026-06-04T05:39:59.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:39:59.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:39:59.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:39:59.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:39:59.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:39:59.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:39:59.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:40:12, diff=-12.903354s, valid=True
2026-06-04T05:39:59.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:39:59.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:39:59.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:39:59.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118596.097413s, valid=True
2026-06-04T05:39:59.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:39:59.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:39:59.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:39:59.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:39:59.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:39:59.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:39:59.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:39:59.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:39:59.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:39:59.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:39:59.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:39:59.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:39:59.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:39:59.416 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:39:59.618 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:39:59.976 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:40:00.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:40:00.094 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:40:00.094 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:40:00.367 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:40:00.367 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:40:30.374 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:40:30.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:40:30.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:40:30.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:40:30.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:40:30.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:40:30.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:40:30.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:40:30.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:40:30.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:40:30.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:40:30.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:40:30.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:40:33.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:40:33.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:40:33.679 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:40:33.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:40:33.689 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:40:33.710 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:40:33.711 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:40:33.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:40:33.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:40:33.712 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:40:33.712 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:40:33.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:40:33.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:40:33.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:40:33.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:40:33.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:40:33.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:40:33.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:40:34.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:40:34.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:40:34.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:40:34.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:40:34.045 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:40:34.122 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:40:23
2026-06-04T05:40:34.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88069, datetime.datetime(2026, 6, 4, 5, 40, 23), datetime.datetime(2026, 6, 4, 5, 40, 22), 'salt', 1.43, 100.64, None, 33.77, 147.13, -0.1, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:40:34.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:40:34.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:40:34.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:40:22, diff=12.131692s, valid=True
2026-06-04T05:40:34.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:40:34.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:40:34.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:40:12, diff=22.138095s, valid=True
2026-06-04T05:40:34.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:40:34.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:40:34.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:40:16, diff=18.146261s, valid=True
2026-06-04T05:40:34.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:40:34.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:40:34.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:40:34.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:40:34.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:40:34.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:40:34.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:40:12, diff=22.150047s, valid=True
2026-06-04T05:40:34.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:40:34.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:40:34.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:40:34.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118631.150874s, valid=True
2026-06-04T05:40:34.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:40:34.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:40:34.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:40:34.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:40:34.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:40:34.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:40:34.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:40:34.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:40:34.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:40:34.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:40:34.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:40:34.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:40:34.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:40:34.544 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:40:34.752 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:40:35.094 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:40:35.198 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:40:35.198 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:40:35.198 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:40:35.397 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:40:35.397 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:41:05.409 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:41:05.409 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:41:05.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:41:05.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:41:05.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:41:05.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:41:05.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:41:05.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:41:05.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:41:05.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:41:05.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:41:06.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:41:06.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:41:08.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:41:08.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:41:08.608 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:41:08.609 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:41:08.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:41:08.638 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:41:08.639 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:41:08.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:41:08.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:41:08.640 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:41:08.640 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:41:08.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:41:08.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:41:08.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:41:08.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:41:08.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:41:08.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:41:08.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:41:08.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:41:08.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:41:08.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:41:08.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:41:08.987 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:41:09.073 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:40:53
2026-06-04T05:41:09.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88070, datetime.datetime(2026, 6, 4, 5, 40, 53), datetime.datetime(2026, 6, 4, 5, 40, 53), 'salt', 1.53, 100.68, None, 33.59, 141.68, -0.1, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:41:09.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:41:09.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:41:09.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:40:53, diff=16.081056s, valid=True
2026-06-04T05:41:09.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:41:09.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:41:09.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:41:12, diff=-2.915442s, valid=True
2026-06-04T05:41:09.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:41:09.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:41:09.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:40:46, diff=23.092815s, valid=True
2026-06-04T05:41:09.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:41:09.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:41:09.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:41:09.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:41:09.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:41:09.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:41:09.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:41:12, diff=-2.903419s, valid=True
2026-06-04T05:41:09.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:41:09.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:41:09.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:41:09.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118666.097459s, valid=True
2026-06-04T05:41:09.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:41:09.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:41:09.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:41:09.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:41:09.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:41:09.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:41:09.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:41:09.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:41:09.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:41:09.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:41:09.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:41:09.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:41:09.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:41:09.417 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:41:09.619 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:41:09.966 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:41:10.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:41:10.072 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:41:10.072 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:41:10.269 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:41:10.269 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:41:40.299 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:41:40.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:41:40.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:41:40.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:41:40.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:41:40.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:41:40.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:41:40.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:41:40.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:41:40.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:41:40.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:41:40.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:41:40.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:41:43.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:41:43.323 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:41:43.323 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:41:43.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:41:43.335 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:41:43.347 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:41:43.348 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:41:43.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:41:43.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:41:43.349 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:41:43.349 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:41:43.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:41:43.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:41:43.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:41:43.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:41:43.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:41:43.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:41:43.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:41:43.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:41:43.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:41:43.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:41:43.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:41:43.697 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:41:43.780 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:41:24
2026-06-04T05:41:43.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88071, datetime.datetime(2026, 6, 4, 5, 41, 24), datetime.datetime(2026, 6, 4, 5, 41, 23), 'salt', 1.43, 100.58, None, 28.23, 140.72, -0.09, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:41:43.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:41:43.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:41:43.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:41:23, diff=20.78884s, valid=True
2026-06-04T05:41:43.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:41:43.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:41:43.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:41:12, diff=31.792903s, valid=True
2026-06-04T05:41:43.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:41:43.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:41:43.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:41:17, diff=26.801237s, valid=True
2026-06-04T05:41:43.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:41:43.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:41:43.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:41:43.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:41:43.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:41:43.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:41:43.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:41:12, diff=31.805027s, valid=True
2026-06-04T05:41:43.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:41:43.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:41:43.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:41:43.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118700.805859s, valid=True
2026-06-04T05:41:43.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:41:43.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:41:43.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:41:43.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:41:43.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:41:43.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:41:43.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:41:43.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:41:43.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:41:44.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:41:44.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:41:44.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:41:44.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:41:44.192 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:41:44.396 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:41:44.733 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:41:44.833 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:41:44.833 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:41:44.833 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:41:45.084 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:41:45.084 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:42:15.114 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:42:15.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:42:15.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:42:15.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:42:15.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:42:15.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:42:15.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:42:15.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:42:15.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:42:15.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:42:15.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:42:15.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:42:15.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:42:17.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:42:17.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:42:17.825 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:42:17.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:42:17.838 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:42:17.851 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:42:17.851 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:42:17.852 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:42:17.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:42:17.852 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:42:17.852 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:42:17.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:42:17.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:42:17.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:42:18.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:42:18.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:42:18.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:42:18.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:42:18.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:42:18.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:42:18.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:42:18.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:42:18.200 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:42:18.278 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:41:54
2026-06-04T05:42:18.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88072, datetime.datetime(2026, 6, 4, 5, 41, 54), datetime.datetime(2026, 6, 4, 5, 41, 53), 'salt', 1.53, 100.74, None, 38.46, 140.67, -0.11, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:42:18.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:42:18.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:42:18.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:41:53, diff=25.289768s, valid=True
2026-06-04T05:42:18.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:42:18.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:42:18.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:42:12, diff=6.293263s, valid=True
2026-06-04T05:42:18.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:42:18.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:42:18.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:41:47, diff=31.301497s, valid=True
2026-06-04T05:42:18.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:42:18.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:42:18.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:42:18.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:42:18.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:42:18.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:42:18.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:42:12, diff=6.305244s, valid=True
2026-06-04T05:42:18.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:42:18.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:42:18.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:42:18.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118735.306056s, valid=True
2026-06-04T05:42:18.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:42:18.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:42:18.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:42:18.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:42:18.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:42:18.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:42:18.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:42:18.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:42:18.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:42:18.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:42:18.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:42:18.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:42:18.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:42:18.627 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:42:18.832 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:42:19.170 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:42:19.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:42:19.269 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:42:19.269 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:42:19.500 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:42:19.501 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:42:49.502 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:42:49.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:42:49.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:42:49.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:42:49.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:42:50.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:42:50.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:42:50.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:42:50.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:42:50.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:42:50.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:42:50.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:42:50.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:42:52.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:42:52.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:42:52.659 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:42:52.659 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:42:52.670 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:42:52.682 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:42:52.683 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:42:52.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:42:52.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:42:52.684 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:42:52.684 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:42:52.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:42:52.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:42:52.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:42:52.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:42:52.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:42:52.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:42:52.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:42:53.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:42:53.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:42:53.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:42:53.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:42:53.038 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:42:53.111 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:42:24
2026-06-04T05:42:53.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88073, datetime.datetime(2026, 6, 4, 5, 42, 24), datetime.datetime(2026, 6, 4, 5, 42, 23), 'salt', 1.57, 100.78, None, 38.64, 145.75, -0.11, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:42:53.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:42:53.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:42:53.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:42:23, diff=30.11901s, valid=True
2026-06-04T05:42:53.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:42:53.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:42:53.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:42:12, diff=41.122612s, valid=True
2026-06-04T05:42:53.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:42:53.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:42:53.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:42:18, diff=35.131063s, valid=True
2026-06-04T05:42:53.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:42:53.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:42:53.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:42:53.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:42:53.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:42:53.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:42:53.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:42:12, diff=41.134931s, valid=True
2026-06-04T05:42:53.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:42:53.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:42:53.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:42:53.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118770.135774s, valid=True
2026-06-04T05:42:53.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:42:53.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:42:53.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:42:53.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:42:53.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:42:53.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:42:53.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:42:53.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:42:53.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:42:53.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:42:53.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:42:53.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:42:53.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:42:53.456 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:42:53.658 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:42:53.994 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:42:54.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:42:54.093 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:42:54.093 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:42:54.295 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:42:54.295 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:43:24.297 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:43:24.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:43:24.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:43:24.601 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:43:24.619 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:43:24.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:43:24.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:43:24.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:43:24.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:43:24.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:43:24.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:43:24.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:43:24.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:43:27.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:43:27.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:43:27.297 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:43:27.297 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:43:27.308 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:43:27.321 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:43:27.322 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:43:27.322 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:43:27.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:43:27.323 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:43:27.323 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:43:27.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:43:27.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:43:27.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:43:27.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:43:27.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:43:27.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:43:27.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:43:27.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:43:27.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:43:27.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:43:27.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:43:27.673 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:43:27.751 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:43:25
2026-06-04T05:43:27.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88075, datetime.datetime(2026, 6, 4, 5, 43, 25), datetime.datetime(2026, 6, 4, 5, 43, 24), 'salt', 1.57, 100.74, None, 30.41, 150.89, -0.1, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:43:27.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:43:27.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:43:27.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:43:24, diff=3.759205s, valid=True
2026-06-04T05:43:27.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:43:27.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:43:27.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:43:12, diff=15.762934s, valid=True
2026-06-04T05:43:27.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:43:27.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:43:27.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:43:18, diff=9.771793s, valid=True
2026-06-04T05:43:27.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:43:27.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:43:27.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:43:27.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:43:27.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:43:27.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:43:27.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:43:12, diff=15.775792s, valid=True
2026-06-04T05:43:27.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:43:27.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:43:27.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:43:27.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118804.776689s, valid=True
2026-06-04T05:43:27.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:43:27.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:43:27.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:43:27.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:43:27.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:43:27.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:43:27.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:43:27.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:43:27.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:43:27.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:43:27.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:43:28.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:43:28.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:43:28.099 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:43:28.362 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:43:28.696 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:43:28.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:43:28.799 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:43:28.799 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:43:28.884 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:43:28.884 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:43:58.914 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:43:58.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:43:58.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:43:59.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:43:59.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:43:59.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:43:59.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:43:59.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:43:59.661 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:43:59.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:43:59.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:43:59.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:43:59.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:44:02.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:44:02.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:44:02.071 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:44:02.071 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:44:02.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:44:02.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:44:02.095 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:44:02.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:44:02.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:44:02.096 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:44:02.096 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:44:02.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:44:02.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:44:02.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:44:02.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:44:02.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:44:02.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:44:02.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:44:02.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:44:02.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:44:02.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:44:02.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:44:02.438 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:44:02.523 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:43:55
2026-06-04T05:44:02.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88076, datetime.datetime(2026, 6, 4, 5, 43, 55), datetime.datetime(2026, 6, 4, 5, 43, 54), 'salt', 1.5, 100.71, None, 28.62, 129.87, -0.1, 820.87, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:44:02.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:44:02.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:44:02.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:43:54, diff=8.531059s, valid=True
2026-06-04T05:44:02.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:44:02.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:44:02.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:44:12, diff=-9.465454s, valid=True
2026-06-04T05:44:02.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:44:02.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:44:02.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:43:48, diff=14.542703s, valid=True
2026-06-04T05:44:02.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:44:02.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:44:02.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:44:02.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:44:02.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:44:02.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:44:02.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:44:12, diff=-9.453556s, valid=True
2026-06-04T05:44:02.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:44:02.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:44:02.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:44:02.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118839.547268s, valid=True
2026-06-04T05:44:02.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:44:02.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:44:02.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:44:02.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:44:02.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:44:02.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:44:02.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:44:02.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:44:02.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:44:02.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:44:02.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:44:02.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:44:02.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:44:02.876 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:44:03.078 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:44:03.413 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:44:03.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:44:03.514 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:44:03.515 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:44:03.712 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:44:03.712 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:44:33.743 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:44:33.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:44:33.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:44:34.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:44:34.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:44:34.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:44:34.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:44:34.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:44:34.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:44:34.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:44:34.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:44:34.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:44:34.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:44:36.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:44:36.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:44:36.745 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:44:36.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:44:36.756 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:44:36.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:44:36.770 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:44:36.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:44:36.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:44:36.771 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:44:36.771 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:44:36.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:44:36.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:44:36.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:44:37.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:44:37.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:44:37.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:44:37.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:44:37.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:44:37.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:44:37.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:44:37.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:44:37.113 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:44:37.185 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:44:25
2026-06-04T05:44:37.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88077, datetime.datetime(2026, 6, 4, 5, 44, 25), datetime.datetime(2026, 6, 4, 5, 44, 24), 'salt', 1.47, 100.68, None, 31.09, 143.92, -0.09, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:44:37.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:44:37.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:44:37.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:44:24, diff=13.192925s, valid=True
2026-06-04T05:44:37.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:44:37.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:44:37.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:44:12, diff=25.196458s, valid=True
2026-06-04T05:44:37.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:44:37.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:44:37.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:44:18, diff=19.204688s, valid=True
2026-06-04T05:44:37.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:44:37.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:44:37.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:44:37.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:44:37.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:44:37.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:44:37.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:44:12, diff=25.208406s, valid=True
2026-06-04T05:44:37.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:44:37.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:44:37.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:44:37.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118874.209232s, valid=True
2026-06-04T05:44:37.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:44:37.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:44:37.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:44:37.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:44:37.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:44:37.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:44:37.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:44:37.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:44:37.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:44:37.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:44:37.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:44:37.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:44:37.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:44:37.604 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:44:37.821 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:44:38.160 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:44:38.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:44:38.262 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:44:38.262 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:44:38.453 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:44:38.453 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:45:08.483 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:45:08.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:45:08.483 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:45:08.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:45:08.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:45:08.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:45:08.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:45:08.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:45:08.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:45:08.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:45:08.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:45:08.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:45:08.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:45:11.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:45:11.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:45:11.316 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:45:11.317 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:45:11.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:45:11.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:45:11.342 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:45:11.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:45:11.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:45:11.343 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:45:11.343 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:45:11.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:45:11.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:45:11.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:45:11.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:45:11.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:45:11.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:45:11.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:45:11.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:45:11.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:45:11.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:45:11.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:45:11.672 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:45:11.744 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:44:56
2026-06-04T05:45:11.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88078, datetime.datetime(2026, 6, 4, 5, 44, 56), datetime.datetime(2026, 6, 4, 5, 44, 55), 'salt', 1.53, 100.68, None, 26.11, 150.7, -0.1, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:45:11.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:45:11.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:45:11.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:44:55, diff=16.751007s, valid=True
2026-06-04T05:45:11.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:45:11.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:45:11.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:45:12, diff=-0.246018s, valid=True
2026-06-04T05:45:11.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:45:11.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:45:11.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:44:49, diff=22.761159s, valid=True
2026-06-04T05:45:11.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:45:11.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:45:11.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:45:11.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:45:11.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:45:11.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:45:11.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:45:12, diff=-0.235057s, valid=True
2026-06-04T05:45:11.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:45:11.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:45:11.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:45:11.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118908.765617s, valid=True
2026-06-04T05:45:11.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:45:11.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:45:11.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:45:11.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:45:11.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:45:11.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:45:11.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:45:11.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:45:11.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:45:11.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:45:11.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:45:11.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:45:12.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:45:12.084 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:45:12.285 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:45:12.624 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:45:12.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:45:12.724 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:45:12.724 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:45:12.976 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:45:12.976 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:45:43.006 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:45:43.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:45:43.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:45:43.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:45:43.355 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:45:43.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:45:43.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:45:43.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:45:43.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:45:43.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:45:43.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:45:43.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:45:43.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:45:46.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:45:46.132 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:45:46.133 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:45:46.133 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:45:46.142 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:45:46.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:45:46.155 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:45:46.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:45:46.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:45:46.156 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:45:46.156 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:45:46.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:45:46.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:45:46.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:45:46.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:45:46.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:45:46.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:45:46.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:45:46.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:45:46.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:45:46.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:45:46.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:45:46.503 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:45:46.581 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:45:26
2026-06-04T05:45:46.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88079, datetime.datetime(2026, 6, 4, 5, 45, 26), datetime.datetime(2026, 6, 4, 5, 45, 25), 'salt', 1.6, 100.74, None, 29.89, 150.94, -0.11, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:45:46.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:45:46.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:45:46.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:45:25, diff=21.590393s, valid=True
2026-06-04T05:45:46.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:45:46.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:45:46.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:45:12, diff=34.594586s, valid=True
2026-06-04T05:45:46.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:45:46.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:45:46.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:45:19, diff=27.602944s, valid=True
2026-06-04T05:45:46.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:45:46.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:45:46.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:45:46.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:45:46.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:45:46.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:45:46.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:45:12, diff=34.606682s, valid=True
2026-06-04T05:45:46.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:45:46.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:45:46.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:45:46.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118943.607484s, valid=True
2026-06-04T05:45:46.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:45:46.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:45:46.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:45:46.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:45:46.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:45:46.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:45:46.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:45:46.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:45:46.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:45:46.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:45:46.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:45:46.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:45:46.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:45:47.006 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:45:47.212 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:45:47.551 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:45:47.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:45:47.655 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:45:47.655 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:45:47.811 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:45:47.811 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:46:17.842 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:46:17.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:46:17.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:46:18.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:46:18.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:46:18.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:46:18.387 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:46:18.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:46:18.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:46:18.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:46:18.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:46:18.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:46:18.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:46:20.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:46:20.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:46:20.787 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:46:20.787 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:46:20.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:46:20.810 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:46:20.810 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:46:20.811 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:46:20.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:46:20.811 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:46:20.812 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:46:20.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:46:20.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:46:20.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:46:21.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:46:21.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:46:21.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:46:21.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:46:21.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:46:21.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:46:21.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:46:21.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:46:21.139 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:46:21.211 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:45:56
2026-06-04T05:46:21.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88080, datetime.datetime(2026, 6, 4, 5, 45, 56), datetime.datetime(2026, 6, 4, 5, 45, 55), 'salt', 1.6, 100.74, None, 28.83, 138.56, -0.11, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:46:21.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:46:21.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:46:21.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:45:55, diff=26.218129s, valid=True
2026-06-04T05:46:21.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:46:21.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:46:21.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:46:12, diff=9.221382s, valid=True
2026-06-04T05:46:21.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:46:21.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:46:21.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:45:49, diff=32.2291s, valid=True
2026-06-04T05:46:21.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:46:21.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:46:21.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:46:21.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:46:21.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:46:21.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:46:21.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:46:12, diff=9.23259s, valid=True
2026-06-04T05:46:21.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:46:21.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:46:21.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:46:21.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=118978.233374s, valid=True
2026-06-04T05:46:21.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:46:21.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:46:21.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:46:21.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:46:21.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:46:21.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:46:21.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:46:21.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:46:21.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:46:21.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:46:21.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:46:21.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:46:21.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:46:21.552 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:46:21.757 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:46:22.098 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:46:22.198 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:46:22.198 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:46:22.198 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:46:22.470 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:46:22.471 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:46:52.501 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:46:52.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:46:52.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:46:53.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:46:53.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:46:53.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:46:53.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:46:53.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:46:53.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:46:53.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:46:53.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:46:53.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:46:53.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:46:55.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:46:55.606 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:46:55.607 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:46:55.607 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:46:55.619 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:46:55.633 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:46:55.633 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:46:55.634 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:46:55.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:46:55.634 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:46:55.635 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:46:55.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:46:55.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:46:55.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:46:55.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:46:55.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:46:55.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T05:46:55.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:46:56.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T05:46:56.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:46:56.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:46:56.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:46:56.027 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:46:56.101 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:46:26
2026-06-04T05:46:56.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88081, datetime.datetime(2026, 6, 4, 5, 46, 26), datetime.datetime(2026, 6, 4, 5, 46, 26), 'salt', 1.53, 100.61, None, 31.69, 139.17, -0.09, 820.87, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:46:56.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:46:56.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:46:56.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:46:26, diff=30.107875s, valid=True
2026-06-04T05:46:56.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:46:56.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T05:46:56.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:46:12, diff=44.110673s, valid=True
2026-06-04T05:46:56.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:46:56.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:46:56.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:46:19, diff=37.117177s, valid=True
2026-06-04T05:46:56.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:46:56.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:46:56.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:46:56.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:46:56.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:46:56.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T05:46:56.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:46:12, diff=44.120118s, valid=True
2026-06-04T05:46:56.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:46:56.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:46:56.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:46:56.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119013.120764s, valid=True
2026-06-04T05:46:56.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:46:56.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:46:56.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:46:56.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:46:56.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:46:56.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:46:56.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:46:56.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:46:56.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:46:56.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:46:56.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:46:56.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:46:56.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:46:56.438 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:46:56.653 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:46:56.990 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:46:57.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:46:57.091 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:46:57.091 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:46:57.346 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:46:57.346 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:47:27.347 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:47:27.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:47:27.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:47:27.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:47:27.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:47:27.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:47:27.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:47:27.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:47:27.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:47:27.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:47:27.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:47:27.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:47:27.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:47:30.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:47:30.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:47:30.274 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:47:30.274 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:47:30.282 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:47:30.294 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:47:30.294 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:47:30.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:47:30.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:47:30.295 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:47:30.295 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:47:30.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:47:30.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:47:30.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:47:30.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:47:30.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:47:30.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:47:30.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:47:30.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:47:30.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:47:30.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:47:30.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:47:30.584 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:47:30.653 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:47:27
2026-06-04T05:47:30.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88083, datetime.datetime(2026, 6, 4, 5, 47, 27), datetime.datetime(2026, 6, 4, 5, 47, 26), 'salt', 1.47, 100.64, None, 28.65, 143.92, -0.09, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:47:30.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:47:30.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:47:30.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:47:26, diff=4.65926s, valid=True
2026-06-04T05:47:30.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:47:30.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:47:30.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:47:12, diff=18.662078s, valid=True
2026-06-04T05:47:30.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:47:30.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:47:30.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:47:22, diff=8.668748s, valid=True
2026-06-04T05:47:30.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:47:30.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:47:30.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:47:30.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:47:30.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:47:30.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:47:30.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:47:12, diff=18.671755s, valid=True
2026-06-04T05:47:30.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:47:30.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:47:30.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:47:30.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119047.672397s, valid=True
2026-06-04T05:47:30.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:47:30.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:47:30.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:47:30.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:47:30.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:47:30.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:47:30.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:47:30.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:47:30.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:47:30.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:47:30.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:47:30.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:47:30.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:47:30.988 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:47:31.197 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:47:31.533 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:47:31.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:47:31.635 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:47:31.635 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:47:31.717 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:47:31.718 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:48:01.748 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:48:01.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:48:01.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:48:01.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:48:01.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:48:02.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:48:02.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:48:02.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:48:02.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:48:02.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:48:02.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:48:02.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:48:02.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:48:04.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:48:04.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:48:04.815 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:48:04.815 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:48:04.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:48:04.837 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:48:04.837 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:48:04.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:48:04.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:48:04.838 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:48:04.838 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:48:04.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:48:04.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:48:04.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:48:05.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:48:05.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:48:05.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:48:05.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:48:05.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:48:05.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:48:05.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:48:05.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:48:05.136 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:48:05.206 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:47:57
2026-06-04T05:48:05.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88084, datetime.datetime(2026, 6, 4, 5, 47, 57), datetime.datetime(2026, 6, 4, 5, 47, 56), 'salt', 1.57, 100.68, None, 30.52, 136.8, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:48:05.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:48:05.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:48:05.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:47:56, diff=9.213491s, valid=True
2026-06-04T05:48:05.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:48:05.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:48:05.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:48:12, diff=-6.783104s, valid=True
2026-06-04T05:48:05.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:48:05.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:48:05.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:47:54, diff=11.224708s, valid=True
2026-06-04T05:48:05.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:48:05.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:48:05.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:48:05.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:48:05.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:48:05.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:48:05.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:48:12, diff=-6.771696s, valid=True
2026-06-04T05:48:05.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:48:05.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:48:05.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:48:05.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119082.229107s, valid=True
2026-06-04T05:48:05.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:48:05.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:48:05.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:48:05.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:48:05.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:48:05.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:48:05.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:48:05.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:48:05.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:48:05.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:48:05.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:48:05.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:48:05.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:48:05.548 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:48:05.751 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:48:06.088 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:48:06.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:48:06.187 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:48:06.187 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:48:06.384 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:48:06.384 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:48:36.405 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:48:36.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:48:36.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:48:36.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:48:36.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:48:36.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:48:36.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:48:36.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:48:36.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:48:36.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:48:36.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:48:36.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:48:36.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:48:39.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:48:39.403 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:48:39.403 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:48:39.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:48:39.412 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:48:39.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:48:39.424 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:48:39.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:48:39.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:48:39.425 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:48:39.425 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:48:39.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:48:39.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:48:39.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:48:39.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:48:39.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:48:39.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:48:39.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:48:39.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:48:39.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:48:39.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:48:39.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:48:39.713 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:48:39.783 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:48:27
2026-06-04T05:48:39.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88085, datetime.datetime(2026, 6, 4, 5, 48, 27), datetime.datetime(2026, 6, 4, 5, 48, 27), 'salt', 1.5, 100.71, None, 31.23, 147.46, -0.1, 820.87, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:48:39.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:48:39.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:48:39.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:48:27, diff=12.790374s, valid=True
2026-06-04T05:48:39.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:48:39.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:48:39.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:48:12, diff=27.793493s, valid=True
2026-06-04T05:48:39.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:48:39.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:48:39.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:48:20, diff=19.800967s, valid=True
2026-06-04T05:48:39.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:48:39.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:48:39.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:48:39.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:48:39.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:48:39.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:48:39.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:48:12, diff=27.804327s, valid=True
2026-06-04T05:48:39.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:48:39.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:48:39.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:48:39.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119116.805069s, valid=True
2026-06-04T05:48:39.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:48:39.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:48:39.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:48:39.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:48:39.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:48:39.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:48:39.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:48:39.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:48:39.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:48:39.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:48:40.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:48:40.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:48:40.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:48:40.135 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:48:40.397 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:48:40.730 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:48:40.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:48:40.830 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:48:40.830 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:48:41.027 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:48:41.027 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:49:11.046 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:49:11.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:49:11.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:49:11.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:49:11.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:49:11.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:49:11.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:49:11.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:49:11.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:49:11.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:49:11.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:49:11.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:49:11.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:49:13.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:49:13.987 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:49:13.988 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:49:13.988 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:49:14.000 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:49:14.012 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:49:14.013 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:49:14.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:49:14.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:49:14.014 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:49:14.014 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:49:14.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:49:14.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:49:14.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:49:14.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:49:14.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:49:14.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:49:14.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:49:14.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:49:14.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:49:14.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:49:14.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:49:14.350 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:49:14.419 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:48:58
2026-06-04T05:49:14.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88086, datetime.datetime(2026, 6, 4, 5, 48, 58), datetime.datetime(2026, 6, 4, 5, 48, 57), 'salt', 1.53, 100.68, None, 38.49, 142.39, -0.1, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:49:14.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:49:14.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:49:14.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:48:57, diff=17.426949s, valid=True
2026-06-04T05:49:14.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:49:14.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:49:14.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:49:12, diff=2.430472s, valid=True
2026-06-04T05:49:14.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:49:14.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:49:14.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:48:51, diff=23.438596s, valid=True
2026-06-04T05:49:14.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:49:14.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:49:14.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:49:14.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:49:14.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:49:14.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:49:14.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:49:12, diff=2.442309s, valid=True
2026-06-04T05:49:14.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:49:14.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:49:14.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:49:14.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119151.44313s, valid=True
2026-06-04T05:49:14.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:49:14.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:49:14.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:49:14.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:49:14.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:49:14.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:49:14.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:49:14.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:49:14.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:49:14.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:49:14.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:49:14.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:49:14.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:49:14.762 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:49:14.964 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:49:15.300 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:49:15.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:49:15.399 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:49:15.399 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:49:15.595 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:49:15.595 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:49:45.626 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:49:45.626 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:49:45.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:49:45.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:49:45.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:49:46.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:49:46.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:49:46.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:49:46.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:49:46.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:49:46.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:49:46.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:49:46.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:49:48.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:49:48.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:49:48.631 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:49:48.631 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:49:48.641 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:49:48.654 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:49:48.654 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:49:48.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:49:48.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:49:48.655 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:49:48.656 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:49:48.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:49:48.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:49:48.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:49:48.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:49:48.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:49:48.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:49:48.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:49:48.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:49:48.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:49:48.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:49:48.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:49:48.981 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:49:49.053 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:49:28
2026-06-04T05:49:49.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88087, datetime.datetime(2026, 6, 4, 5, 49, 28), datetime.datetime(2026, 6, 4, 5, 49, 27), 'salt', 1.57, 100.74, None, 31.58, 147.91, -0.1, 820.68, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:49:49.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:49:49.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:49:49.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:49:27, diff=22.059668s, valid=True
2026-06-04T05:49:49.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:49:49.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:49:49.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:49:12, diff=37.062885s, valid=True
2026-06-04T05:49:49.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:49:49.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:49:49.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:49:21, diff=28.070683s, valid=True
2026-06-04T05:49:49.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:49:49.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:49:49.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:49:49.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:49:49.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:49:49.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:49:49.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:49:12, diff=37.074111s, valid=True
2026-06-04T05:49:49.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:49:49.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:49:49.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:49:49.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119186.074886s, valid=True
2026-06-04T05:49:49.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:49:49.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:49:49.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:49:49.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:49:49.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:49:49.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:49:49.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:49:49.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:49:49.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:49:49.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:49:49.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:49:49.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:49:49.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:49:49.464 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:49:49.669 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:49:50.018 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:49:50.123 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:49:50.123 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:49:50.123 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:49:50.319 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:49:50.319 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:50:20.344 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:50:20.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:50:20.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:50:20.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:50:20.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:50:20.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:50:20.717 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:50:20.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:50:20.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:50:20.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:50:20.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:50:20.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:50:20.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:50:23.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:50:23.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:50:23.035 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:50:23.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:50:23.044 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:50:23.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:50:23.056 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:50:23.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:50:23.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:50:23.057 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:50:23.057 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:50:23.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:50:23.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:50:23.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:50:23.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:50:23.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:50:23.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:50:23.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:50:23.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:50:23.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:50:23.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:50:23.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:50:23.332 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:50:23.405 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:49:58
2026-06-04T05:50:23.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88088, datetime.datetime(2026, 6, 4, 5, 49, 58), datetime.datetime(2026, 6, 4, 5, 49, 58), 'salt', 1.5, 100.68, None, 33.1, 141.1, -0.1, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:50:23.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:50:23.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:50:23.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:49:58, diff=25.412485s, valid=True
2026-06-04T05:50:23.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:50:23.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:50:23.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:50:12, diff=11.415752s, valid=True
2026-06-04T05:50:23.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:50:23.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:50:23.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:49:51, diff=32.423322s, valid=True
2026-06-04T05:50:23.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:50:23.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:50:23.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:50:23.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:50:23.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:50:23.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:50:23.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:50:12, diff=11.426796s, valid=True
2026-06-04T05:50:23.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:50:23.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:50:23.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:50:23.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119220.427537s, valid=True
2026-06-04T05:50:23.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:50:23.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:50:23.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:50:23.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:50:23.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:50:23.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:50:23.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:50:23.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:50:23.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:50:23.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:50:23.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:50:23.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:50:23.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:50:23.745 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:50:23.971 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:50:24.317 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:50:24.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:50:24.419 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:50:24.419 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:50:24.613 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:50:24.614 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:50:54.643 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:50:54.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:50:54.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:50:55.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:50:55.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:50:55.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:50:55.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:50:55.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:50:55.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:50:55.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:50:55.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:50:55.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:50:55.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:50:57.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:50:57.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:50:57.713 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:50:57.713 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:50:57.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:50:57.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:50:57.737 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:50:57.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:50:57.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:50:57.738 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:50:57.738 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:50:57.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:50:57.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:50:57.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:50:57.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:50:57.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:50:58.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:50:58.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:50:58.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:50:58.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:50:58.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:50:58.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:50:58.065 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:50:58.137 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:50:29
2026-06-04T05:50:58.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88089, datetime.datetime(2026, 6, 4, 5, 50, 29), datetime.datetime(2026, 6, 4, 5, 50, 28), 'salt', 1.5, 100.68, None, 34.4, 143.68, -0.1, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:50:58.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:50:58.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:50:58.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:50:28, diff=30.144759s, valid=True
2026-06-04T05:50:58.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:50:58.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:50:58.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:50:12, diff=46.148186s, valid=True
2026-06-04T05:50:58.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:50:58.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:50:58.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:50:26, diff=32.156336s, valid=True
2026-06-04T05:50:58.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:50:58.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:50:58.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:50:58.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:50:58.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:50:58.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:50:58.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:50:12, diff=46.159957s, valid=True
2026-06-04T05:50:58.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:50:58.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:50:58.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:50:58.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119255.160742s, valid=True
2026-06-04T05:50:58.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:50:58.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:50:58.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:50:58.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:50:58.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:50:58.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:50:58.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:50:58.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:50:58.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:50:58.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:50:58.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:50:58.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:50:58.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:50:58.548 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:50:58.782 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:50:59.129 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:50:59.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:50:59.232 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:50:59.232 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:50:59.422 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:50:59.422 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:51:29.436 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:51:29.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:51:29.437 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:51:29.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:51:29.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:51:30.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:51:30.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:51:30.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:51:30.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:51:30.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:51:30.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:51:30.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:51:30.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:51:32.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:51:32.599 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:51:32.600 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:51:32.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:51:32.611 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:51:32.623 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:51:32.624 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:51:32.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:51:32.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:51:32.625 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:51:32.625 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:51:32.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:51:32.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:51:32.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:51:32.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:51:32.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:51:32.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:51:32.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:51:32.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:51:32.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:51:32.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:51:32.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:51:32.951 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:51:33.023 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:51:29
2026-06-04T05:51:33.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88091, datetime.datetime(2026, 6, 4, 5, 51, 29), datetime.datetime(2026, 6, 4, 5, 51, 28), 'salt', 1.6, 100.68, None, 30.56, 150.02, -0.1, 820.81, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:51:33.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:51:33.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:51:33.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:51:28, diff=5.030669s, valid=True
2026-06-04T05:51:33.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:51:33.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:51:33.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:51:12, diff=21.033911s, valid=True
2026-06-04T05:51:33.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:51:33.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:51:33.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:51:22, diff=11.04128s, valid=True
2026-06-04T05:51:33.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:51:33.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:51:33.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:51:33.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:51:33.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:51:33.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:51:33.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:51:12, diff=21.044491s, valid=True
2026-06-04T05:51:33.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:51:33.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:51:33.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:51:33.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119290.04518s, valid=True
2026-06-04T05:51:33.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:51:33.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:51:33.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:51:33.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:51:33.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:51:33.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:51:33.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:51:33.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:51:33.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:51:33.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:51:33.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:51:33.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:51:33.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:51:33.360 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:51:33.570 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:51:33.916 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:51:34.017 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:51:34.017 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:51:34.017 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:51:34.284 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:51:34.284 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:52:04.290 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:52:04.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:52:04.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:52:04.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:52:04.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:52:04.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:52:04.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:52:04.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:52:04.939 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:52:04.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:52:04.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:52:04.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:52:04.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:52:07.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:52:07.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:52:07.272 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:52:07.272 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:52:07.284 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:52:07.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:52:07.297 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:52:07.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:52:07.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:52:07.298 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:52:07.298 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:52:07.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:52:07.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:52:07.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:52:07.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:52:07.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:52:07.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:52:07.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:52:07.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:52:07.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:52:07.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:52:07.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:52:07.618 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:52:07.690 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:51:59
2026-06-04T05:52:07.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88092, datetime.datetime(2026, 6, 4, 5, 51, 59), datetime.datetime(2026, 6, 4, 5, 51, 59), 'salt', 1.57, 100.61, None, 32.04, 148.52, -0.08, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:52:07.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:52:07.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:52:07.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:51:59, diff=8.697168s, valid=True
2026-06-04T05:52:07.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:52:07.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:52:07.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:52:12, diff=-4.299595s, valid=True
2026-06-04T05:52:07.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:52:07.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:52:07.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:51:53, diff=14.708213s, valid=True
2026-06-04T05:52:07.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:52:07.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:52:07.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:52:07.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:52:07.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:52:07.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:52:07.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:52:12, diff=-4.288168s, valid=True
2026-06-04T05:52:07.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:52:07.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:52:07.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:52:07.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119324.71257s, valid=True
2026-06-04T05:52:07.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:52:07.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:52:07.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:52:07.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:52:07.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:52:07.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:52:07.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:52:07.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:52:07.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:52:07.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:52:07.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:52:07.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:52:07.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:52:08.030 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:52:08.245 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:52:08.592 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:52:08.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:52:08.693 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:52:08.693 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:52:08.884 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:52:08.885 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:52:38.892 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:52:38.892 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:52:38.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:52:39.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:52:39.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:52:39.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:52:39.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:52:39.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:52:39.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:52:39.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:52:39.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:52:39.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:52:39.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:52:41.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:52:41.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:52:41.871 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:52:41.871 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:52:41.883 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:52:41.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:52:41.896 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:52:41.897 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:52:41.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:52:41.897 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:52:41.898 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:52:41.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:52:41.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:52:41.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:52:42.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:52:42.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:52:42.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:52:42.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:52:42.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:52:42.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:52:42.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:52:42.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:52:42.179 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:52:42.248 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:52:30
2026-06-04T05:52:42.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88093, datetime.datetime(2026, 6, 4, 5, 52, 30), datetime.datetime(2026, 6, 4, 5, 52, 29), 'salt', 1.63, 100.71, None, 32.04, 149.32, -0.1, 820.81, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:52:42.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:52:42.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:52:42.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:52:29, diff=13.255654s, valid=True
2026-06-04T05:52:42.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:52:42.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:52:42.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:52:12, diff=30.258802s, valid=True
2026-06-04T05:52:42.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:52:42.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:52:42.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:52:23, diff=19.266168s, valid=True
2026-06-04T05:52:42.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:52:42.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:52:42.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:52:42.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:52:42.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:52:42.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:52:42.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:52:12, diff=30.269598s, valid=True
2026-06-04T05:52:42.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:52:42.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:52:42.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:52:42.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119359.270333s, valid=True
2026-06-04T05:52:42.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:52:42.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:52:42.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:52:42.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:52:42.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:52:42.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:52:42.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:52:42.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:52:42.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:52:42.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:52:42.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:52:42.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:52:42.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:52:42.588 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:52:42.797 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:52:43.201 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:52:43.309 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:52:43.309 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:52:43.309 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:52:43.580 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:52:43.580 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:53:13.611 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:53:13.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:53:13.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:53:13.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:53:13.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:53:14.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:53:14.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:53:14.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:53:14.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:53:14.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:53:14.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:53:14.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:53:14.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:53:16.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:53:16.687 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:53:16.688 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:53:16.688 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:53:16.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:53:16.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:53:16.713 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:53:16.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:53:16.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:53:16.714 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:53:16.714 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:53:16.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:53:16.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:53:16.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:53:16.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:53:16.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:53:16.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:53:16.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:53:17.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:53:17.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:53:17.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:53:17.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:53:17.049 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:53:17.124 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:53:00
2026-06-04T05:53:17.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88094, datetime.datetime(2026, 6, 4, 5, 53), datetime.datetime(2026, 6, 4, 5, 52, 59), 'salt', 1.53, 100.61, None, 27.59, 135.9, -0.09, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:53:17.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:53:17.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:53:17.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:52:59, diff=18.131932s, valid=True
2026-06-04T05:53:17.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:53:17.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:53:17.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:53:12, diff=5.135553s, valid=True
2026-06-04T05:53:17.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:53:17.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:53:17.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:52:53, diff=24.144s, valid=True
2026-06-04T05:53:17.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:53:17.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:53:17.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:53:17.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:53:17.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:53:17.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:53:17.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:53:12, diff=5.147875s, valid=True
2026-06-04T05:53:17.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:53:17.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:53:17.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:53:17.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119394.148727s, valid=True
2026-06-04T05:53:17.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:53:17.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:53:17.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:53:17.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:53:17.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:53:17.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:53:17.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:53:17.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:53:17.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:53:17.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:53:17.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:53:17.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:53:17.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:53:17.470 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:53:17.678 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:53:18.019 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:53:18.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:53:18.122 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:53:18.122 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:53:18.213 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:53:18.214 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:53:48.244 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:53:48.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:53:48.244 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:53:48.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:53:48.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:53:48.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:53:48.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:53:48.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:53:48.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:53:48.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:53:48.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:53:48.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:53:48.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:53:51.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:53:51.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:53:51.230 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:53:51.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:53:51.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:53:51.257 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:53:51.258 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:53:51.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:53:51.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:53:51.259 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:53:51.259 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:53:51.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:53:51.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:53:51.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:53:51.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:53:51.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:53:51.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:53:51.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:53:51.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:53:51.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:53:51.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:53:51.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:53:51.592 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:53:51.661 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:53:30
2026-06-04T05:53:51.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88095, datetime.datetime(2026, 6, 4, 5, 53, 30), datetime.datetime(2026, 6, 4, 5, 53, 29), 'salt', 1.63, 100.68, None, 31.54, 130.67, -0.1, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:53:51.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:53:51.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:53:51.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:53:29, diff=22.669251s, valid=True
2026-06-04T05:53:51.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:53:51.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:53:51.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:53:12, diff=39.672752s, valid=True
2026-06-04T05:53:51.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:53:51.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:53:51.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:53:23, diff=28.681018s, valid=True
2026-06-04T05:53:51.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:53:51.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:53:51.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:53:51.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:53:51.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:53:51.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:53:51.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:53:12, diff=39.684802s, valid=True
2026-06-04T05:53:51.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:53:51.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:53:51.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:53:51.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119428.685613s, valid=True
2026-06-04T05:53:51.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:53:51.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:53:51.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:53:51.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:53:51.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:53:51.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:53:51.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:53:51.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:53:51.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:53:51.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:53:51.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:53:51.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:53:51.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:53:52.080 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:53:52.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:53:52.634 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:53:52.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:53:52.735 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:53:52.735 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:53:52.993 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:53:52.993 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:54:23.023 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:54:23.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:54:23.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:54:23.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:54:23.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:54:23.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:54:23.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:54:23.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:54:23.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:54:23.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:54:23.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:54:23.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:54:23.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:54:26.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:54:26.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:54:26.034 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:54:26.034 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:54:26.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:54:26.058 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:54:26.058 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:54:26.059 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:54:26.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:54:26.059 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:54:26.060 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:54:26.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:54:26.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:54:26.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:54:26.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:54:26.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:54:26.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:54:26.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:54:26.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:54:26.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:54:26.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:54:26.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:54:26.388 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:54:26.459 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:54:00
2026-06-04T05:54:26.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88096, datetime.datetime(2026, 6, 4, 5, 54), datetime.datetime(2026, 6, 4, 5, 54), 'salt', 1.6, 100.64, None, 31.76, 147.63, -0.09, 821.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:54:26.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:54:26.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:54:26.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:54:00, diff=26.466524s, valid=True
2026-06-04T05:54:26.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:54:26.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:54:26.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:54:12, diff=14.470052s, valid=True
2026-06-04T05:54:26.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:54:26.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:54:26.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:53:53, diff=33.478713s, valid=True
2026-06-04T05:54:26.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:54:26.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:54:26.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:54:26.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:54:26.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:54:26.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:54:26.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:54:12, diff=14.482575s, valid=True
2026-06-04T05:54:26.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:54:26.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:54:26.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:54:26.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119463.483384s, valid=True
2026-06-04T05:54:26.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:54:26.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:54:26.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:54:26.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:54:26.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:54:26.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:54:26.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:54:26.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:54:26.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:54:26.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:54:26.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:54:26.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:54:26.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:54:26.804 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:54:27.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:54:27.357 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:54:27.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:54:27.458 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:54:27.458 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:54:27.545 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:54:27.545 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:54:57.553 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:54:57.553 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:54:57.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:54:57.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:54:57.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:54:57.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:54:57.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:54:57.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:54:57.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:54:57.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:54:57.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:54:57.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:54:57.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:55:00.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:55:00.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:55:00.389 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:55:00.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:55:00.400 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:55:00.412 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:55:00.413 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:55:00.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:55:00.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:55:00.414 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:55:00.414 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:55:00.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:55:00.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:55:00.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:55:00.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:55:00.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:55:00.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:55:00.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:55:00.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:55:00.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:55:00.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:55:00.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:55:00.752 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:55:00.829 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:54:31
2026-06-04T05:55:00.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88097, datetime.datetime(2026, 6, 4, 5, 54, 31), datetime.datetime(2026, 6, 4, 5, 54, 30), 'salt', 1.63, 100.74, None, 31.76, 133.93, -0.11, 820.74, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:55:00.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:55:00.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:55:00.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:54:30, diff=30.836675s, valid=True
2026-06-04T05:55:00.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:55:00.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:55:00.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:54:12, diff=48.840183s, valid=True
2026-06-04T05:55:00.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:55:00.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:55:00.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:54:24, diff=36.848282s, valid=True
2026-06-04T05:55:00.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:55:00.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:55:00.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:55:00.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:55:00.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:55:00.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:55:00.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:54:12, diff=48.852068s, valid=True
2026-06-04T05:55:00.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:55:00.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:55:00.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:55:00.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119497.852888s, valid=True
2026-06-04T05:55:00.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:55:00.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:55:00.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:55:00.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:55:00.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:55:00.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:55:00.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:55:00.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:55:00.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:55:00.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:55:01.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:55:01.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:55:01.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:55:01.250 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:55:01.493 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:55:01.837 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:55:01.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:55:01.939 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:55:01.939 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:55:02.133 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:55:02.134 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:55:32.164 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:55:32.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:55:32.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:55:32.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:55:32.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:55:32.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:55:32.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:55:32.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:55:32.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:55:32.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:55:32.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:55:32.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:55:32.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:55:35.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:55:35.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:55:35.157 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:55:35.158 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:55:35.168 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:55:35.181 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:55:35.182 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:55:35.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:55:35.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:55:35.183 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:55:35.183 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:55:35.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:55:35.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:55:35.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:55:35.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:55:35.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:55:35.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:55:35.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:55:35.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T05:55:35.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:55:35.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:55:35.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:55:35.518 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:55:35.588 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:55:31
2026-06-04T05:55:35.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88099, datetime.datetime(2026, 6, 4, 5, 55, 31), datetime.datetime(2026, 6, 4, 5, 55, 30), 'salt', 1.57, 100.71, None, 37.93, 141.03, -0.1, 820.87, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:55:35.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:55:35.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:55:35.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:55:30, diff=5.596285s, valid=True
2026-06-04T05:55:35.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:55:35.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:55:35.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:55:12, diff=23.599777s, valid=True
2026-06-04T05:55:35.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:55:35.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:55:35.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:55:24, diff=11.608055s, valid=True
2026-06-04T05:55:35.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:55:35.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:55:35.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:55:35.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:55:35.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:55:35.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T05:55:35.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:55:12, diff=23.611776s, valid=True
2026-06-04T05:55:35.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:55:35.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:55:35.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:55:35.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119532.6126s, valid=True
2026-06-04T05:55:35.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:55:35.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:55:35.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:55:35.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:55:35.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:55:35.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:55:35.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:55:35.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:55:35.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:55:35.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:55:35.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:55:35.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:55:35.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:55:35.935 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:55:36.144 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:55:36.490 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:55:36.592 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:55:36.592 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:55:36.592 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:55:36.679 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:55:36.679 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:56:06.697 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:56:06.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:56:06.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:56:07.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:56:07.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:56:07.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:56:07.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:56:07.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:56:07.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:56:07.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:56:07.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:56:07.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:56:07.458 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:56:09.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:56:10.022 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:56:10.022 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:56:10.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:56:10.032 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:56:10.043 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:56:10.044 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:56:10.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:56:10.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:56:10.044 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:56:10.044 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:56:10.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:56:10.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:56:10.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:56:10.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:56:10.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:56:10.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T05:56:10.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:56:10.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T05:56:10.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:56:10.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:56:10.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:56:10.401 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:56:10.471 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:56:01
2026-06-04T05:56:10.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88100, datetime.datetime(2026, 6, 4, 5, 56, 1), datetime.datetime(2026, 6, 4, 5, 56, 1), 'salt', 1.57, 100.64, None, 26.75, 148.99, -0.09, 821.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:56:10.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:56:10.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:56:10.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:56:01, diff=9.478279s, valid=True
2026-06-04T05:56:10.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:56:10.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T05:56:10.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:55:12, diff=58.481362s, valid=True
2026-06-04T05:56:10.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:56:10.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:56:10.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:55:54, diff=16.488402s, valid=True
2026-06-04T05:56:10.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:56:10.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:56:10.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:56:10.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:56:10.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:56:10.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T05:56:10.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:55:12, diff=58.49167s, valid=True
2026-06-04T05:56:10.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:56:10.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:56:10.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:56:10.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119567.492344s, valid=True
2026-06-04T05:56:10.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:56:10.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:56:10.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:56:10.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:56:10.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:56:10.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:56:10.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:56:10.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:56:10.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:56:10.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:56:10.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:56:10.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:56:10.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:56:10.832 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:56:11.061 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:56:11.418 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:56:11.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:56:11.529 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:56:11.529 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:56:11.676 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:56:11.677 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:56:41.694 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:56:41.694 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:56:41.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:56:41.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:56:41.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:56:42.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:56:42.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:56:42.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:56:42.128 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:56:42.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:56:42.144 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:56:42.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:56:42.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:56:44.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:56:44.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:56:44.495 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:56:44.495 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:56:44.506 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:56:44.519 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:56:44.519 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:56:44.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:56:44.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:56:44.520 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:56:44.521 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:56:44.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:56:44.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:56:44.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:56:44.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:56:44.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:56:44.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T05:56:44.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:56:44.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T05:56:44.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:56:44.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:56:44.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:56:44.864 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:56:44.936 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:56:32
2026-06-04T05:56:44.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88101, datetime.datetime(2026, 6, 4, 5, 56, 32), datetime.datetime(2026, 6, 4, 5, 56, 31), 'salt', 1.67, 100.74, None, 36.41, 142.46, -0.1, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:56:44.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:56:44.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:56:44.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:56:31, diff=13.943513s, valid=True
2026-06-04T05:56:44.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:56:44.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T05:56:44.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:55:12, diff=92.947011s, valid=True
2026-06-04T05:56:44.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:56:44.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:56:44.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:56:25, diff=19.955225s, valid=True
2026-06-04T05:56:44.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:56:44.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:56:44.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:56:44.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:56:44.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:56:44.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T05:56:44.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:55:12, diff=92.958961s, valid=True
2026-06-04T05:56:44.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:56:44.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:56:44.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:56:44.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119601.959791s, valid=True
2026-06-04T05:56:44.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:56:44.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:56:44.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:56:44.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:56:44.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:56:45.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:56:45.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:56:45.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:56:45.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:56:45.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:56:45.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:56:45.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:56:45.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:56:45.279 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:56:45.487 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:56:45.885 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:56:45.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:56:45.986 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:56:45.986 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:56:46.214 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:56:46.214 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:57:16.215 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:57:16.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:57:16.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:57:16.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:57:16.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:57:16.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:57:16.619 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:57:16.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:57:16.634 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:57:16.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:57:16.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:57:16.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:57:16.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:57:19.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:57:19.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:57:19.058 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:57:19.058 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:57:19.069 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:57:19.082 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:57:19.082 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:57:19.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:57:19.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:57:19.083 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:57:19.084 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:57:19.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:57:19.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:57:19.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:57:19.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:57:19.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:57:19.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T05:57:19.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:57:19.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T05:57:19.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:57:19.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:57:19.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:57:19.426 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:57:19.498 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:57:02
2026-06-04T05:57:19.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88102, datetime.datetime(2026, 6, 4, 5, 57, 2), datetime.datetime(2026, 6, 4, 5, 57, 1), 'salt', 1.7, 100.74, None, 32.21, 147.84, -0.11, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:57:19.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:57:19.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:57:19.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:57:01, diff=18.506325s, valid=True
2026-06-04T05:57:19.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:57:19.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T05:57:19.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:55:12, diff=127.509831s, valid=True
2026-06-04T05:57:19.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:57:19.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:57:19.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:56:55, diff=24.518062s, valid=True
2026-06-04T05:57:19.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:57:19.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:57:19.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:57:19.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:57:19.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:57:19.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T05:57:19.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:55:12, diff=127.522004s, valid=True
2026-06-04T05:57:19.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:57:19.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:57:19.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:57:19.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119636.522845s, valid=True
2026-06-04T05:57:19.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:57:19.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:57:19.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:57:19.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:57:19.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:57:19.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:57:19.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:57:19.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:57:19.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:57:19.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:57:19.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:57:19.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:57:19.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:57:19.844 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:57:20.071 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:57:20.418 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:57:20.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:57:20.519 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:57:20.519 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:57:20.712 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:57:20.712 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:57:50.732 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:57:50.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:57:50.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:57:51.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:57:51.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:57:51.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:57:51.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:57:51.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:57:51.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:57:51.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:57:51.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:57:51.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:57:51.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:57:53.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:57:53.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:57:53.773 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:57:53.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:57:53.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:57:53.793 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:57:53.794 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:57:53.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:57:53.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:57:53.795 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:57:53.796 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:57:53.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:57:53.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:57:53.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:57:54.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:57:54.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:57:54.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T05:57:54.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:57:54.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T05:57:54.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:57:54.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:57:54.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:57:54.128 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:57:54.199 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:57:32
2026-06-04T05:57:54.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88103, datetime.datetime(2026, 6, 4, 5, 57, 32), datetime.datetime(2026, 6, 4, 5, 57, 31), 'salt', 1.63, 100.68, None, 24.56, 150.68, -0.1, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:57:54.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:57:54.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:57:54.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:57:31, diff=23.207149s, valid=True
2026-06-04T05:57:54.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:57:54.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T05:57:54.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:55:12, diff=162.210637s, valid=True
2026-06-04T05:57:54.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:57:54.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:57:54.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:57:25, diff=29.218813s, valid=True
2026-06-04T05:57:54.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:57:54.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:57:54.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:57:54.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:57:54.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:57:54.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T05:57:54.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:55:12, diff=162.222598s, valid=True
2026-06-04T05:57:54.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:57:54.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:57:54.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:57:54.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119671.223435s, valid=True
2026-06-04T05:57:54.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:57:54.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:57:54.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:57:54.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:57:54.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:57:54.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:57:54.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:57:54.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:57:54.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:57:54.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:57:54.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:57:54.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:57:54.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:57:54.617 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:57:54.824 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:57:55.166 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:57:55.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:57:55.299 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:57:55.299 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:57:55.540 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:57:55.541 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:58:25.554 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:58:25.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:58:25.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:58:25.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:58:25.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:58:25.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:58:25.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:58:25.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:58:25.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:58:25.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:58:25.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:58:25.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:58:25.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:58:28.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:58:28.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:58:28.502 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:58:28.502 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:58:28.512 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:58:28.525 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:58:28.526 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:58:28.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:58:28.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:58:28.527 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:58:28.527 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:58:28.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:58:28.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:58:28.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:58:28.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:58:28.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:58:28.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:58:28.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:58:28.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T05:58:28.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:58:28.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:58:28.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:58:28.857 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:58:28.928 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:58:02
2026-06-04T05:58:28.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88104, datetime.datetime(2026, 6, 4, 5, 58, 2), datetime.datetime(2026, 6, 4, 5, 58, 2), 'salt', 1.63, 100.68, None, 23.96, 144.97, -0.1, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:58:28.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:58:28.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:58:28.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:58:02, diff=26.936194s, valid=True
2026-06-04T05:58:28.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:58:28.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:58:28.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:55:12, diff=196.93968s, valid=True
2026-06-04T05:58:28.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:58:28.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:58:28.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:57:55, diff=33.948033s, valid=True
2026-06-04T05:58:28.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:58:28.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:58:28.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:58:28.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:58:28.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:58:28.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T05:58:28.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:55:12, diff=196.951762s, valid=True
2026-06-04T05:58:28.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:58:28.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:58:28.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:58:28.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119705.952564s, valid=True
2026-06-04T05:58:28.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:58:28.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:58:28.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:58:28.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:58:28.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:58:29.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:58:29.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:58:29.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:58:29.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:58:29.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:58:29.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:58:29.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:58:29.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:58:29.273 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:58:29.482 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:58:29.825 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:58:29.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:58:29.935 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:58:29.935 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:58:30.116 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:58:30.116 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:59:00.146 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:59:00.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:59:00.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:59:00.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:59:00.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:59:00.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:59:00.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:59:00.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:59:00.534 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:59:00.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:59:00.547 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:59:00.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:59:00.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:59:02.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:59:02.982 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:59:02.983 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:59:02.983 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:59:02.993 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:59:03.006 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:59:03.007 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:59:03.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:59:03.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:59:03.008 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:59:03.008 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:59:03.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:59:03.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:59:03.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:59:03.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:59:03.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:59:03.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:59:03.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:59:03.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:59:03.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:59:03.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:59:03.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:59:03.342 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:59:03.414 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:59:03
2026-06-04T05:59:03.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88106, datetime.datetime(2026, 6, 4, 5, 59, 3), datetime.datetime(2026, 6, 4, 5, 59, 2), 'salt', 1.73, 100.74, None, 26.5, 141.59, -0.11, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:59:03.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:59:03.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:59:03.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:59:02, diff=1.422662s, valid=True
2026-06-04T05:59:03.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:59:03.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:59:03.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:55:12, diff=231.426117s, valid=True
2026-06-04T05:59:03.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:59:03.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:59:03.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:58:56, diff=7.434284s, valid=True
2026-06-04T05:59:03.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:59:03.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:59:03.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:59:03.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:59:03.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:59:03.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:59:03.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:55:12, diff=231.437961s, valid=True
2026-06-04T05:59:03.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:59:03.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:59:03.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:59:03.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119740.438808s, valid=True
2026-06-04T05:59:03.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:59:03.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:59:03.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:59:03.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:59:03.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:59:03.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:59:03.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:59:03.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:59:03.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:59:03.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:59:03.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:59:03.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:59:03.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:59:03.829 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:59:04.040 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:59:04.385 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:59:04.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:59:04.487 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:59:04.487 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:59:04.671 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:59:04.671 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T05:59:34.701 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T05:59:34.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T05:59:34.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T05:59:35.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T05:59:35.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T05:59:35.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T05:59:35.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T05:59:35.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T05:59:35.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T05:59:35.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T05:59:35.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T05:59:35.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T05:59:35.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T05:59:37.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T05:59:37.718 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T05:59:37.719 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T05:59:37.719 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T05:59:37.731 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T05:59:37.744 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T05:59:37.744 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T05:59:37.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T05:59:37.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T05:59:37.745 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T05:59:37.745 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T05:59:37.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T05:59:37.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T05:59:37.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T05:59:37.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T05:59:37.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:59:38.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:59:38.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T05:59:38.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T05:59:38.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T05:59:38.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T05:59:38.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T05:59:38.097 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T05:59:38.169 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 05:59:33
2026-06-04T05:59:38.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88107, datetime.datetime(2026, 6, 4, 5, 59, 33), datetime.datetime(2026, 6, 4, 5, 59, 32), 'salt', 1.67, 100.71, None, 35.57, 142.44, -0.1, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T05:59:38.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T05:59:38.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T05:59:38.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:59:32, diff=6.175352s, valid=True
2026-06-04T05:59:38.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T05:59:38.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:59:38.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:55:12, diff=266.178244s, valid=True
2026-06-04T05:59:38.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T05:59:38.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T05:59:38.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:59:26, diff=12.184977s, valid=True
2026-06-04T05:59:38.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T05:59:38.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:59:38.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T05:59:38.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T05:59:38.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T05:59:38.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T05:59:38.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:55:12, diff=266.188027s, valid=True
2026-06-04T05:59:38.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T05:59:38.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T05:59:38.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T05:59:38.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119775.188702s, valid=True
2026-06-04T05:59:38.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T05:59:38.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T05:59:38.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T05:59:38.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T05:59:38.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T05:59:38.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T05:59:38.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T05:59:38.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T05:59:38.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T05:59:38.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T05:59:38.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T05:59:38.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T05:59:38.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T05:59:38.506 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T05:59:38.742 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:59:39.087 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T05:59:39.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T05:59:39.190 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T05:59:39.190 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T05:59:39.274 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T05:59:39.274 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:00:09.282 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:00:09.282 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:00:09.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:00:09.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:00:09.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:00:09.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:00:09.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:00:09.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:00:09.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:00:09.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:00:09.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:00:09.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:00:09.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:00:12.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:00:12.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:00:12.478 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:00:12.478 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:00:12.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:00:12.503 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:00:12.504 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:00:12.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:00:12.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:00:12.505 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:00:12.505 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:00:12.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:00:12.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:00:12.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:00:12.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:00:12.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:00:12.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:00:12.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:00:12.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:00:12.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:00:12.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:00:12.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:00:12.846 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:00:12.932 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:00:03
2026-06-04T06:00:12.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88108, datetime.datetime(2026, 6, 4, 6, 0, 3), datetime.datetime(2026, 6, 4, 6, 0, 3), 'salt', 1.73, 100.74, None, 30.34, 155.87, -0.11, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:00:12.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:00:12.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:00:12.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:00:03, diff=9.939191s, valid=True
2026-06-04T06:00:12.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:00:12.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:00:12.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:55:12, diff=300.942511s, valid=True
2026-06-04T06:00:12.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:00:12.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:00:12.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:59:56, diff=16.950429s, valid=True
2026-06-04T06:00:12.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:00:12.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:00:12.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:00:12.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:00:12.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:00:12.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:00:12.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 05:55:12, diff=300.953996s, valid=True
2026-06-04T06:00:12.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:00:12.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:00:12.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:00:12.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119809.954779s, valid=True
2026-06-04T06:00:12.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:00:12.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:00:12.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:00:12.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:00:12.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:00:13.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:00:13.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:00:13.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:00:13.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:00:13.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:00:13.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:00:13.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:00:13.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:00:13.339 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:00:13.550 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:00:13.893 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:00:13.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:00:13.995 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:00:13.995 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:00:14.192 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:00:14.193 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:00:44.216 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:00:44.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:00:44.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:00:44.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:00:44.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:00:44.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:00:44.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:00:44.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:00:44.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:00:44.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:00:44.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:00:44.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:00:44.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:00:47.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:00:47.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:00:47.219 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:00:47.219 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:00:47.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:00:47.243 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:00:47.243 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:00:47.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:00:47.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:00:47.244 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:00:47.245 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:00:47.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:00:47.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:00:47.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:00:47.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:00:47.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:00:47.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:00:47.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:00:47.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:00:47.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:00:47.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:00:47.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:00:47.589 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:00:47.659 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:00:34
2026-06-04T06:00:47.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88109, datetime.datetime(2026, 6, 4, 6, 0, 34), datetime.datetime(2026, 6, 4, 6, 0, 33), 'salt', 1.7, 100.74, None, 28.76, 149.62, -0.11, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:00:47.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:00:47.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:00:47.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:00:33, diff=14.667465s, valid=True
2026-06-04T06:00:47.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:00:47.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:00:47.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:01:12, diff=-24.329065s, valid=True
2026-06-04T06:00:47.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:00:47.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:00:47.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:00:27, diff=20.679091s, valid=True
2026-06-04T06:00:47.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:00:47.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:00:47.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:00:47.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:00:47.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:00:47.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:00:47.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:01:12, diff=-24.317195s, valid=True
2026-06-04T06:00:47.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:00:47.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:00:47.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:00:47.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119844.683634s, valid=True
2026-06-04T06:00:47.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:00:47.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:00:47.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:00:47.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:00:47.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:00:47.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:00:47.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:00:47.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:00:47.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:00:47.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:00:47.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:00:47.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:00:47.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:00:48.006 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:00:48.217 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:00:48.562 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:00:48.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:00:48.664 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:00:48.664 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:00:48.867 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:00:48.867 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:01:18.880 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:01:18.880 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:01:18.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:01:19.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:01:19.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:01:19.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:01:19.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:01:19.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:01:19.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:01:19.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:01:19.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:01:19.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:01:19.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:01:22.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:01:22.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:01:22.357 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:01:22.357 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:01:22.366 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:01:22.378 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:01:22.378 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:01:22.379 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:01:22.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:01:22.379 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:01:22.379 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:01:22.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:01:22.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:01:22.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:01:22.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:01:22.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:01:22.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:01:22.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:01:22.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:01:22.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:01:22.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:01:22.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:01:22.668 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:01:22.738 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:01:04
2026-06-04T06:01:22.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88110, datetime.datetime(2026, 6, 4, 6, 1, 4), datetime.datetime(2026, 6, 4, 6, 1, 3), 'salt', 1.67, 100.74, None, 29.85, 149.29, -0.1, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:01:22.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:01:22.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:01:22.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:01:03, diff=19.745522s, valid=True
2026-06-04T06:01:22.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:01:22.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:01:22.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:01:12, diff=10.748815s, valid=True
2026-06-04T06:01:22.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:01:22.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:01:22.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:00:57, diff=25.756365s, valid=True
2026-06-04T06:01:22.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:01:22.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:01:22.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:01:22.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:01:22.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:01:22.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:01:22.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:01:12, diff=10.759845s, valid=True
2026-06-04T06:01:22.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:01:22.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:01:22.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:01:22.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119879.760592s, valid=True
2026-06-04T06:01:22.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:01:22.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:01:22.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:01:22.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:01:22.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:01:22.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:01:22.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:01:22.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:01:22.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:01:22.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:01:22.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:01:22.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:01:23.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:01:23.077 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:01:23.287 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:01:23.631 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:01:23.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:01:23.734 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:01:23.734 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:01:23.929 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:01:23.929 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:01:53.943 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:01:53.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:01:53.944 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:01:54.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:01:54.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:01:54.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:01:54.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:01:54.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:01:54.525 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:01:54.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:01:54.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:01:54.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:01:54.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:01:56.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:01:56.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:01:56.843 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:01:56.843 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:01:56.852 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:01:56.867 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:01:56.867 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:01:56.868 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:01:56.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:01:56.868 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:01:56.868 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:01:56.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:01:56.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:01:56.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:01:57.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:01:57.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:01:57.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:01:57.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:01:57.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:01:57.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:01:57.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:01:57.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:01:57.155 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:01:57.232 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:01:34
2026-06-04T06:01:57.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88111, datetime.datetime(2026, 6, 4, 6, 1, 34), datetime.datetime(2026, 6, 4, 6, 1, 33), 'salt', 1.67, 100.71, None, 27.7, 146.55, -0.1, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:01:57.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:01:57.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:01:57.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:01:33, diff=24.239542s, valid=True
2026-06-04T06:01:57.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:01:57.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:01:57.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:02:12, diff=-14.757033s, valid=True
2026-06-04T06:01:57.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:01:57.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:01:57.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:01:28, diff=29.251003s, valid=True
2026-06-04T06:01:57.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:01:57.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:01:57.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:01:57.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:01:57.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:01:57.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:01:57.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:02:12, diff=-14.745418s, valid=True
2026-06-04T06:01:57.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:01:57.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:01:57.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:01:57.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119914.255393s, valid=True
2026-06-04T06:01:57.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:01:57.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:01:57.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:01:57.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:01:57.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:01:57.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:01:57.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:01:57.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:01:57.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:01:57.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:01:57.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:01:57.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:01:57.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:01:57.575 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:01:57.842 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:01:58.183 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:01:58.284 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:01:58.284 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:01:58.284 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:01:58.478 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:01:58.479 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:02:28.509 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:02:28.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:02:28.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:02:28.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:02:28.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:02:29.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:02:29.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:02:29.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:02:29.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:02:29.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:02:29.120 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:02:29.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:02:29.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:02:31.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:02:31.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:02:31.401 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:02:31.401 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:02:31.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:02:31.422 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:02:31.422 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:02:31.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:02:31.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:02:31.423 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:02:31.423 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:02:31.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:02:31.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:02:31.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:02:31.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:02:31.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:02:31.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:02:31.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:02:31.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:02:31.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:02:31.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:02:31.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:02:31.779 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:02:31.854 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:02:04
2026-06-04T06:02:31.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88112, datetime.datetime(2026, 6, 4, 6, 2, 4), datetime.datetime(2026, 6, 4, 6, 2, 4), 'salt', 1.7, 100.74, None, 22.94, 132.01, -0.11, 821.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:02:31.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:02:31.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:02:31.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:02:04, diff=27.861822s, valid=True
2026-06-04T06:02:31.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:02:31.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:02:31.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:02:12, diff=19.865283s, valid=True
2026-06-04T06:02:31.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:02:31.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:02:31.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:01:58, diff=33.873529s, valid=True
2026-06-04T06:02:31.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:02:31.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:02:31.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:02:31.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:02:31.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:02:31.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:02:31.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:02:12, diff=19.877284s, valid=True
2026-06-04T06:02:31.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:02:31.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:02:31.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:02:31.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119948.878102s, valid=True
2026-06-04T06:02:31.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:02:31.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:02:31.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:02:31.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:02:31.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:02:31.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:02:31.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:02:31.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:02:31.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:02:32.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:02:32.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:02:32.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:02:32.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:02:32.198 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:02:32.406 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:02:32.749 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:02:32.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:02:32.850 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:02:32.850 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:02:33.101 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:02:33.101 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:03:03.131 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:03:03.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:03:03.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:03:03.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:03:03.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:03:03.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:03:03.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:03:03.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:03:03.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:03:03.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:03:03.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:03:03.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:03:03.573 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:03:05.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:03:05.905 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:03:05.905 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:03:05.905 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:03:05.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:03:05.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:03:05.928 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:03:05.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:03:05.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:03:05.928 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:03:05.929 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:03:05.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:03:06.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:03:06.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:03:06.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:03:06.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:03:06.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:03:06.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:03:06.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:03:06.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:03:06.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:03:06.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:03:06.270 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:03:06.345 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:03:05
2026-06-04T06:03:06.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88114, datetime.datetime(2026, 6, 4, 6, 3, 5), datetime.datetime(2026, 6, 4, 6, 3, 4), 'salt', 1.73, 100.74, None, 27.73, 149.74, -0.11, 821.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:03:06.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:03:06.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:03:06.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:03:04, diff=2.352727s, valid=True
2026-06-04T06:03:06.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:03:06.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:03:06.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:03:12, diff=-5.643842s, valid=True
2026-06-04T06:03:06.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:03:06.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:03:06.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:02:58, diff=8.364177s, valid=True
2026-06-04T06:03:06.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:03:06.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:03:06.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:03:06.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:03:06.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:03:06.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:03:06.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:03:12, diff=-5.632107s, valid=True
2026-06-04T06:03:06.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:03:06.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:03:06.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:03:06.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=119983.368716s, valid=True
2026-06-04T06:03:06.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:03:06.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:03:06.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:03:06.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:03:06.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:03:06.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:03:06.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:03:06.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:03:06.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:03:06.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:03:06.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:03:06.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:03:06.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:03:06.764 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:03:06.971 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:03:07.314 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:03:07.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:03:07.416 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:03:07.416 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:03:08.900 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:03:08.900 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:03:38.931 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:03:38.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:03:38.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:03:39.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:03:39.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:03:39.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:03:39.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:03:39.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:03:39.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:03:39.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:03:39.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:03:39.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:03:39.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:03:41.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:03:41.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:03:41.947 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:03:41.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:03:41.958 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:03:41.970 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:03:41.971 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:03:41.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:03:41.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:03:41.972 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:03:41.972 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:03:41.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:03:42.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:03:42.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:03:42.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:03:42.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:03:42.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:03:42.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:03:42.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:03:42.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:03:42.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:03:42.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:03:42.337 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:03:42.411 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:03:35
2026-06-04T06:03:42.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88115, datetime.datetime(2026, 6, 4, 6, 3, 35), datetime.datetime(2026, 6, 4, 6, 3, 34), 'salt', 1.73, 100.68, None, 37.51, 139.69, -0.1, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:03:42.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:03:42.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:03:42.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:03:34, diff=8.419428s, valid=True
2026-06-04T06:03:42.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:03:42.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:03:42.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:04:12, diff=-29.576837s, valid=True
2026-06-04T06:03:42.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:03:42.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:03:42.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:03:29, diff=13.431351s, valid=True
2026-06-04T06:03:42.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:03:42.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:03:42.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:03:42.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:03:42.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:03:42.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:03:42.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:04:12, diff=-29.564935s, valid=True
2026-06-04T06:03:42.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:03:42.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:03:42.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:03:42.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120019.435879s, valid=True
2026-06-04T06:03:42.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:03:42.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:03:42.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:03:42.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:03:42.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:03:42.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:03:42.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:03:42.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:03:42.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:03:42.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:03:42.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:03:42.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:03:42.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:03:42.756 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:03:42.964 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:03:43.307 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:03:43.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:03:43.408 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:03:43.408 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:03:43.500 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:03:43.500 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:04:13.530 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:04:13.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:04:13.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:04:13.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:04:13.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:04:13.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:04:13.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:04:13.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:04:13.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:04:13.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:04:13.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:04:13.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:04:13.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:04:16.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:04:16.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:04:16.367 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:04:16.367 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:04:16.376 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:04:16.388 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:04:16.388 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:04:16.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:04:16.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:04:16.389 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:04:16.389 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:04:16.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:04:16.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:04:16.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:04:16.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:04:16.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:04:16.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:04:16.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:04:16.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:04:16.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:04:16.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:04:16.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:04:16.747 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:04:16.822 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:04:05
2026-06-04T06:04:16.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88116, datetime.datetime(2026, 6, 4, 6, 4, 5), datetime.datetime(2026, 6, 4, 6, 4, 5), 'salt', 1.7, 100.68, None, 34.01, 126.63, -0.1, 821.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:04:16.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:04:16.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:04:16.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:04:05, diff=11.829701s, valid=True
2026-06-04T06:04:16.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:04:16.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:04:16.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:04:12, diff=4.833229s, valid=True
2026-06-04T06:04:16.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:04:16.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:04:16.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:03:59, diff=17.8415s, valid=True
2026-06-04T06:04:16.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:04:16.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:04:16.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:04:16.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:04:16.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:04:16.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:04:16.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:04:12, diff=4.845225s, valid=True
2026-06-04T06:04:16.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:04:16.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:04:16.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:04:16.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120053.846036s, valid=True
2026-06-04T06:04:16.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:04:16.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:04:16.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:04:16.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:04:16.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:04:16.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:04:16.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:04:16.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:04:16.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:04:16.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:04:17.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:04:17.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:04:17.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:04:17.236 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:04:17.446 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:04:17.791 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:04:17.893 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:04:17.893 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:04:17.893 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:04:18.162 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:04:18.162 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:04:48.191 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:04:48.191 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:04:48.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:04:48.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:04:48.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:04:48.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:04:48.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:04:48.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:04:48.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:04:48.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:04:48.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:04:48.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:04:48.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:04:51.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:04:51.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:04:51.273 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:04:51.273 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:04:51.282 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:04:51.294 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:04:51.294 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:04:51.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:04:51.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:04:51.294 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:04:51.294 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:04:51.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:04:51.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:04:51.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:04:51.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:04:51.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:04:51.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:04:51.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:04:51.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:04:51.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:04:51.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:04:51.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:04:51.608 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:04:51.680 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:04:36
2026-06-04T06:04:51.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88117, datetime.datetime(2026, 6, 4, 6, 4, 36), datetime.datetime(2026, 6, 4, 6, 4, 35), 'salt', 1.77, 100.71, None, 37.82, 143.89, -0.1, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:04:51.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:04:51.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:04:51.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:04:35, diff=16.687498s, valid=True
2026-06-04T06:04:51.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:04:51.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:04:51.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:05:12, diff=-20.309149s, valid=True
2026-06-04T06:04:51.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:04:51.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:04:51.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:04:30, diff=21.698772s, valid=True
2026-06-04T06:04:51.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:04:51.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:04:51.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:04:51.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:04:51.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:04:51.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:04:51.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:05:12, diff=-20.29764s, valid=True
2026-06-04T06:04:51.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:04:51.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:04:51.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:04:51.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120088.703161s, valid=True
2026-06-04T06:04:51.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:04:51.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:04:51.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:04:51.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:04:51.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:04:51.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:04:51.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:04:51.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:04:51.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:04:51.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:04:51.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:04:51.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:04:51.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:04:52.022 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:04:52.231 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:04:52.575 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:04:52.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:04:52.676 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:04:52.676 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:04:52.767 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:04:52.767 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:05:22.772 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:05:22.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:05:22.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:05:23.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:05:23.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:05:23.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:05:23.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:05:23.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:05:23.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:05:23.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:05:23.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:05:23.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:05:23.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:05:25.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:05:25.801 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:05:25.801 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:05:25.802 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:05:25.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:05:25.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:05:25.827 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:05:25.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:05:25.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:05:25.828 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:05:25.828 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:05:25.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:05:25.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:05:25.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:05:26.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:05:26.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:05:26.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:05:26.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:05:26.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:05:26.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:05:26.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:05:26.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:05:26.217 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:05:26.299 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:05:06
2026-06-04T06:05:26.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88118, datetime.datetime(2026, 6, 4, 6, 5, 6), datetime.datetime(2026, 6, 4, 6, 5, 5), 'salt', 1.77, 100.74, None, 28.19, 144.2, -0.1, 821.11, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:05:26.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:05:26.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:05:26.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:05:05, diff=21.306757s, valid=True
2026-06-04T06:05:26.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:05:26.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:05:26.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:05:12, diff=14.310363s, valid=True
2026-06-04T06:05:26.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:05:26.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:05:26.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:05:00, diff=26.318907s, valid=True
2026-06-04T06:05:26.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:05:26.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:05:26.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:05:26.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:05:26.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:05:26.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:05:26.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:05:12, diff=14.322735s, valid=True
2026-06-04T06:05:26.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:05:26.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:05:26.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:05:26.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120123.323562s, valid=True
2026-06-04T06:05:26.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:05:26.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:05:26.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:05:26.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:05:26.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:05:26.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:05:26.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:05:26.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:05:26.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:05:26.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:05:26.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:05:26.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:05:26.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:05:26.721 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:05:26.930 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:05:27.274 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:05:27.375 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:05:27.375 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:05:27.376 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:05:27.602 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:05:27.603 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:05:57.603 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:05:57.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:05:57.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:05:58.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:05:58.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:05:58.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:05:58.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:05:58.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:05:58.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:05:58.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:05:58.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:05:58.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:05:58.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:06:00.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:06:00.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:06:00.735 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:06:00.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:06:00.744 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:06:00.756 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:06:00.756 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:06:00.756 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:06:00.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:06:00.756 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:06:00.757 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:06:00.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:06:00.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:06:00.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:06:00.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:06:00.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:06:01.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:06:01.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:06:01.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:06:01.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:06:01.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:06:01.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:06:01.069 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:06:01.146 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:05:36
2026-06-04T06:06:01.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88119, datetime.datetime(2026, 6, 4, 6, 5, 36), datetime.datetime(2026, 6, 4, 6, 5, 35), 'salt', 1.73, 100.68, None, 27.13, 141.1, -0.1, 821.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:06:01.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:06:01.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:06:01.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:05:35, diff=26.152433s, valid=True
2026-06-04T06:06:01.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:06:01.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:06:01.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:06:12, diff=-10.8447s, valid=True
2026-06-04T06:06:01.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:06:01.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:06:01.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:05:30, diff=31.161973s, valid=True
2026-06-04T06:06:01.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:06:01.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:06:01.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:06:01.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:06:01.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:06:01.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:06:01.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:06:12, diff=-10.83487s, valid=True
2026-06-04T06:06:01.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:06:01.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:06:01.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:06:01.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120158.165807s, valid=True
2026-06-04T06:06:01.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:06:01.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:06:01.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:06:01.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:06:01.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:06:01.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:06:01.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:06:01.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:06:01.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:06:01.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:06:01.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:06:01.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:06:01.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:06:01.484 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:06:01.692 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:06:02.036 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:06:02.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:06:02.138 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:06:02.138 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:06:02.327 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:06:02.328 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:06:32.341 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:06:32.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:06:32.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:06:32.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:06:32.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:06:32.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:06:32.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:06:32.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:06:32.806 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:06:32.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:06:32.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:06:32.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:06:32.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:06:35.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:06:35.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:06:35.225 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:06:35.226 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:06:35.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:06:35.247 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:06:35.248 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:06:35.249 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:06:35.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:06:35.249 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:06:35.250 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:06:35.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:06:35.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:06:35.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:06:35.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:06:35.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:06:35.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:06:35.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:06:35.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:06:35.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:06:35.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:06:35.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:06:35.595 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:06:35.666 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:06:06
2026-06-04T06:06:35.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88120, datetime.datetime(2026, 6, 4, 6, 6, 6), datetime.datetime(2026, 6, 4, 6, 6, 6), 'salt', 1.8, 100.74, None, 38.56, 137.24, -0.1, 820.86, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:06:35.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:06:35.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:06:35.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:06:06, diff=29.673958s, valid=True
2026-06-04T06:06:35.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:06:35.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:06:35.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:06:12, diff=23.677532s, valid=True
2026-06-04T06:06:35.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:06:35.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:06:35.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:06:00, diff=35.685961s, valid=True
2026-06-04T06:06:35.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:06:35.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:06:35.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:06:35.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:06:35.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:06:35.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:06:35.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:06:12, diff=23.689797s, valid=True
2026-06-04T06:06:35.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:06:35.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:06:35.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:06:35.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120192.690617s, valid=True
2026-06-04T06:06:35.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:06:35.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:06:35.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:06:35.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:06:35.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:06:35.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:06:35.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:06:35.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:06:35.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:06:35.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:06:35.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:06:35.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:06:35.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:06:36.014 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:06:36.225 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:06:36.574 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:06:36.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:06:36.676 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:06:36.676 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:06:36.912 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:06:36.912 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:07:06.926 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:07:06.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:07:06.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:07:07.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:07:07.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:07:07.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:07:07.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:07:07.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:07:07.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:07:07.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:07:07.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:07:07.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:07:07.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:07:10.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:07:10.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:07:10.026 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:07:10.026 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:07:10.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:07:10.047 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:07:10.047 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:07:10.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:07:10.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:07:10.047 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:07:10.048 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:07:10.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:07:10.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:07:10.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:07:10.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:07:10.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:07:10.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:07:10.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:07:10.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:07:10.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:07:10.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:07:10.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:07:10.344 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:07:10.420 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:07:07
2026-06-04T06:07:10.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88122, datetime.datetime(2026, 6, 4, 6, 7, 7), datetime.datetime(2026, 6, 4, 6, 7, 6), 'salt', 1.77, 100.68, None, 26.18, 143.75, -0.09, 821.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:07:10.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:07:10.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:07:10.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:07:06, diff=4.426923s, valid=True
2026-06-04T06:07:10.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:07:10.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:07:10.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:07:12, diff=-1.569828s, valid=True
2026-06-04T06:07:10.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:07:10.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:07:10.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:07:01, diff=9.440133s, valid=True
2026-06-04T06:07:10.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:07:10.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:07:10.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:07:10.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:07:10.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:07:10.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:07:10.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:07:12, diff=-1.553147s, valid=True
2026-06-04T06:07:10.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:07:10.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:07:10.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:07:10.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120227.448254s, valid=True
2026-06-04T06:07:10.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:07:10.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:07:10.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:07:10.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:07:10.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:07:10.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:07:10.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:07:10.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:07:10.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:07:10.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:07:10.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:07:10.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:07:10.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:07:10.780 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:07:10.992 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:07:11.402 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:07:11.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:07:11.505 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:07:11.505 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:07:11.747 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:07:11.747 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:07:41.751 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:07:41.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:07:41.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:07:42.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:07:42.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:07:42.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:07:42.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:07:42.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:07:42.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:07:42.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:07:42.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:07:42.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:07:42.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:07:44.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:07:44.756 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:07:44.758 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:07:44.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:07:44.768 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:07:44.780 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:07:44.781 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:07:44.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:07:44.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:07:44.782 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:07:44.782 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:07:44.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:07:44.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:07:44.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:07:45.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:07:45.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:07:45.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:07:45.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:07:45.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:07:45.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:07:45.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:07:45.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:07:45.113 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:07:45.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:07:37
2026-06-04T06:07:45.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88123, datetime.datetime(2026, 6, 4, 6, 7, 37), datetime.datetime(2026, 6, 4, 6, 7, 36), 'salt', 1.73, 100.68, None, 30.38, 150.26, -0.1, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:07:45.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:07:45.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:07:45.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:07:36, diff=9.196037s, valid=True
2026-06-04T06:07:45.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:07:45.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:07:45.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:08:12, diff=-26.800506s, valid=True
2026-06-04T06:07:45.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:07:45.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:07:45.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:07:31, diff=14.207635s, valid=True
2026-06-04T06:07:45.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:07:45.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:07:45.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:07:45.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:07:45.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:07:45.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:07:45.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:08:12, diff=-26.788653s, valid=True
2026-06-04T06:07:45.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:07:45.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:07:45.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:07:45.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120262.212169s, valid=True
2026-06-04T06:07:45.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:07:45.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:07:45.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:07:45.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:07:45.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:07:45.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:07:45.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:07:45.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:07:45.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:07:45.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:07:45.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:07:45.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:07:45.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:07:45.533 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:07:45.743 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:07:46.090 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:07:46.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:07:46.193 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:07:46.193 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:07:46.393 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:07:46.393 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:08:16.396 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:08:16.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:08:16.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:08:16.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:08:16.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:08:16.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:08:16.795 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:08:16.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:08:16.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:08:16.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:08:16.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:08:16.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:08:16.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:08:19.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:08:19.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:08:19.437 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:08:19.437 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:08:19.449 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:08:19.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:08:19.476 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:08:19.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:08:19.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:08:19.477 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:08:19.478 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:08:19.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:08:19.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:08:19.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:08:19.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:08:19.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:08:19.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:08:19.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:08:19.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:08:19.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:08:19.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:08:19.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:08:19.808 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:08:19.879 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:08:07
2026-06-04T06:08:19.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88124, datetime.datetime(2026, 6, 4, 6, 8, 7), datetime.datetime(2026, 6, 4, 6, 8, 7), 'salt', 1.73, 100.68, None, 31.01, 137.64, -0.1, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:08:19.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:08:19.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:08:19.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:08:07, diff=12.885958s, valid=True
2026-06-04T06:08:19.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:08:19.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:08:19.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:08:12, diff=7.888907s, valid=True
2026-06-04T06:08:19.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:08:19.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:08:19.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:08:01, diff=18.895875s, valid=True
2026-06-04T06:08:19.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:08:19.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:08:19.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:08:19.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:08:19.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:08:19.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:08:19.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:08:12, diff=7.898956s, valid=True
2026-06-04T06:08:19.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:08:19.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:08:19.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:08:19.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120296.899597s, valid=True
2026-06-04T06:08:19.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:08:19.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:08:19.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:08:19.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:08:19.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:08:19.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:08:19.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:08:19.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:08:19.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:08:20.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:08:20.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:08:20.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:08:20.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:08:20.299 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:08:20.511 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:08:20.855 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:08:20.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:08:20.957 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:08:20.957 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:08:21.147 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:08:21.147 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:08:51.153 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:08:51.153 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:08:51.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:08:51.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:08:51.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:08:51.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:08:51.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:08:51.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:08:51.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:08:51.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:08:51.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:08:51.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:08:51.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:08:53.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:08:53.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:08:53.943 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:08:53.943 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:08:53.954 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:08:53.966 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:08:53.967 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:08:53.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:08:53.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:08:53.968 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:08:53.968 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:08:53.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:08:54.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:08:54.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:08:54.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:08:54.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:08:54.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:08:54.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:08:54.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:08:54.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:08:54.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:08:54.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:08:54.310 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:08:54.381 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:08:38
2026-06-04T06:08:54.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88125, datetime.datetime(2026, 6, 4, 6, 8, 38), datetime.datetime(2026, 6, 4, 6, 8, 37), 'salt', 1.83, 100.78, None, 35.95, 135.41, -0.11, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:08:54.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:08:54.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:08:54.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:08:37, diff=17.389493s, valid=True
2026-06-04T06:08:54.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:08:54.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:08:54.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:09:12, diff=-17.606918s, valid=True
2026-06-04T06:08:54.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:08:54.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:08:54.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:08:31, diff=23.401608s, valid=True
2026-06-04T06:08:54.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:08:54.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:08:54.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:08:54.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:08:54.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:08:54.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:08:54.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:09:12, diff=-17.594556s, valid=True
2026-06-04T06:08:54.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:08:54.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:08:54.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:08:54.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120331.406285s, valid=True
2026-06-04T06:08:54.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:08:54.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:08:54.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:08:54.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:08:54.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:08:54.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:08:54.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:08:54.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:08:54.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:08:54.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:08:54.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:08:54.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:08:54.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:08:54.727 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:08:54.936 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:08:55.280 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:08:55.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:08:55.383 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:08:55.383 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:08:55.657 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:08:55.657 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:09:25.665 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:09:25.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:09:25.666 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:09:25.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:09:25.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:09:26.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:09:26.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:09:26.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:09:26.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:09:26.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:09:26.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:09:26.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:09:26.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:09:28.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:09:28.653 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:09:28.654 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:09:28.654 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:09:28.665 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:09:28.677 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:09:28.678 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:09:28.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:09:28.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:09:28.679 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:09:28.679 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:09:28.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:09:28.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:09:28.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:09:28.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:09:28.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:09:28.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:09:28.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:09:29.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:09:29.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:09:29.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:09:29.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:09:29.017 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:09:29.087 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:09:08
2026-06-04T06:09:29.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88126, datetime.datetime(2026, 6, 4, 6, 9, 8), datetime.datetime(2026, 6, 4, 6, 9, 7), 'salt', 1.8, 100.68, None, 35.46, 140.86, -0.1, 821.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:09:29.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:09:29.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:09:29.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:09:07, diff=22.095381s, valid=True
2026-06-04T06:09:29.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:09:29.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:09:29.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:09:12, diff=17.098899s, valid=True
2026-06-04T06:09:29.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:09:29.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:09:29.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:09:02, diff=27.107112s, valid=True
2026-06-04T06:09:29.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:09:29.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:09:29.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:09:29.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:09:29.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:09:29.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:09:29.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:09:12, diff=17.11082s, valid=True
2026-06-04T06:09:29.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:09:29.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:09:29.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:09:29.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120366.111649s, valid=True
2026-06-04T06:09:29.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:09:29.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:09:29.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:09:29.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:09:29.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:09:29.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:09:29.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:09:29.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:09:29.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:09:29.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:09:29.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:09:29.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:09:29.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:09:29.503 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:09:29.713 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:09:30.072 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:09:30.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:09:30.179 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:09:30.179 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:09:30.469 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:09:30.469 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:10:00.470 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:10:00.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:10:00.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:10:00.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:10:00.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:10:01.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:10:01.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:10:01.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:10:01.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:10:01.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:10:01.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:10:01.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:10:01.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:10:03.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:10:03.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:10:03.568 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:10:03.568 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:10:03.580 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:10:03.593 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:10:03.593 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:10:03.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:10:03.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:10:03.594 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:10:03.595 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:10:03.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:10:03.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:10:03.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:10:03.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:10:03.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:10:03.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:10:03.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:10:03.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:10:03.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:10:03.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:10:03.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:10:03.932 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:10:04.004 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:09:38
2026-06-04T06:10:04.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88127, datetime.datetime(2026, 6, 4, 6, 9, 38), datetime.datetime(2026, 6, 4, 6, 9, 37), 'salt', 1.87, 100.74, None, 36.24, 141.97, -0.1, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:10:04.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:10:04.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:10:04.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:09:37, diff=27.011968s, valid=True
2026-06-04T06:10:04.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:10:04.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:10:04.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:10:12, diff=-7.984503s, valid=True
2026-06-04T06:10:04.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:10:04.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:10:04.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:09:32, diff=32.023739s, valid=True
2026-06-04T06:10:04.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:10:04.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:10:04.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:10:04.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:10:04.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:10:04.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:10:04.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:10:12, diff=-7.972574s, valid=True
2026-06-04T06:10:04.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:10:04.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:10:04.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:10:04.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120401.028257s, valid=True
2026-06-04T06:10:04.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:10:04.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:10:04.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:10:04.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:10:04.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:10:04.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:10:04.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:10:04.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:10:04.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:10:04.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:10:04.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:10:04.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:10:04.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:10:04.350 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:10:04.560 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:10:04.903 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:10:05.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:10:05.004 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:10:05.004 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:10:05.235 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:10:05.235 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:10:35.243 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:10:35.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:10:35.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:10:35.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:10:35.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:10:35.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:10:35.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:10:35.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:10:35.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:10:35.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:10:35.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:10:35.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:10:35.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:10:38.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:10:38.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:10:38.294 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:10:38.294 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:10:38.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:10:38.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:10:38.314 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:10:38.314 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:10:38.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:10:38.315 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:10:38.315 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:10:38.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:10:38.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:10:38.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:10:38.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:10:38.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:10:38.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:10:38.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:10:38.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:10:38.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:10:38.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:10:38.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:10:38.670 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:10:38.741 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:10:08
2026-06-04T06:10:38.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88128, datetime.datetime(2026, 6, 4, 6, 10, 8), datetime.datetime(2026, 6, 4, 6, 10, 8), 'salt', 1.77, 100.71, None, 30.84, 152.44, -0.1, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:10:38.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:10:38.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:10:38.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:10:08, diff=30.747819s, valid=True
2026-06-04T06:10:38.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:10:38.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:10:38.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:10:12, diff=26.750626s, valid=True
2026-06-04T06:10:38.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:10:38.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:10:38.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:10:02, diff=36.757288s, valid=True
2026-06-04T06:10:38.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:10:38.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:10:38.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:10:38.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:10:38.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:10:38.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:10:38.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:10:12, diff=26.760215s, valid=True
2026-06-04T06:10:38.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:10:38.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:10:38.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:10:38.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120435.760864s, valid=True
2026-06-04T06:10:38.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:10:38.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:10:38.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:10:38.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:10:38.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:10:38.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:10:38.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:10:38.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:10:38.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:10:38.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:10:38.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:10:38.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:10:39.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:10:39.074 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:10:39.289 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:10:39.634 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:10:39.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:10:39.737 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:10:39.738 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:10:39.928 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:10:39.929 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:11:09.958 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:11:09.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:11:09.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:11:10.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:11:10.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:11:10.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:11:10.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:11:10.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:11:10.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:11:10.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:11:10.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:11:10.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:11:10.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:11:13.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:11:13.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:11:13.239 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:11:13.239 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:11:13.249 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:11:13.262 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:11:13.263 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:11:13.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:11:13.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:11:13.264 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:11:13.264 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:11:13.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:11:13.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:11:13.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:11:13.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:11:13.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:11:13.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:11:13.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:11:13.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:11:13.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:11:13.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:11:13.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:11:13.593 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:11:13.664 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:11:09
2026-06-04T06:11:13.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88130, datetime.datetime(2026, 6, 4, 6, 11, 9), datetime.datetime(2026, 6, 4, 6, 11, 8), 'salt', 1.77, 100.78, None, 27.77, 158.79, -0.11, 821.11, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:11:13.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:11:13.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:11:13.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:11:08, diff=5.67195s, valid=True
2026-06-04T06:11:13.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:11:13.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:11:13.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:11:12, diff=1.675426s, valid=True
2026-06-04T06:11:13.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:11:13.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:11:13.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:11:03, diff=10.683705s, valid=True
2026-06-04T06:11:13.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:11:13.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:11:13.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:11:13.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:11:13.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:11:13.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:11:13.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:11:12, diff=1.68744s, valid=True
2026-06-04T06:11:13.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:11:13.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:11:13.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:11:13.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120470.688258s, valid=True
2026-06-04T06:11:13.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:11:13.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:11:13.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:11:13.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:11:13.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:11:13.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:11:13.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:11:13.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:11:13.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:11:13.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:11:13.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:11:13.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:11:13.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:11:14.015 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:11:14.224 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:11:14.626 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:11:14.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:11:14.728 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:11:14.729 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:11:14.819 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:11:14.819 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:11:44.850 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:11:44.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:11:44.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:11:45.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:11:45.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:11:45.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:11:45.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:11:45.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:11:45.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:11:45.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:11:45.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:11:45.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:11:45.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:11:47.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:11:47.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:11:47.759 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:11:47.759 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:11:47.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:11:47.783 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:11:47.784 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:11:47.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:11:47.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:11:47.785 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:11:47.785 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:11:47.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:11:47.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:11:47.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:11:48.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:11:48.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:11:48.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:11:48.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:11:48.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:11:48.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:11:48.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:11:48.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:11:48.117 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:11:48.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:11:39
2026-06-04T06:11:48.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88131, datetime.datetime(2026, 6, 4, 6, 11, 39), datetime.datetime(2026, 6, 4, 6, 11, 38), 'salt', 1.87, 100.78, None, 28.55, 147.35, -0.11, 821.11, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:11:48.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:11:48.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:11:48.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:11:38, diff=10.195038s, valid=True
2026-06-04T06:11:48.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:11:48.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:11:48.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:12:12, diff=-23.801461s, valid=True
2026-06-04T06:11:48.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:11:48.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:11:48.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:11:33, diff=15.206749s, valid=True
2026-06-04T06:11:48.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:11:48.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:11:48.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:11:48.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:11:48.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:11:48.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:11:48.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:12:12, diff=-23.789525s, valid=True
2026-06-04T06:11:48.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:11:48.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:11:48.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:11:48.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120505.211321s, valid=True
2026-06-04T06:11:48.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:11:48.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:11:48.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:11:48.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:11:48.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:11:48.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:11:48.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:11:48.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:11:48.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:11:48.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:11:48.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:11:48.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:11:48.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:11:48.538 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:11:48.748 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:11:49.096 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:11:49.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:11:49.199 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:11:49.199 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:11:49.355 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:11:49.355 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:12:19.363 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:12:19.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:12:19.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:12:19.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:12:19.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:12:19.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:12:19.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:12:19.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:12:19.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:12:19.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:12:19.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:12:19.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:12:19.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:12:22.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:12:22.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:12:22.253 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:12:22.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:12:22.264 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:12:22.277 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:12:22.277 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:12:22.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:12:22.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:12:22.279 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:12:22.279 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:12:22.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:12:22.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:12:22.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:12:22.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:12:22.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:12:22.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:12:22.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:12:22.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:12:22.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:12:22.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:12:22.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:12:22.614 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:12:22.687 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:12:09
2026-06-04T06:12:22.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88132, datetime.datetime(2026, 6, 4, 6, 12, 9), datetime.datetime(2026, 6, 4, 6, 12, 9), 'salt', 1.77, 100.78, None, 27.73, 147.02, -0.11, 821.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:12:22.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:12:22.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:12:22.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:12:09, diff=13.694559s, valid=True
2026-06-04T06:12:22.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:12:22.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:12:22.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:12:12, diff=10.698054s, valid=True
2026-06-04T06:12:22.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:12:22.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:12:22.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:12:03, diff=19.706149s, valid=True
2026-06-04T06:12:22.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:12:22.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:12:22.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:12:22.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:12:22.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:12:22.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:12:22.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:12:12, diff=10.709854s, valid=True
2026-06-04T06:12:22.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:12:22.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:12:22.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:12:22.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120539.710668s, valid=True
2026-06-04T06:12:22.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:12:22.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:12:22.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:12:22.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:12:22.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:12:22.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:12:22.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:12:22.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:12:22.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:12:22.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:12:22.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:12:22.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:12:22.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:12:23.034 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:12:23.317 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:12:23.657 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:12:23.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:12:23.761 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:12:23.761 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:12:23.994 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:12:23.994 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:12:54.016 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:12:54.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:12:54.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:12:54.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:12:54.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:12:54.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:12:54.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:12:54.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:12:54.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:12:54.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:12:54.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:12:54.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:12:54.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:12:57.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:12:57.393 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:12:57.394 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:12:57.394 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:12:57.404 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:12:57.417 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:12:57.417 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:12:57.418 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:12:57.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:12:57.418 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:12:57.419 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:12:57.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:12:57.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:12:57.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:12:57.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:12:57.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:12:57.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:12:57.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:12:57.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:12:57.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:12:57.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:12:57.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:12:57.754 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:12:57.836 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:12:39
2026-06-04T06:12:57.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88133, datetime.datetime(2026, 6, 4, 6, 12, 39), datetime.datetime(2026, 6, 4, 6, 12, 39), 'salt', 1.87, 100.68, None, 22.09, 149.48, -0.09, 821.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:12:57.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:12:57.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:12:57.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:12:39, diff=18.843926s, valid=True
2026-06-04T06:12:57.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:12:57.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:12:57.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:13:12, diff=-14.152637s, valid=True
2026-06-04T06:12:57.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:12:57.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:12:57.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:12:33, diff=24.855523s, valid=True
2026-06-04T06:12:57.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:12:57.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:12:57.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:12:57.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:12:57.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:12:57.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:12:57.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:13:12, diff=-14.140787s, valid=True
2026-06-04T06:12:57.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:12:57.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:12:57.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:12:57.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120574.860031s, valid=True
2026-06-04T06:12:57.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:12:57.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:12:57.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:12:57.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:12:57.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:12:57.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:12:57.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:12:57.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:12:57.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:12:58.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:12:58.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:12:58.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:12:58.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:12:58.184 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:12:58.394 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:12:58.740 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:12:58.843 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:12:58.843 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:12:58.843 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:12:59.070 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:12:59.070 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:13:29.092 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:13:29.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:13:29.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:13:29.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:13:29.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:13:29.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:13:29.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:13:29.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:13:29.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:13:29.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:13:29.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:13:29.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:13:29.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:13:32.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:13:32.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:13:32.349 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:13:32.349 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:13:32.360 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:13:32.373 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:13:32.374 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:13:32.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:13:32.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:13:32.375 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:13:32.375 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:13:32.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:13:32.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:13:32.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:13:32.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:13:32.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:13:32.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:13:32.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:13:32.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:13:32.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:13:32.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:13:32.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:13:32.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:13:32.771 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:13:10
2026-06-04T06:13:32.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88134, datetime.datetime(2026, 6, 4, 6, 13, 10), datetime.datetime(2026, 6, 4, 6, 13, 9), 'salt', 1.87, 100.68, None, 32.43, 164.05, -0.09, 821.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:13:32.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:13:32.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:13:32.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:13:09, diff=23.779102s, valid=True
2026-06-04T06:13:32.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:13:32.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:13:32.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:13:12, diff=20.782461s, valid=True
2026-06-04T06:13:32.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:13:32.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:13:32.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:13:03, diff=29.790451s, valid=True
2026-06-04T06:13:32.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:13:32.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:13:32.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:13:32.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:13:32.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:13:32.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:13:32.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:13:12, diff=20.79406s, valid=True
2026-06-04T06:13:32.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:13:32.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:13:32.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:13:32.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120609.794876s, valid=True
2026-06-04T06:13:32.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:13:32.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:13:32.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:13:32.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:13:32.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:13:32.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:13:32.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:13:32.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:13:32.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:13:32.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:13:33.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:13:33.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:13:33.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:13:33.187 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:13:33.398 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:13:33.746 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:13:33.849 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:13:33.849 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:13:33.849 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:13:34.085 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:13:34.085 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:14:04.098 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:14:04.098 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:14:04.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:14:04.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:14:04.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:14:04.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:14:04.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:14:04.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:14:04.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:14:04.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:14:04.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:14:04.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:14:04.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:14:07.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:14:07.097 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:14:07.097 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:14:07.097 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:14:07.105 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:14:07.117 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:14:07.118 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:14:07.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:14:07.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:14:07.118 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:14:07.118 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:14:07.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:14:07.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:14:07.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:14:07.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:14:07.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:14:07.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:14:07.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:14:07.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:14:07.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:14:07.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:14:07.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:14:07.445 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:14:07.517 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:13:40
2026-06-04T06:14:07.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88135, datetime.datetime(2026, 6, 4, 6, 13, 40), datetime.datetime(2026, 6, 4, 6, 13, 40), 'salt', 1.87, 100.74, None, 25.44, 144.2, -0.1, 821.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:14:07.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:14:07.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:14:07.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:13:40, diff=27.524457s, valid=True
2026-06-04T06:14:07.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:14:07.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:14:07.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:14:12, diff=-4.471995s, valid=True
2026-06-04T06:14:07.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:14:07.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:14:07.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:13:34, diff=33.536292s, valid=True
2026-06-04T06:14:07.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:14:07.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:14:07.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:14:07.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:14:07.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:14:07.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:14:07.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:14:12, diff=-4.459936s, valid=True
2026-06-04T06:14:07.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:14:07.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:14:07.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:14:07.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120644.540885s, valid=True
2026-06-04T06:14:07.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:14:07.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:14:07.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:14:07.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:14:07.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:14:07.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:14:07.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:14:07.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:14:07.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:14:07.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:14:07.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:14:07.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:14:07.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:14:07.862 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:14:08.072 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:14:08.419 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:14:08.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:14:08.522 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:14:08.522 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:14:08.714 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:14:08.714 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:14:38.744 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:14:38.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:14:38.744 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:14:39.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:14:39.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:14:39.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:14:39.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:14:39.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:14:39.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:14:39.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:14:39.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:14:39.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:14:39.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:14:41.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:14:41.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:14:41.774 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:14:41.774 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:14:41.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:14:41.798 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:14:41.798 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:14:41.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:14:41.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:14:41.800 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:14:41.800 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:14:41.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:14:41.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:14:41.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:14:42.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:14:42.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:14:42.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:14:42.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:14:42.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:14:42.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:14:42.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:14:42.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:14:42.160 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:14:42.253 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:14:41
2026-06-04T06:14:42.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88137, datetime.datetime(2026, 6, 4, 6, 14, 41), datetime.datetime(2026, 6, 4, 6, 14, 40), 'salt', 1.87, 100.68, None, 34.3, 142.44, -0.09, 820.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:14:42.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:14:42.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:14:42.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:14:40, diff=2.260596s, valid=True
2026-06-04T06:14:42.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:14:42.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:14:42.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:15:12, diff=-29.735892s, valid=True
2026-06-04T06:14:42.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:14:42.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:14:42.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:14:34, diff=8.272592s, valid=True
2026-06-04T06:14:42.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:14:42.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:14:42.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:14:42.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:14:42.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:14:42.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:14:42.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:15:12, diff=-29.723631s, valid=True
2026-06-04T06:14:42.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:14:42.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:14:42.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:14:42.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120679.277192s, valid=True
2026-06-04T06:14:42.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:14:42.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:14:42.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:14:42.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:14:42.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:14:42.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:14:42.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:14:42.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:14:42.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:14:42.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:14:42.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:14:42.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:14:42.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:14:42.675 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:14:42.886 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:14:43.230 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:14:43.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:14:43.332 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:14:43.332 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:14:43.511 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:14:43.511 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:15:13.514 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:15:13.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:15:13.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:15:13.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:15:13.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:15:13.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:15:13.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:15:13.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:15:13.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:15:13.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:15:13.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:15:13.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:15:13.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:15:16.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:15:16.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:15:16.274 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:15:16.274 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:15:16.286 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:15:16.299 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:15:16.299 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:15:16.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:15:16.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:15:16.301 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:15:16.301 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:15:16.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:15:16.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:15:16.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:15:16.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:15:16.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:15:16.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:15:16.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:15:16.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:15:16.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:15:16.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:15:16.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:15:16.632 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:15:16.704 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:15:11
2026-06-04T06:15:16.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88138, datetime.datetime(2026, 6, 4, 6, 15, 11), datetime.datetime(2026, 6, 4, 6, 15, 10), 'salt', 1.8, 100.74, None, 27.42, 135.74, -0.1, 821.11, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:15:16.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:15:16.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:15:16.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:15:10, diff=6.712524s, valid=True
2026-06-04T06:15:16.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:15:16.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:15:16.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:15:12, diff=4.716067s, valid=True
2026-06-04T06:15:16.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:15:16.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:15:16.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:15:04, diff=12.724218s, valid=True
2026-06-04T06:15:16.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:15:16.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:15:16.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:15:16.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:15:16.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:15:16.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:15:16.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:15:12, diff=4.727966s, valid=True
2026-06-04T06:15:16.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:15:16.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:15:16.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:15:16.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120713.728779s, valid=True
2026-06-04T06:15:16.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:15:16.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:15:16.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:15:16.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:15:16.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:15:16.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:15:16.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:15:16.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:15:16.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:15:16.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:15:16.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:15:16.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:15:17.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:15:17.049 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:15:17.257 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:15:17.599 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:15:17.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:15:17.700 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:15:17.700 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:15:17.920 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:15:17.921 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:15:47.934 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:15:47.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:15:47.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:15:48.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:15:48.081 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:15:48.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:15:48.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:15:48.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:15:48.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:15:48.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:15:48.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:15:48.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:15:48.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:15:50.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:15:50.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:15:50.851 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:15:50.851 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:15:50.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:15:50.871 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:15:50.871 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:15:50.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:15:50.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:15:50.871 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:15:50.871 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:15:50.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:15:50.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:15:50.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:15:51.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:15:51.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:15:51.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:15:51.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:15:51.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:15:51.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:15:51.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:15:51.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:15:51.194 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:15:51.264 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:15:41
2026-06-04T06:15:51.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88139, datetime.datetime(2026, 6, 4, 6, 15, 41), datetime.datetime(2026, 6, 4, 6, 15, 41), 'salt', 1.73, 100.61, None, 36.73, 144.13, -0.09, 821.11, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:15:51.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:15:51.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:15:51.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:15:41, diff=10.272196s, valid=True
2026-06-04T06:15:51.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:15:51.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:15:51.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:16:12, diff=-20.724318s, valid=True
2026-06-04T06:15:51.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:15:51.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:15:51.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:15:35, diff=16.283836s, valid=True
2026-06-04T06:15:51.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:15:51.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:15:51.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:15:51.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:15:51.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:15:51.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:15:51.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:16:12, diff=-20.712457s, valid=True
2026-06-04T06:15:51.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:15:51.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:15:51.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:15:51.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120748.288356s, valid=True
2026-06-04T06:15:51.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:15:51.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:15:51.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:15:51.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:15:51.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:15:51.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:15:51.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:15:51.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:15:51.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:15:51.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:15:51.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:15:51.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:15:51.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:15:51.608 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:15:51.820 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:15:52.167 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:15:52.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:15:52.270 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:15:52.270 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:15:52.497 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:15:52.497 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:16:22.527 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:16:22.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:16:22.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:16:22.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:16:22.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:16:23.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:16:23.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:16:23.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:16:23.105 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:16:23.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:16:23.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:16:23.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:16:23.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:16:25.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:16:25.425 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:16:25.426 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:16:25.426 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:16:25.437 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:16:25.449 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:16:25.450 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:16:25.450 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:16:25.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:16:25.451 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:16:25.451 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:16:25.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:16:25.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:16:25.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:16:25.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:16:25.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:16:25.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:16:25.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:16:25.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:16:25.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:16:25.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:16:25.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:16:25.790 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:16:25.863 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:16:12
2026-06-04T06:16:25.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88140, datetime.datetime(2026, 6, 4, 6, 16, 12), datetime.datetime(2026, 6, 4, 6, 16, 11), 'salt', 1.8, 100.64, None, 27.52, 140.72, -0.09, 821.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:16:25.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:16:25.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:16:25.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:16:11, diff=14.870958s, valid=True
2026-06-04T06:16:25.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:16:25.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:16:25.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:16:12, diff=13.874432s, valid=True
2026-06-04T06:16:25.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:16:25.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:16:25.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:16:05, diff=20.882502s, valid=True
2026-06-04T06:16:25.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:16:25.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:16:25.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:16:25.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:16:25.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:16:25.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:16:25.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:16:12, diff=13.886221s, valid=True
2026-06-04T06:16:25.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:16:25.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:16:25.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:16:25.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120782.887052s, valid=True
2026-06-04T06:16:25.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:16:25.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:16:25.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:16:25.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:16:25.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:16:25.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:16:25.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:16:25.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:16:25.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:16:26.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:16:26.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:16:26.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:16:26.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:16:26.208 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:16:26.479 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:16:26.823 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:16:26.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:16:26.925 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:16:26.925 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:16:27.084 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:16:27.084 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:16:57.099 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:16:57.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:16:57.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:16:57.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:16:57.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:16:57.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:16:57.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:16:57.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:16:57.661 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:16:57.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:16:57.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:16:57.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:16:57.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:17:00.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:17:00.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:17:00.121 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:17:00.121 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:17:00.129 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:17:00.141 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:17:00.142 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:17:00.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:17:00.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:17:00.142 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:17:00.142 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:17:00.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:17:00.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:17:00.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:17:00.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:17:00.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:17:00.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:17:00.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:17:00.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:17:00.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:17:00.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:17:00.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:17:00.494 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:17:00.578 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:16:42
2026-06-04T06:17:00.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88141, datetime.datetime(2026, 6, 4, 6, 16, 42), datetime.datetime(2026, 6, 4, 6, 16, 41), 'salt', 1.8, 100.68, None, 28.79, 150.47, -0.1, 821.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:17:00.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:17:00.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:17:00.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:16:41, diff=19.586453s, valid=True
2026-06-04T06:17:00.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:17:00.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:17:00.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:17:12, diff=-11.410006s, valid=True
2026-06-04T06:17:00.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:17:00.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:17:00.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:16:35, diff=25.598319s, valid=True
2026-06-04T06:17:00.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:17:00.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:17:00.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:17:00.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:17:00.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:17:00.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:17:00.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:17:12, diff=-11.397906s, valid=True
2026-06-04T06:17:00.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:17:00.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:17:00.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:17:00.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120817.602917s, valid=True
2026-06-04T06:17:00.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:17:00.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:17:00.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:17:00.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:17:00.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:17:00.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:17:00.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:17:00.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:17:00.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:17:00.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:17:00.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:17:00.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:17:00.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:17:00.922 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:17:01.130 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:17:01.473 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:17:01.574 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:17:01.575 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:17:01.575 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:17:01.778 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:17:01.778 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:17:31.809 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:17:31.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:17:31.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:17:31.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:17:31.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:17:32.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:17:32.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:17:32.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:17:32.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:17:32.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:17:32.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:17:32.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:17:32.244 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:17:34.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:17:34.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:17:34.660 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:17:34.660 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:17:34.670 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:17:34.683 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:17:34.684 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:17:34.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:17:34.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:17:34.685 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:17:34.685 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:17:34.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:17:34.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:17:34.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:17:34.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:17:34.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:17:34.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:17:34.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:17:35.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-06-04T06:17:35.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:17:35.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:17:35.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:17:35.014 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:17:35.090 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:17:12
2026-06-04T06:17:35.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88142, datetime.datetime(2026, 6, 4, 6, 17, 12), datetime.datetime(2026, 6, 4, 6, 17, 11), 'salt', 1.87, 100.74, None, 28.37, 151.74, -0.1, 821.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:17:35.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:17:35.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:17:35.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:17:11, diff=24.09764s, valid=True
2026-06-04T06:17:35.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:17:35.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:17:35.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:17:12, diff=23.10109s, valid=True
2026-06-04T06:17:35.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:17:35.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:17:35.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:17:06, diff=29.109165s, valid=True
2026-06-04T06:17:35.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:17:35.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:17:35.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:17:35.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:17:35.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:17:35.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-06-04T06:17:35.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:17:12, diff=23.112737s, valid=True
2026-06-04T06:17:35.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:17:35.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:17:35.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:17:35.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120852.113505s, valid=True
2026-06-04T06:17:35.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:17:35.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:17:35.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:17:35.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:17:35.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:17:35.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:17:35.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:17:35.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:17:35.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:17:35.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:17:35.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:17:35.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:17:35.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:17:35.510 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:17:35.720 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:17:36.065 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:17:36.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:17:36.168 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:17:36.168 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:17:36.364 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:17:36.364 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:18:06.365 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:18:06.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:18:06.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:18:06.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:18:06.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:18:06.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:18:06.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:18:06.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:18:06.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:18:06.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:18:06.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:18:06.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:18:06.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:18:09.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:18:09.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:18:09.373 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:18:09.373 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:18:09.383 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:18:09.396 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:18:09.397 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:18:09.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:18:09.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:18:09.398 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:18:09.398 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:18:09.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:18:09.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:18:09.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:18:09.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:18:09.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:18:09.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:18:09.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:18:09.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:18:09.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:18:09.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:18:09.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:18:09.741 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:18:09.813 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:17:42
2026-06-04T06:18:09.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88143, datetime.datetime(2026, 6, 4, 6, 17, 42), datetime.datetime(2026, 6, 4, 6, 17, 41), 'salt', 1.83, 100.64, None, 28.9, 152.54, -0.09, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:18:09.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:18:09.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:18:09.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:17:41, diff=28.821079s, valid=True
2026-06-04T06:18:09.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:18:09.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:18:09.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:18:12, diff=-2.175361s, valid=True
2026-06-04T06:18:09.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:18:09.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:18:09.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:17:36, diff=33.837299s, valid=True
2026-06-04T06:18:09.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:18:09.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:18:09.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:18:09.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:18:09.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:18:09.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:18:09.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:18:12, diff=-2.155391s, valid=True
2026-06-04T06:18:09.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:18:09.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:18:09.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:18:09.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120886.846014s, valid=True
2026-06-04T06:18:09.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:18:09.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:18:09.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:18:09.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:18:09.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:18:09.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:18:09.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:18:09.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:18:09.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:18:09.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:18:10.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:18:10.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:18:10.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:18:10.185 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:18:10.393 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:18:10.763 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:18:10.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:18:10.873 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:18:10.873 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:18:11.088 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:18:11.089 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:18:41.119 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:18:41.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:18:41.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:18:41.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:18:41.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:18:41.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:18:41.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:18:41.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:18:41.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:18:41.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:18:41.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:18:41.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:18:41.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:18:43.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:18:43.972 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:18:43.973 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:18:43.973 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:18:43.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:18:43.995 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:18:43.995 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:18:43.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:18:43.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:18:43.997 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:18:43.997 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:18:44.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:18:44.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:18:44.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:18:44.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:18:44.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:18:44.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:18:44.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:18:44.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:18:44.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:18:44.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:18:44.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:18:44.351 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:18:44.427 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:18:43
2026-06-04T06:18:44.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88145, datetime.datetime(2026, 6, 4, 6, 18, 43), datetime.datetime(2026, 6, 4, 6, 18, 42), 'salt', 1.83, 100.61, None, 33.1, 147.67, -0.09, 821.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:18:44.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:18:44.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:18:44.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:18:42, diff=2.43454s, valid=True
2026-06-04T06:18:44.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:18:44.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:18:44.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:19:12, diff=-27.561982s, valid=True
2026-06-04T06:18:44.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:18:44.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:18:44.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:18:37, diff=7.44627s, valid=True
2026-06-04T06:18:44.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:18:44.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:18:44.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:18:44.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:18:44.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:18:44.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:18:44.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:19:12, diff=-27.549966s, valid=True
2026-06-04T06:18:44.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:18:44.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:18:44.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:18:44.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120921.450845s, valid=True
2026-06-04T06:18:44.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:18:44.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:18:44.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:18:44.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:18:44.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:18:44.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:18:44.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:18:44.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:18:44.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:18:44.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:18:44.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:18:44.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:18:44.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:18:44.841 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:18:45.051 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:18:45.400 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:18:45.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:18:45.503 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:18:45.503 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:18:45.694 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:18:45.694 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:19:15.708 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:19:15.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:19:15.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:19:16.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:19:16.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:19:16.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:19:16.274 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:19:16.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:19:16.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:19:16.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:19:16.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:19:16.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:19:16.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:19:18.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:19:18.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:19:18.778 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:19:18.778 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:19:18.789 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:19:18.802 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:19:18.803 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:19:18.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:19:18.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:19:18.804 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:19:18.804 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:19:18.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:19:18.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:19:18.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:19:19.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:19:19.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:19:19.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:19:19.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:19:19.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:19:19.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:19:19.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:19:19.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:19:19.147 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:19:19.218 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:19:13
2026-06-04T06:19:19.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88146, datetime.datetime(2026, 6, 4, 6, 19, 13), datetime.datetime(2026, 6, 4, 6, 19, 12), 'salt', 1.73, 100.61, None, 30.59, 141.19, -0.09, 821.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:19:19.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:19:19.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:19:19.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:19:12, diff=7.225352s, valid=True
2026-06-04T06:19:19.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:19:19.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:19:19.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:19:12, diff=7.22856s, valid=True
2026-06-04T06:19:19.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:19:19.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:19:19.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:19:07, diff=12.236226s, valid=True
2026-06-04T06:19:19.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:19:19.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:19:19.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:19:19.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:19:19.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:19:19.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:19:19.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:19:12, diff=7.23966s, valid=True
2026-06-04T06:19:19.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:19:19.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:19:19.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:19:19.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120956.240406s, valid=True
2026-06-04T06:19:19.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:19:19.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:19:19.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:19:19.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:19:19.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:19:19.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:19:19.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:19:19.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:19:19.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:19:19.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:19:19.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:19:19.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:19:19.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:19:19.558 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:19:19.766 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:19:20.130 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:19:20.233 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:19:20.234 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:19:20.234 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:19:20.438 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:19:20.438 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:19:50.468 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:19:50.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:19:50.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:19:50.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:19:50.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:19:51.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:19:51.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:19:51.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:19:51.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:19:51.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:19:51.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:19:51.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:19:51.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:19:53.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:19:53.525 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:19:53.526 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:19:53.526 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:19:53.536 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:19:53.549 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:19:53.549 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:19:53.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:19:53.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:19:53.550 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:19:53.551 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:19:53.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:19:53.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:19:53.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:19:53.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:19:53.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:19:53.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T06:19:53.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:19:53.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T06:19:53.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:19:53.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:19:53.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:19:53.878 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:19:53.956 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:19:43
2026-06-04T06:19:53.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88147, datetime.datetime(2026, 6, 4, 6, 19, 43), datetime.datetime(2026, 6, 4, 6, 19, 42), 'salt', 1.87, 100.68, None, 33.45, 153.17, -0.09, 821.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:19:53.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:19:53.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:19:53.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:19:42, diff=11.963723s, valid=True
2026-06-04T06:19:53.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:19:53.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T06:19:53.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:20:12, diff=-18.032839s, valid=True
2026-06-04T06:19:53.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:19:53.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:19:53.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:19:37, diff=16.975351s, valid=True
2026-06-04T06:19:53.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:19:53.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:19:53.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:19:53.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:19:53.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:19:53.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T06:19:53.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:20:12, diff=-18.02097s, valid=True
2026-06-04T06:19:53.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:19:53.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:19:53.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:19:53.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=120990.979841s, valid=True
2026-06-04T06:19:53.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:19:53.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:19:53.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:19:53.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:19:53.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:19:54.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:19:54.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:19:54.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:19:54.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:19:54.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:19:54.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:19:54.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:19:54.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:19:54.366 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:19:54.575 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:19:54.919 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:19:55.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:19:55.021 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:19:55.021 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:19:55.295 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:19:55.295 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:20:25.307 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:20:25.308 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:20:25.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:20:25.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:20:25.619 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:20:25.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:20:25.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:20:25.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:20:25.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:20:25.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:20:25.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:20:25.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:20:25.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:20:28.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:20:28.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:20:28.419 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:20:28.419 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:20:28.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:20:28.445 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:20:28.446 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:20:28.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:20:28.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:20:28.448 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:20:28.449 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:20:28.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:20:28.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:20:28.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:20:28.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:20:28.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:20:28.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T06:20:28.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:20:28.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T06:20:28.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:20:28.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:20:28.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:20:28.792 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:20:28.867 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:20:13
2026-06-04T06:20:28.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88148, datetime.datetime(2026, 6, 4, 6, 20, 13), datetime.datetime(2026, 6, 4, 6, 20, 13), 'salt', 1.87, 100.71, None, 39.23, 142.08, -0.1, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:20:28.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:20:28.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:20:28.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:20:13, diff=15.874453s, valid=True
2026-06-04T06:20:28.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:20:28.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T06:20:28.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:20:12, diff=16.877956s, valid=True
2026-06-04T06:20:28.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:20:28.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:20:28.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:20:08, diff=20.886183s, valid=True
2026-06-04T06:20:28.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:20:28.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:20:28.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:20:28.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:20:28.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:20:28.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T06:20:28.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:20:12, diff=16.889937s, valid=True
2026-06-04T06:20:28.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:20:28.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:20:28.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:20:28.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121025.890749s, valid=True
2026-06-04T06:20:28.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:20:28.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:20:28.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:20:28.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:20:28.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:20:28.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:20:28.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:20:28.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:20:28.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:20:29.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:20:29.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:20:29.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:20:29.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:20:29.217 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:20:29.427 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:20:29.771 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:20:29.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:20:29.886 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:20:29.886 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:20:30.077 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:20:30.078 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:21:00.107 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:21:00.107 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:21:00.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:21:00.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:21:00.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:21:00.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:21:00.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:21:00.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:21:00.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:21:00.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:21:00.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:21:00.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:21:00.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:21:03.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:21:03.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:21:03.148 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:21:03.149 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:21:03.160 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:21:03.173 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:21:03.174 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:21:03.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:21:03.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:21:03.175 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:21:03.176 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:21:03.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:21:03.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:21:03.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:21:03.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:21:03.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:21:03.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T06:21:03.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:21:03.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T06:21:03.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:21:03.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:21:03.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:21:03.509 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:21:03.583 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:20:44
2026-06-04T06:21:03.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88149, datetime.datetime(2026, 6, 4, 6, 20, 44), datetime.datetime(2026, 6, 4, 6, 20, 43), 'salt', 1.83, 100.68, None, 33.31, 142.39, -0.1, 821.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:21:03.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:21:03.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:21:03.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:20:43, diff=20.591131s, valid=True
2026-06-04T06:21:03.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:21:03.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T06:21:03.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:21:12, diff=-8.405208s, valid=True
2026-06-04T06:21:03.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:21:03.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:21:03.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:20:38, diff=25.603278s, valid=True
2026-06-04T06:21:03.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:21:03.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:21:03.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:21:03.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:21:03.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:21:03.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T06:21:03.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:21:12, diff=-8.392865s, valid=True
2026-06-04T06:21:03.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:21:03.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:21:03.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:21:03.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121060.607987s, valid=True
2026-06-04T06:21:03.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:21:03.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:21:03.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:21:03.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:21:03.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:21:03.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:21:03.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:21:03.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:21:03.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:21:03.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:21:03.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:21:03.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:21:03.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:21:03.936 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:21:04.145 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:21:04.488 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:21:04.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:21:04.589 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:21:04.590 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:21:04.775 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:21:04.775 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:21:34.805 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:21:34.806 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:21:34.806 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:21:35.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:21:35.117 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:21:35.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:21:35.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:21:35.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:21:35.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:21:35.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:21:35.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:21:35.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:21:35.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:21:37.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:21:37.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:21:37.673 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:21:37.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:21:37.685 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:21:37.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:21:37.698 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:21:37.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:21:37.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:21:37.700 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:21:37.700 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:21:37.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:21:37.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:21:37.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:21:37.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:21:37.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:21:37.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T06:21:37.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:21:38.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T06:21:38.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:21:38.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:21:38.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:21:38.041 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:21:38.112 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:21:14
2026-06-04T06:21:38.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88150, datetime.datetime(2026, 6, 4, 6, 21, 14), datetime.datetime(2026, 6, 4, 6, 21, 13), 'salt', 1.87, 100.74, None, 33.73, 154.49, -0.1, 821.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:21:38.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:21:38.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:21:38.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:21:13, diff=25.119019s, valid=True
2026-06-04T06:21:38.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:21:38.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T06:21:38.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:21:12, diff=26.121943s, valid=True
2026-06-04T06:21:38.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:21:38.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:21:38.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:21:08, diff=30.128706s, valid=True
2026-06-04T06:21:38.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:21:38.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:21:38.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:21:38.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:21:38.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:21:38.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T06:21:38.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:21:12, diff=26.13177s, valid=True
2026-06-04T06:21:38.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:21:38.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:21:38.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:21:38.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121095.132445s, valid=True
2026-06-04T06:21:38.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:21:38.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:21:38.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:21:38.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:21:38.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:21:38.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:21:38.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:21:38.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:21:38.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:21:38.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:21:38.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:21:38.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:21:38.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:21:38.451 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:21:38.683 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:21:39.097 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:21:39.198 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:21:39.198 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:21:39.198 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:21:39.385 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:21:39.385 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:22:09.415 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:22:09.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:22:09.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:22:10.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:22:10.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:22:10.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:22:10.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:22:10.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:22:10.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:22:10.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:22:10.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:22:10.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:22:10.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:22:12.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:22:12.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:22:12.731 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:22:12.732 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:22:12.742 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:22:12.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:22:12.755 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:22:12.756 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:22:12.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:22:12.757 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:22:12.757 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:22:12.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:22:12.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:22:12.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:22:12.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:22:12.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:22:13.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T06:22:13.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:22:13.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T06:22:13.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:22:13.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:22:13.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:22:13.065 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:22:13.137 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:21:44
2026-06-04T06:22:13.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88151, datetime.datetime(2026, 6, 4, 6, 21, 44), datetime.datetime(2026, 6, 4, 6, 21, 43), 'salt', 1.9, 100.74, None, 36.17, 151.69, -0.1, 821.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:22:13.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:22:13.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:22:13.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:21:43, diff=30.144891s, valid=True
2026-06-04T06:22:13.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:22:13.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T06:22:13.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:22:12, diff=1.148222s, valid=True
2026-06-04T06:22:13.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:22:13.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:22:13.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:21:39, diff=34.156019s, valid=True
2026-06-04T06:22:13.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:22:13.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:22:13.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:22:13.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:22:13.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:22:13.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T06:22:13.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:22:12, diff=1.159594s, valid=True
2026-06-04T06:22:13.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:22:13.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:22:13.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:22:13.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121130.160363s, valid=True
2026-06-04T06:22:13.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:22:13.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:22:13.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:22:13.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:22:13.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:22:13.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:22:13.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:22:13.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:22:13.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:22:13.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:22:13.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:22:13.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:22:13.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:22:13.482 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:22:13.695 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:22:14.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:22:14.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:22:14.146 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:22:14.146 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:22:14.403 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:22:14.403 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:22:44.428 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:22:44.428 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:22:44.428 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:22:44.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:22:44.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:22:44.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:22:44.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:22:44.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:22:44.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:22:44.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:22:44.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:22:44.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:22:44.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:22:47.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:22:47.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:22:47.589 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:22:47.589 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:22:47.602 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:22:47.615 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:22:47.615 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:22:47.616 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:22:47.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:22:47.616 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:22:47.617 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:22:47.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:22:47.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:22:47.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:22:47.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:22:47.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:22:47.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:22:47.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:22:47.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:22:47.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:22:47.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:22:47.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:22:47.960 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:22:48.032 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:22:45
2026-06-04T06:22:48.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88153, datetime.datetime(2026, 6, 4, 6, 22, 45), datetime.datetime(2026, 6, 4, 6, 22, 44), 'salt', 1.83, 100.74, None, 34.47, 145.09, -0.11, 820.99, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:22:48.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:22:48.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:22:48.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:22:44, diff=4.040146s, valid=True
2026-06-04T06:22:48.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:22:48.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:22:48.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:23:12, diff=-23.956303s, valid=True
2026-06-04T06:22:48.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:22:48.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:22:48.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:22:39, diff=9.05178s, valid=True
2026-06-04T06:22:48.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:22:48.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:22:48.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:22:48.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:22:48.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:22:48.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:22:48.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:23:12, diff=-23.943939s, valid=True
2026-06-04T06:22:48.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:22:48.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:22:48.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:22:48.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121165.056923s, valid=True
2026-06-04T06:22:48.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:22:48.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:22:48.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:22:48.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:22:48.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:22:48.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:22:48.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:22:48.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:22:48.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:22:48.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:22:48.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:22:48.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:22:48.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:22:48.381 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:22:48.670 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:22:49.035 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:22:49.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:22:49.138 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:22:49.138 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:22:49.346 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:22:49.346 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:23:19.365 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:23:19.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:23:19.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:23:19.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:23:19.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:23:19.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:23:19.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:23:19.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:23:19.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:23:19.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:23:19.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:23:19.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:23:19.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:23:22.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:23:22.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:23:22.194 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:23:22.194 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:23:22.206 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:23:22.219 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:23:22.220 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:23:22.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:23:22.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:23:22.221 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:23:22.221 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:23:22.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:23:22.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:23:22.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:23:22.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:23:22.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:23:22.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:23:22.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:23:22.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:23:22.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:23:22.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:23:22.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:23:22.535 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:23:22.608 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:23:15
2026-06-04T06:23:22.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88154, datetime.datetime(2026, 6, 4, 6, 23, 15), datetime.datetime(2026, 6, 4, 6, 23, 14), 'salt', 1.8, 100.71, None, 37.58, 143.0, -0.1, 821.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:23:22.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:23:22.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:23:22.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:23:14, diff=8.615884s, valid=True
2026-06-04T06:23:22.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:23:22.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:23:22.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:23:12, diff=10.619254s, valid=True
2026-06-04T06:23:22.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:23:22.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:23:22.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:23:09, diff=13.627308s, valid=True
2026-06-04T06:23:22.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:23:22.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:23:22.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:23:22.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:23:22.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:23:22.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:23:22.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:23:12, diff=10.630918s, valid=True
2026-06-04T06:23:22.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:23:22.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:23:22.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:23:22.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121199.631697s, valid=True
2026-06-04T06:23:22.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:23:22.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:23:22.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:23:22.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:23:22.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:23:22.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:23:22.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:23:22.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:23:22.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:23:22.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:23:22.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:23:22.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:23:22.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:23:22.952 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:23:23.162 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:23:23.517 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:23:23.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:23:23.621 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:23:23.621 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:23:23.814 [WARNING] [MainThread] [clean.py] [copy_files()] Error uploading images and files to the web server: rsync: [sender] read errors mapping "/home/io/development/weatherplots/weatherplots/images/atlas/ref_zp.dat": No data available (61)
WARNING: atlas/ref_zp.dat failed verification -- update discarded (will try again).
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1338) [sender=3.2.7]

2026-06-04T06:23:23.814 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:23:53.844 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:23:53.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:23:53.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:23:54.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:23:54.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:23:54.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:23:54.274 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:23:54.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:23:54.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:23:54.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:23:54.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:23:54.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:23:54.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:23:56.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:23:56.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:23:56.855 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:23:56.855 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:23:56.864 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:23:56.875 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:23:56.876 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:23:56.876 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:23:56.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:23:56.876 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:23:56.876 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:23:56.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:23:57.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:23:57.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:23:57.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:23:57.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:23:57.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:23:57.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:23:57.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:23:57.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:23:57.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:23:57.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:23:57.205 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:23:57.277 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:23:45
2026-06-04T06:23:57.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88155, datetime.datetime(2026, 6, 4, 6, 23, 45), datetime.datetime(2026, 6, 4, 6, 23, 44), 'salt', 1.77, 100.74, None, 37.82, 129.89, -0.1, 821.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:23:57.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:23:57.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:23:57.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:23:44, diff=13.28479s, valid=True
2026-06-04T06:23:57.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:23:57.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:23:57.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:24:12, diff=-14.711718s, valid=True
2026-06-04T06:23:57.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:23:57.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:23:57.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:23:39, diff=18.296688s, valid=True
2026-06-04T06:23:57.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:23:57.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:23:57.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:23:57.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:23:57.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:23:57.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:23:57.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:24:12, diff=-14.699597s, valid=True
2026-06-04T06:23:57.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:23:57.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:23:57.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:23:57.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121234.301225s, valid=True
2026-06-04T06:23:57.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:23:57.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:23:57.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:23:57.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:23:57.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:23:57.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:23:57.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:23:57.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:23:57.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:23:57.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:23:57.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:23:57.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:23:57.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:23:57.691 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:23:57.918 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:23:58.266 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:23:58.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:23:58.368 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:23:58.368 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:23:58.555 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:23:58.555 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:24:28.585 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:24:28.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:24:28.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:24:28.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:24:28.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:24:29.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:24:29.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:24:29.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:24:29.163 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:24:29.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:24:29.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:24:29.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:24:29.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:24:31.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:24:31.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:24:31.602 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:24:31.603 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:24:31.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:24:31.627 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:24:31.628 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:24:31.628 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:24:31.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:24:31.629 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:24:31.629 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:24:31.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:24:31.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:24:31.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:24:31.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:24:31.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:24:31.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:24:31.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:24:31.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:24:31.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:24:31.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:24:31.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:24:31.970 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:24:32.044 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:24:15
2026-06-04T06:24:32.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88156, datetime.datetime(2026, 6, 4, 6, 24, 15), datetime.datetime(2026, 6, 4, 6, 24, 15), 'salt', 1.8, 100.74, None, 39.98, 141.87, -0.1, 821.05, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:24:32.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:24:32.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:24:32.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:24:15, diff=17.05213s, valid=True
2026-06-04T06:24:32.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:24:32.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:24:32.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:24:12, diff=20.055651s, valid=True
2026-06-04T06:24:32.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:24:32.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:24:32.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:24:10, diff=22.064104s, valid=True
2026-06-04T06:24:32.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:24:32.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:24:32.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:24:32.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:24:32.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:24:32.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:24:32.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:24:12, diff=20.067848s, valid=True
2026-06-04T06:24:32.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:24:32.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:24:32.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:24:32.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121269.068652s, valid=True
2026-06-04T06:24:32.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:24:32.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:24:32.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:24:32.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:24:32.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:24:32.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:24:32.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:24:32.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:24:32.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:24:32.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:24:32.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:24:32.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:24:32.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:24:32.387 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:24:32.595 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:24:32.939 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:24:33.040 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:24:33.040 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:24:33.040 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:24:33.306 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:24:33.306 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:25:03.323 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:25:03.323 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:25:03.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:25:03.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:25:03.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:25:03.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:25:03.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:25:03.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:25:03.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:25:04.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:25:04.012 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:25:04.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:25:04.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:25:06.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:25:06.484 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:25:06.485 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:25:06.485 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:25:06.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:25:06.516 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:25:06.516 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:25:06.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:25:06.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:25:06.516 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:25:06.516 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:25:06.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:25:06.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:25:06.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:25:06.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:25:06.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:25:06.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:25:06.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:25:06.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:25:06.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:25:06.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:25:06.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:25:06.833 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:25:06.905 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:24:46
2026-06-04T06:25:06.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88157, datetime.datetime(2026, 6, 4, 6, 24, 46), datetime.datetime(2026, 6, 4, 6, 24, 45), 'salt', 1.77, 100.68, None, 30.91, 139.19, -0.09, 821.11, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:25:06.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:25:06.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:25:06.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:24:45, diff=21.912254s, valid=True
2026-06-04T06:25:06.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:25:06.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:25:06.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:25:12, diff=-5.084301s, valid=True
2026-06-04T06:25:06.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:25:06.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:25:06.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:24:40, diff=26.923531s, valid=True
2026-06-04T06:25:06.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:25:06.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:25:06.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:25:06.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:25:06.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:25:06.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:25:06.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:25:12, diff=-5.072908s, valid=True
2026-06-04T06:25:06.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:25:06.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:25:06.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:25:06.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121303.927876s, valid=True
2026-06-04T06:25:06.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:25:06.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:25:06.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:25:06.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:25:06.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:25:06.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:25:06.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:25:06.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:25:07.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:25:07.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:25:07.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:25:07.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:25:07.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:25:07.312 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:25:07.521 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:25:07.864 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:25:07.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:25:07.966 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:25:07.966 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:25:08.237 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:25:08.238 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:25:38.268 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:25:38.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:25:38.268 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:25:38.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:25:38.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:25:38.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:25:38.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:25:38.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:25:38.792 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:25:38.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:25:38.806 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:25:38.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:25:38.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:25:41.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:25:41.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:25:41.195 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:25:41.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:25:41.206 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:25:41.220 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:25:41.221 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:25:41.221 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:25:41.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:25:41.222 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:25:41.223 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:25:41.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:25:41.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:25:41.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:25:41.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:25:41.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:25:41.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:25:41.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:25:41.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:25:41.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:25:41.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:25:41.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:25:41.559 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:25:41.632 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:25:16
2026-06-04T06:25:41.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88158, datetime.datetime(2026, 6, 4, 6, 25, 16), datetime.datetime(2026, 6, 4, 6, 25, 16), 'salt', 1.73, 100.64, None, 38.74, 135.46, -0.09, 821.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:25:41.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:25:41.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:25:41.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:25:16, diff=25.64012s, valid=True
2026-06-04T06:25:41.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:25:41.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:25:41.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:25:12, diff=29.643669s, valid=True
2026-06-04T06:25:41.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:25:41.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:25:41.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:25:10, diff=31.651856s, valid=True
2026-06-04T06:25:41.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:25:41.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:25:41.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:25:41.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:25:41.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:25:41.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:25:41.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:25:12, diff=29.655612s, valid=True
2026-06-04T06:25:41.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:25:41.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:25:41.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:25:41.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121338.65642s, valid=True
2026-06-04T06:25:41.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:25:41.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:25:41.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:25:41.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:25:41.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:25:41.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:25:41.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:25:41.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:25:41.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:25:41.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:25:41.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:25:41.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:25:41.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:25:42.001 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:25:42.210 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:25:42.560 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:25:42.661 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:25:42.662 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:25:42.662 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:25:42.751 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:25:42.752 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:26:12.782 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:26:12.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:26:12.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:26:12.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:26:12.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:26:13.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:26:13.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:26:13.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:26:13.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:26:13.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:26:13.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:26:13.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:26:13.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:26:15.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:26:15.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:26:15.611 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:26:15.611 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:26:15.621 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:26:15.634 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:26:15.635 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:26:15.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:26:15.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:26:15.636 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:26:15.636 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:26:15.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:26:15.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:26:15.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:26:15.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:26:15.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:26:15.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:26:15.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:26:15.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:26:15.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:26:15.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:26:15.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:26:15.915 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:26:15.989 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:25:47
2026-06-04T06:26:15.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88159, datetime.datetime(2026, 6, 4, 6, 25, 47), datetime.datetime(2026, 6, 4, 6, 25, 46), 'salt', 1.83, 100.71, None, 33.31, 137.76, -0.1, 821.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:26:15.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:26:15.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:26:15.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:25:46, diff=29.995808s, valid=True
2026-06-04T06:26:15.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:26:15.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:26:15.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:26:12, diff=3.998946s, valid=True
2026-06-04T06:26:15.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:26:15.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:26:16.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:25:40, diff=36.006303s, valid=True
2026-06-04T06:26:16.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:26:16.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:26:16.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:26:16.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:26:16.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:26:16.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:26:16.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:26:12, diff=4.009761s, valid=True
2026-06-04T06:26:16.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:26:16.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:26:16.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:26:16.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121373.0105s, valid=True
2026-06-04T06:26:16.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:26:16.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:26:16.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:26:16.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:26:16.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:26:16.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:26:16.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:26:16.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:26:16.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:26:16.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:26:16.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:26:16.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:26:16.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:26:16.326 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:26:16.535 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:26:16.877 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:26:16.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:26:16.979 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:26:16.979 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:26:17.067 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:26:17.067 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:26:47.098 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:26:47.098 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:26:47.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:26:47.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:26:47.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:26:47.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:26:47.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:26:47.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:26:47.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:26:47.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:26:47.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:26:47.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:26:47.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:26:50.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:26:50.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:26:50.363 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:26:50.363 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:26:50.372 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:26:50.386 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:26:50.386 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:26:50.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:26:50.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:26:50.387 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:26:50.388 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:26:50.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:26:50.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:26:50.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:26:50.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:26:50.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:26:50.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:26:50.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:26:50.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:26:50.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:26:50.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:26:50.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:26:50.730 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:26:50.806 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:26:47
2026-06-04T06:26:50.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88161, datetime.datetime(2026, 6, 4, 6, 26, 47), datetime.datetime(2026, 6, 4, 6, 26, 47), 'salt', 1.83, 100.74, None, 41.1, 140.6, -0.11, 821.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:26:50.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:26:50.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:26:50.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:26:47, diff=3.813766s, valid=True
2026-06-04T06:26:50.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:26:50.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:26:50.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:27:12, diff=-21.182651s, valid=True
2026-06-04T06:26:50.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:26:50.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:26:50.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:26:41, diff=9.82549s, valid=True
2026-06-04T06:26:50.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:26:50.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:26:50.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:26:50.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:26:50.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:26:50.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:26:50.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:27:12, diff=-21.170759s, valid=True
2026-06-04T06:26:50.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:26:50.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:26:50.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:26:50.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121407.830063s, valid=True
2026-06-04T06:26:50.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:26:50.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:26:50.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:26:50.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:26:50.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:26:50.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:26:50.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:26:50.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:26:50.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:26:50.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:26:51.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:26:51.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:26:51.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:26:51.150 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:26:51.417 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:26:51.758 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:26:51.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:26:51.859 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:26:51.859 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:26:52.056 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:26:52.056 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:27:22.087 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:27:22.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:27:22.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:27:22.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:27:22.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:27:22.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:27:22.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:27:22.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:27:22.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:27:22.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:27:22.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:27:22.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:27:22.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:27:25.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:27:25.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:27:25.145 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:27:25.145 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:27:25.155 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:27:25.168 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:27:25.170 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:27:25.170 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:27:25.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:27:25.171 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:27:25.171 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:27:25.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:27:25.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:27:25.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:27:25.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:27:25.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:27:25.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:27:25.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:27:25.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:27:25.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:27:25.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:27:25.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:27:25.512 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:27:25.592 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:27:18
2026-06-04T06:27:25.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88162, datetime.datetime(2026, 6, 4, 6, 27, 18), datetime.datetime(2026, 6, 4, 6, 27, 17), 'salt', 1.8, 100.68, None, 31.09, 147.79, -0.1, 821.29, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:27:25.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:27:25.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:27:25.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:27:17, diff=8.599554s, valid=True
2026-06-04T06:27:25.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:27:25.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:27:25.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:27:12, diff=13.603151s, valid=True
2026-06-04T06:27:25.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:27:25.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:27:25.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:27:11, diff=14.611288s, valid=True
2026-06-04T06:27:25.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:27:25.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:27:25.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:27:25.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:27:25.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:27:25.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:27:25.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:27:12, diff=13.614999s, valid=True
2026-06-04T06:27:25.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:27:25.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:27:25.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:27:25.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121442.615809s, valid=True
2026-06-04T06:27:25.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:27:25.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:27:25.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:27:25.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:27:25.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:27:25.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:27:25.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:27:25.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:27:25.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:27:25.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:27:25.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:27:25.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:27:25.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:27:25.935 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:27:26.142 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:27:26.484 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:27:26.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:27:26.586 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:27:26.586 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:27:26.809 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:27:26.809 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:27:56.810 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:27:56.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:27:56.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:27:56.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:27:56.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:27:57.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:27:57.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:27:57.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:27:57.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:27:57.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:27:57.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:27:57.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:27:57.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:27:59.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:27:59.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:27:59.988 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:27:59.988 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:27:59.998 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:28:00.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:28:00.010 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:28:00.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:28:00.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:28:00.010 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:28:00.011 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:28:00.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:28:00.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:28:00.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:28:00.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:28:00.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:28:00.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:28:00.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:28:00.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:28:00.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:28:00.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:28:00.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:28:00.299 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:28:00.379 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:27:48
2026-06-04T06:28:00.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88163, datetime.datetime(2026, 6, 4, 6, 27, 48), datetime.datetime(2026, 6, 4, 6, 27, 47), 'salt', 1.83, 100.74, None, 34.33, 120.61, -0.11, 821.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:28:00.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:28:00.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:28:00.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:27:47, diff=13.385893s, valid=True
2026-06-04T06:28:00.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:28:00.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:28:00.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:28:12, diff=-11.61089s, valid=True
2026-06-04T06:28:00.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:28:00.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:28:00.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:27:41, diff=19.396659s, valid=True
2026-06-04T06:28:00.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:28:00.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:28:00.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:28:00.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:28:00.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:28:00.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:28:00.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:28:12, diff=-11.599869s, valid=True
2026-06-04T06:28:00.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:28:00.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:28:00.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:28:00.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121477.400888s, valid=True
2026-06-04T06:28:00.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:28:00.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:28:00.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:28:00.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:28:00.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:28:00.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:28:00.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:28:00.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:28:00.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:28:00.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:28:00.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:28:00.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:28:00.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:28:00.791 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:28:00.999 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:28:01.367 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:28:01.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:28:01.468 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:28:01.468 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:28:01.656 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:28:01.656 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:28:31.670 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:28:31.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:28:31.671 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:28:32.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:28:32.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:28:32.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:28:32.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:28:32.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:28:32.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:28:32.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:28:32.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:28:32.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:28:32.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:28:34.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:28:34.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:28:34.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:28:34.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:28:34.746 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:28:34.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:28:34.761 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:28:34.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:28:34.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:28:34.762 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:28:34.762 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:28:34.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:28:34.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:28:34.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:28:35.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:28:35.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:28:35.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:28:35.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:28:35.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:28:35.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:28:35.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:28:35.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:28:35.108 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:28:35.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:28:18
2026-06-04T06:28:35.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88164, datetime.datetime(2026, 6, 4, 6, 28, 18), datetime.datetime(2026, 6, 4, 6, 28, 17), 'salt', 1.83, 100.78, None, 27.95, 145.21, -0.11, 821.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:28:35.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:28:35.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:28:35.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:28:17, diff=18.195861s, valid=True
2026-06-04T06:28:35.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:28:35.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:28:35.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:28:12, diff=23.199421s, valid=True
2026-06-04T06:28:35.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:28:35.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:28:35.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:28:12, diff=23.20766s, valid=True
2026-06-04T06:28:35.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:28:35.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:28:35.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:28:35.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:28:35.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:28:35.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:28:35.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:28:12, diff=23.211384s, valid=True
2026-06-04T06:28:35.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:28:35.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:28:35.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:28:35.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121512.212205s, valid=True
2026-06-04T06:28:35.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:28:35.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:28:35.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:28:35.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:28:35.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:28:35.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:28:35.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:28:35.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:28:35.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:28:35.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:28:35.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:28:35.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:28:35.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:28:35.567 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:28:35.795 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:28:36.140 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:28:36.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:28:36.242 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:28:36.242 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:28:36.329 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:28:36.329 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:29:06.360 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:29:06.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:29:06.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:29:06.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:29:06.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:29:06.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:29:06.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:29:06.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:29:06.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:29:06.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:29:06.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:29:06.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:29:06.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:29:09.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:29:09.533 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:29:09.533 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:29:09.534 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:29:09.544 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:29:09.566 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:29:09.567 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:29:09.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:29:09.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:29:09.568 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:29:09.568 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:29:09.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:29:09.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:29:09.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:29:09.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:29:09.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:29:09.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:29:09.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:29:09.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:29:09.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:29:09.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:29:09.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:29:09.946 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:29:10.022 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:28:48
2026-06-04T06:29:10.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88165, datetime.datetime(2026, 6, 4, 6, 28, 48), datetime.datetime(2026, 6, 4, 6, 28, 48), 'salt', 1.87, 100.74, None, 38.32, 140.04, -0.1, 821.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:29:10.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:29:10.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:29:10.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:28:48, diff=22.028987s, valid=True
2026-06-04T06:29:10.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:29:10.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:29:10.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:29:12, diff=-1.968149s, valid=True
2026-06-04T06:29:10.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:29:10.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:29:10.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:28:42, diff=28.038643s, valid=True
2026-06-04T06:29:10.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:29:10.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:29:10.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:29:10.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:29:10.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:29:10.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:29:10.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:29:12, diff=-1.958148s, valid=True
2026-06-04T06:29:10.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:29:10.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:29:10.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:29:10.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121547.042501s, valid=True
2026-06-04T06:29:10.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:29:10.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:29:10.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:29:10.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:29:10.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:29:10.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:29:10.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:29:10.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:29:10.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:29:10.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:29:10.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:29:10.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:29:10.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:29:10.433 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:29:10.658 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:29:11.002 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:29:11.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:29:11.104 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:29:11.104 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:29:11.305 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:29:11.305 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:29:41.314 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:29:41.314 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:29:41.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:29:41.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:29:41.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:29:41.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:29:41.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:29:41.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:29:41.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:29:41.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:29:41.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:29:41.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:29:41.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:29:44.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:29:44.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:29:44.172 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:29:44.172 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:29:44.181 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:29:44.194 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:29:44.195 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:29:44.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:29:44.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:29:44.196 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:29:44.196 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:29:44.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:29:44.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:29:44.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:29:44.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:29:44.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:29:44.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:29:44.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:29:44.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:29:44.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:29:44.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:29:44.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:29:44.539 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:29:44.614 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:29:19
2026-06-04T06:29:44.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88166, datetime.datetime(2026, 6, 4, 6, 29, 19), datetime.datetime(2026, 6, 4, 6, 29, 18), 'salt', 1.8, 100.74, None, 42.02, 145.77, -0.1, 821.11, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:29:44.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:29:44.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:29:44.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:29:18, diff=26.621593s, valid=True
2026-06-04T06:29:44.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:29:44.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:29:44.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:29:12, diff=32.625095s, valid=True
2026-06-04T06:29:44.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:29:44.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:29:44.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:29:12, diff=32.633335s, valid=True
2026-06-04T06:29:44.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:29:44.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:29:44.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:29:44.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:29:44.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:29:44.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:29:44.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:29:12, diff=32.637123s, valid=True
2026-06-04T06:29:44.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:29:44.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:29:44.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:29:44.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121581.637936s, valid=True
2026-06-04T06:29:44.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:29:44.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:29:44.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:29:44.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:29:44.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:29:44.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:29:44.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:29:44.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:29:44.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:29:44.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:29:44.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:29:44.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:29:44.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:29:44.955 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:29:45.163 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:29:45.505 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:29:45.606 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:29:45.606 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:29:45.606 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:29:45.696 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:29:45.696 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:30:15.726 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:30:15.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:30:15.726 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:30:16.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:30:16.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:30:16.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:30:16.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:30:16.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:30:16.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:30:16.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:30:16.268 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:30:16.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:30:16.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:30:18.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:30:18.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:30:18.799 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:30:18.799 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:30:18.811 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:30:18.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:30:18.824 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:30:18.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:30:18.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:30:18.825 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:30:18.825 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:30:18.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:30:18.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:30:18.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:30:19.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T06:30:19.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:30:19.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:30:19.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:30:19.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:30:19.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:30:19.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:30:19.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:30:19.162 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:30:19.236 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:29:49
2026-06-04T06:30:19.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88167, datetime.datetime(2026, 6, 4, 6, 29, 49), datetime.datetime(2026, 6, 4, 6, 29, 48), 'salt', 1.77, 100.68, None, 40.47, 134.07, -0.09, 821.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:30:19.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:30:19.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:30:19.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:29:48, diff=31.243937s, valid=True
2026-06-04T06:30:19.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:30:19.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:30:19.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:30:12, diff=7.247495s, valid=True
2026-06-04T06:30:19.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:30:19.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T06:30:19.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:29:42, diff=37.255888s, valid=True
2026-06-04T06:30:19.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:30:19.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:30:19.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:30:19.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:30:19.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:30:19.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:30:19.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:30:12, diff=7.259725s, valid=True
2026-06-04T06:30:19.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:30:19.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:30:19.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:30:19.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121616.260536s, valid=True
2026-06-04T06:30:19.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:30:19.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:30:19.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:30:19.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:30:19.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:30:19.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:30:19.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:30:19.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:30:19.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:30:19.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:30:19.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:30:19.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:30:19.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:30:19.648 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:30:19.861 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:30:20.228 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:30:20.330 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:30:20.330 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:30:20.330 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:30:20.535 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:30:20.535 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:30:50.565 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:30:50.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:30:50.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:30:50.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:30:50.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:30:50.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:30:50.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:30:50.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:30:50.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:30:50.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:30:50.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:30:51.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:30:51.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:30:53.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:30:53.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:30:53.420 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:30:53.421 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:30:53.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:30:53.444 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:30:53.445 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:30:53.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:30:53.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:30:53.446 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:30:53.446 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:30:53.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:30:53.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:30:53.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:30:53.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:30:53.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:30:53.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:30:53.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:30:53.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:30:53.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:30:53.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:30:53.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:30:53.779 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:30:53.863 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:30:49
2026-06-04T06:30:53.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88169, datetime.datetime(2026, 6, 4, 6, 30, 49), datetime.datetime(2026, 6, 4, 6, 30, 49), 'salt', 1.83, 100.74, None, 39.41, 137.2, -0.11, 821.29, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:30:53.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:30:53.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:30:53.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:30:49, diff=4.870666s, valid=True
2026-06-04T06:30:53.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:30:53.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:30:53.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:31:12, diff=-18.125999s, valid=True
2026-06-04T06:30:53.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:30:53.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:30:53.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:30:43, diff=10.881838s, valid=True
2026-06-04T06:30:53.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:30:53.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:30:53.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:30:53.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:30:53.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:30:53.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:30:53.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:31:12, diff=-18.114587s, valid=True
2026-06-04T06:30:53.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:30:53.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:30:53.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:30:53.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121650.88621s, valid=True
2026-06-04T06:30:53.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:30:53.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:30:53.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:30:53.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:30:53.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:30:53.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:30:53.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:30:53.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:30:53.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:30:54.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:30:54.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:30:54.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:30:54.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:30:54.206 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:30:54.413 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:30:54.755 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:30:54.856 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:30:54.856 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:30:54.856 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:30:55.055 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:30:55.055 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:31:25.085 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:31:25.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:31:25.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:31:25.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:31:25.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:31:25.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:31:25.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:31:25.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:31:25.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:31:25.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:31:25.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:31:25.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:31:25.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:31:29.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:31:29.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:31:29.011 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:31:29.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:31:29.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:31:29.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:31:29.036 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:31:29.036 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:31:29.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:31:29.037 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:31:29.037 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:31:29.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:31:29.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:31:29.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:31:29.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:31:29.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:31:29.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:31:29.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:31:29.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:31:29.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:31:29.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:31:29.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:31:29.389 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:31:29.464 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:31:20
2026-06-04T06:31:29.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88170, datetime.datetime(2026, 6, 4, 6, 31, 20), datetime.datetime(2026, 6, 4, 6, 31, 19), 'salt', 1.8, 100.74, None, 36.34, 143.52, -0.1, 821.29, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:31:29.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:31:29.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:31:29.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:31:19, diff=10.472059s, valid=True
2026-06-04T06:31:29.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:31:29.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:31:29.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:31:12, diff=17.475539s, valid=True
2026-06-04T06:31:29.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:31:29.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:31:29.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:31:13, diff=16.483822s, valid=True
2026-06-04T06:31:29.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:31:29.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:31:29.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:31:29.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:31:29.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:31:29.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:31:29.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:31:12, diff=17.487571s, valid=True
2026-06-04T06:31:29.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:31:29.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:31:29.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:31:29.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121686.48839s, valid=True
2026-06-04T06:31:29.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:31:29.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:31:29.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:31:29.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:31:29.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:31:29.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:31:29.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:31:29.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:31:29.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:31:29.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:31:29.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:31:29.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:31:29.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:31:29.807 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:31:30.034 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:31:30.387 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:31:30.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:31:30.488 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:31:30.488 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:31:30.680 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:31:30.680 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:32:00.694 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:32:00.694 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:32:00.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:32:00.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:32:00.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:32:01.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:32:01.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:32:01.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:32:01.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:32:01.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:32:01.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:32:01.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:32:01.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:32:03.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:32:03.600 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:32:03.601 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:32:03.601 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:32:03.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:32:03.626 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:32:03.627 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:32:03.628 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:32:03.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:32:03.628 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:32:03.628 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:32:03.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:32:03.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:32:03.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:32:03.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:32:03.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:32:03.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:32:03.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:32:03.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:32:03.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:32:03.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:32:03.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:32:03.972 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:32:04.044 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:31:50
2026-06-04T06:32:04.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88171, datetime.datetime(2026, 6, 4, 6, 31, 50), datetime.datetime(2026, 6, 4, 6, 31, 49), 'salt', 1.8, 100.74, None, 33.63, 139.55, -0.1, 821.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:32:04.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:32:04.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:32:04.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:31:49, diff=15.051431s, valid=True
2026-06-04T06:32:04.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:32:04.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:32:04.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:32:12, diff=-7.945059s, valid=True
2026-06-04T06:32:04.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:32:04.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:32:04.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:31:44, diff=20.063248s, valid=True
2026-06-04T06:32:04.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:32:04.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:32:04.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:32:04.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:32:04.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:32:04.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:32:04.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:32:12, diff=-7.932964s, valid=True
2026-06-04T06:32:04.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:32:04.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:32:04.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:32:04.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121721.067869s, valid=True
2026-06-04T06:32:04.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:32:04.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:32:04.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:32:04.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:32:04.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:32:04.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:32:04.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:32:04.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:32:04.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:32:04.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:32:04.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:32:04.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:32:04.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:32:04.388 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:32:04.598 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:32:05.003 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:32:05.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:32:05.105 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:32:05.105 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:32:05.317 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:32:05.317 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:32:35.340 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:32:35.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:32:35.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:32:35.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:32:35.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:32:35.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:32:35.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:32:35.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:32:35.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:32:35.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:32:35.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:32:35.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:32:35.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:32:38.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:32:38.409 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:32:38.410 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:32:38.411 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:32:38.420 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:32:38.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:32:38.433 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:32:38.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:32:38.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:32:38.434 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:32:38.434 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:32:38.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:32:38.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:32:38.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:32:38.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:32:38.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:32:38.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:32:38.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:32:38.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:32:38.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:32:38.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:32:38.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:32:38.779 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:32:38.848 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:32:20
2026-06-04T06:32:38.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88172, datetime.datetime(2026, 6, 4, 6, 32, 20), datetime.datetime(2026, 6, 4, 6, 32, 19), 'salt', 1.83, 100.74, None, 30.66, 144.34, -0.11, 821.35, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:32:38.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:32:38.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:32:38.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:32:19, diff=19.854794s, valid=True
2026-06-04T06:32:38.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:32:38.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:32:38.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:32:12, diff=26.857735s, valid=True
2026-06-04T06:32:38.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:32:38.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:32:38.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:32:14, diff=24.864641s, valid=True
2026-06-04T06:32:38.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:32:38.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:32:38.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:32:38.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:32:38.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:32:38.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:32:38.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:32:12, diff=26.867812s, valid=True
2026-06-04T06:32:38.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:32:38.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:32:38.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:32:38.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121755.868512s, valid=True
2026-06-04T06:32:38.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:32:38.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:32:38.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:32:38.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:32:38.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:32:38.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:32:38.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:32:38.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:32:38.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:32:39.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:32:39.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:32:39.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:32:39.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:32:39.183 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:32:39.392 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:32:39.735 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:32:39.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:32:39.839 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:32:39.839 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:32:40.024 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:32:40.025 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:33:10.054 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:33:10.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:33:10.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:33:10.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:33:10.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:33:10.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:33:10.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:33:10.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:33:10.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:33:10.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:33:10.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:33:10.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:33:10.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:33:13.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:33:13.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:33:13.200 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:33:13.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:33:13.211 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:33:13.224 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:33:13.225 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:33:13.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:33:13.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:33:13.226 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:33:13.226 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:33:13.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:33:13.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:33:13.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:33:13.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:33:13.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:33:13.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:33:13.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:33:13.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:33:13.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:33:13.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:33:13.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:33:13.563 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:33:13.634 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:32:50
2026-06-04T06:33:13.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88173, datetime.datetime(2026, 6, 4, 6, 32, 50), datetime.datetime(2026, 6, 4, 6, 32, 50), 'salt', 1.83, 100.74, None, 31.76, 129.77, -0.11, 821.35, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:33:13.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:33:13.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:33:13.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:32:50, diff=23.642247s, valid=True
2026-06-04T06:33:13.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:33:13.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:33:13.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:33:12, diff=1.645731s, valid=True
2026-06-04T06:33:13.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:33:13.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:33:13.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:32:45, diff=28.653842s, valid=True
2026-06-04T06:33:13.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:33:13.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:33:13.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:33:13.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:33:13.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:33:13.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:33:13.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:33:12, diff=1.657528s, valid=True
2026-06-04T06:33:13.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:33:13.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:33:13.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:33:13.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121790.65833s, valid=True
2026-06-04T06:33:13.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:33:13.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:33:13.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:33:13.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:33:13.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:33:13.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:33:13.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:33:13.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:33:13.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:33:13.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:33:13.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:33:13.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:33:13.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:33:13.977 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:33:14.260 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:33:14.600 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:33:14.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:33:14.704 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:33:14.704 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:33:14.963 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:33:14.963 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:33:44.993 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:33:44.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:33:44.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:33:45.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:33:45.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:33:45.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:33:45.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:33:45.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:33:45.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:33:45.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:33:45.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:33:45.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:33:45.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:33:48.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:33:48.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:33:48.035 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:33:48.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:33:48.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:33:48.058 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:33:48.058 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:33:48.059 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:33:48.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:33:48.059 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:33:48.060 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:33:48.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:33:48.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:33:48.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:33:48.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:33:48.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:33:48.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:33:48.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:33:48.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:33:48.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:33:48.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:33:48.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:33:48.396 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:33:48.467 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:33:21
2026-06-04T06:33:48.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88174, datetime.datetime(2026, 6, 4, 6, 33, 21), datetime.datetime(2026, 6, 4, 6, 33, 20), 'salt', 1.83, 100.74, None, 26.99, 154.04, -0.11, 821.41, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:33:48.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:33:48.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:33:48.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:33:20, diff=28.475241s, valid=True
2026-06-04T06:33:48.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:33:48.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:33:48.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:33:12, diff=36.478722s, valid=True
2026-06-04T06:33:48.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:33:48.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:33:48.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:33:15, diff=33.486896s, valid=True
2026-06-04T06:33:48.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:33:48.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:33:48.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:33:48.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:33:48.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:33:48.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:33:48.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:33:12, diff=36.490596s, valid=True
2026-06-04T06:33:48.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:33:48.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:33:48.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:33:48.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121825.491423s, valid=True
2026-06-04T06:33:48.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:33:48.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:33:48.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:33:48.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:33:48.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:33:48.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:33:48.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:33:48.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:33:48.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:33:48.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:33:48.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:33:48.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:33:48.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:33:48.810 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:33:49.018 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:33:49.362 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:33:49.463 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:33:49.463 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:33:49.463 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:33:49.705 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:33:49.706 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:34:19.736 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:34:19.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:34:19.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:34:19.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:34:19.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:34:20.117 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:34:20.117 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:34:20.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:34:20.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:34:20.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:34:20.144 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:34:20.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:34:20.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:34:22.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:34:22.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:34:22.557 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:34:22.557 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:34:22.569 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:34:22.582 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:34:22.583 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:34:22.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:34:22.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:34:22.584 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:34:22.584 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:34:22.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:34:22.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:34:22.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:34:22.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:34:22.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:34:22.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:34:22.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:34:22.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:34:22.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:34:22.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:34:22.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:34:22.916 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:34:22.988 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:34:21
2026-06-04T06:34:22.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88176, datetime.datetime(2026, 6, 4, 6, 34, 21), datetime.datetime(2026, 6, 4, 6, 34, 20), 'salt', 1.77, 100.74, None, 38.04, 143.07, -0.1, 821.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:34:22.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:34:22.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:34:22.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:34:20, diff=2.995488s, valid=True
2026-06-04T06:34:22.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:34:22.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:34:22.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:34:12, diff=10.998946s, valid=True
2026-06-04T06:34:22.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:34:22.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:34:23.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:34:15, diff=8.007163s, valid=True
2026-06-04T06:34:23.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:34:23.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:34:23.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:34:23.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:34:23.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:34:23.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:34:23.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:34:12, diff=11.010882s, valid=True
2026-06-04T06:34:23.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:34:23.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:34:23.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:34:23.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121860.011696s, valid=True
2026-06-04T06:34:23.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:34:23.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:34:23.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:34:23.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:34:23.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:34:23.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:34:23.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:34:23.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:34:23.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:34:23.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:34:23.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:34:23.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:34:23.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:34:23.400 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:34:23.609 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:34:23.954 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:34:24.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:34:24.056 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:34:24.056 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:34:24.236 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:34:24.236 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:34:54.248 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:34:54.249 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:34:54.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:34:54.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:34:54.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:34:55.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:34:55.012 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:34:55.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:34:55.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:34:55.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:34:55.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:34:55.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:34:55.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:34:57.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:34:57.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:34:57.647 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:34:57.647 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:34:57.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:34:57.670 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:34:57.671 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:34:57.671 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:34:57.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:34:57.672 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:34:57.672 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:34:57.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:34:57.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:34:57.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:34:57.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:34:57.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:34:57.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:34:57.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:34:58.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:34:58.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:34:58.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:34:58.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:34:58.008 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:34:58.079 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:34:51
2026-06-04T06:34:58.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88177, datetime.datetime(2026, 6, 4, 6, 34, 51), datetime.datetime(2026, 6, 4, 6, 34, 51), 'salt', 1.77, 100.71, None, 30.27, 141.92, -0.1, 821.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:34:58.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:34:58.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:34:58.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:34:51, diff=7.085332s, valid=True
2026-06-04T06:34:58.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:34:58.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:34:58.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:35:12, diff=-13.911784s, valid=True
2026-06-04T06:34:58.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:34:58.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:34:58.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:34:46, diff=12.0949s, valid=True
2026-06-04T06:34:58.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:34:58.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:34:58.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:34:58.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:34:58.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:34:58.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:34:58.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:35:12, diff=-13.901765s, valid=True
2026-06-04T06:34:58.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:34:58.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:34:58.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:34:58.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121895.098921s, valid=True
2026-06-04T06:34:58.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:34:58.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:34:58.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:34:58.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:34:58.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:34:58.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:34:58.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:34:58.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:34:58.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:34:58.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:34:58.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:34:58.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:34:58.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:34:58.416 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:34:58.627 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:34:58.971 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:34:59.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:34:59.073 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:34:59.073 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:34:59.324 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:34:59.324 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:35:29.354 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:35:29.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:35:29.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:35:29.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:35:29.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:35:29.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:35:29.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:35:29.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:35:29.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:35:29.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:35:29.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:35:29.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:35:29.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:35:32.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:35:32.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:35:32.433 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:35:32.434 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:35:32.444 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:35:32.457 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:35:32.458 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:35:32.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:35:32.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:35:32.458 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:35:32.458 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:35:32.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:35:32.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:35:32.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:35:32.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:35:32.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:35:32.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:35:32.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:35:32.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:35:32.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:35:32.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:35:32.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:35:32.739 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:35:32.809 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:35:22
2026-06-04T06:35:32.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88178, datetime.datetime(2026, 6, 4, 6, 35, 22), datetime.datetime(2026, 6, 4, 6, 35, 21), 'salt', 1.77, 100.74, None, 29.36, 127.31, -0.1, 821.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:35:32.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:35:32.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:35:32.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:35:21, diff=11.81601s, valid=True
2026-06-04T06:35:32.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:35:32.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:35:32.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:35:12, diff=20.819266s, valid=True
2026-06-04T06:35:32.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:35:32.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:35:32.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:35:16, diff=16.827014s, valid=True
2026-06-04T06:35:32.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:35:32.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:35:32.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:35:32.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:35:32.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:35:32.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:35:32.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:35:12, diff=20.830475s, valid=True
2026-06-04T06:35:32.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:35:32.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:35:32.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:35:32.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121929.831286s, valid=True
2026-06-04T06:35:32.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:35:32.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:35:32.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:35:32.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:35:32.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:35:32.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:35:32.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:35:32.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:35:32.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:35:33.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:35:33.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:35:33.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:35:33.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:35:33.216 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:35:33.427 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:35:33.771 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:35:33.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:35:33.872 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:35:33.872 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:35:34.028 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:35:34.028 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:36:04.058 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:36:04.058 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:36:04.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:36:04.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:36:04.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:36:04.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:36:04.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:36:04.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:36:04.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:36:04.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:36:04.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:36:04.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:36:04.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:36:06.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:36:06.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:36:06.932 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:36:06.932 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:36:06.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:36:06.957 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:36:06.958 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:36:06.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:36:06.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:36:06.959 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:36:06.959 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:36:06.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:36:07.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:36:07.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:36:07.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:36:07.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:36:07.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:36:07.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:36:07.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:36:07.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:36:07.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:36:07.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:36:07.300 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:36:07.370 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:35:52
2026-06-04T06:36:07.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88179, datetime.datetime(2026, 6, 4, 6, 35, 52), datetime.datetime(2026, 6, 4, 6, 35, 51), 'salt', 1.8, 100.74, None, 34.12, 131.86, -0.1, 821.35, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:36:07.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:36:07.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:36:07.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:35:51, diff=16.377765s, valid=True
2026-06-04T06:36:07.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:36:07.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:36:07.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:36:12, diff=-4.61865s, valid=True
2026-06-04T06:36:07.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:36:07.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:36:07.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:35:47, diff=20.389611s, valid=True
2026-06-04T06:36:07.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:36:07.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:36:07.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:36:07.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:36:07.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:36:07.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:36:07.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:36:12, diff=-4.606633s, valid=True
2026-06-04T06:36:07.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:36:07.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:36:07.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:36:07.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121964.394189s, valid=True
2026-06-04T06:36:07.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:36:07.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:36:07.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:36:07.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:36:07.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:36:07.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:36:07.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:36:07.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:36:07.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:36:07.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:36:07.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:36:07.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:36:07.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:36:07.714 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:36:07.922 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:36:08.266 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:36:08.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:36:08.367 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:36:08.368 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:36:08.523 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:36:08.524 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:36:38.553 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:36:38.553 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:36:38.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:36:38.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:36:38.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:36:39.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:36:39.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:36:39.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:36:39.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:36:39.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:36:39.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:36:39.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:36:39.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:36:41.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:36:41.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:36:41.563 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:36:41.563 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:36:41.574 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:36:41.586 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:36:41.587 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:36:41.587 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:36:41.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:36:41.588 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:36:41.588 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:36:41.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:36:41.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:36:41.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:36:41.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:36:41.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:36:41.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:36:41.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:36:41.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:36:41.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:36:41.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:36:41.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:36:41.909 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:36:41.980 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:36:22
2026-06-04T06:36:41.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88180, datetime.datetime(2026, 6, 4, 6, 36, 22), datetime.datetime(2026, 6, 4, 6, 36, 21), 'salt', 1.7, 100.64, None, 32.18, 160.55, -0.09, 821.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:36:41.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:36:41.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:36:41.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:36:21, diff=20.987966s, valid=True
2026-06-04T06:36:41.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:36:41.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:36:41.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:36:12, diff=29.991364s, valid=True
2026-06-04T06:36:41.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:36:41.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:36:41.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:36:17, diff=24.99942s, valid=True
2026-06-04T06:36:41.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:36:41.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:36:41.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:36:41.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:36:41.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:36:41.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:36:42.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:36:12, diff=30.003018s, valid=True
2026-06-04T06:36:42.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:36:42.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:36:42.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:36:42.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=121999.003809s, valid=True
2026-06-04T06:36:42.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:36:42.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:36:42.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:36:42.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:36:42.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:36:42.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:36:42.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:36:42.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:36:42.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:36:42.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:36:42.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:36:42.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:36:42.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:36:42.321 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:36:42.529 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:36:42.872 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:36:42.973 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:36:42.973 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:36:42.973 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:36:43.193 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:36:43.193 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:37:13.223 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:37:13.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:37:13.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:37:13.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:37:13.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:37:13.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:37:13.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:37:13.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:37:13.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:37:13.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:37:13.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:37:13.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:37:13.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:37:16.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:37:16.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:37:16.220 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:37:16.221 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:37:16.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:37:16.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:37:16.242 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:37:16.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:37:16.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:37:16.243 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:37:16.243 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:37:16.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:37:16.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:37:16.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:37:16.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:37:16.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:37:16.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:37:16.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:37:16.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:37:16.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:37:16.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:37:16.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:37:16.555 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:37:16.645 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:36:52
2026-06-04T06:37:16.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88181, datetime.datetime(2026, 6, 4, 6, 36, 52), datetime.datetime(2026, 6, 4, 6, 36, 52), 'salt', 1.7, 100.64, None, 30.03, 154.35, -0.09, 821.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:37:16.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:37:16.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:37:16.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:36:52, diff=24.652561s, valid=True
2026-06-04T06:37:16.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:37:16.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:37:16.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:37:12, diff=4.655927s, valid=True
2026-06-04T06:37:16.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:37:16.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:37:16.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:36:47, diff=29.663773s, valid=True
2026-06-04T06:37:16.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:37:16.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:37:16.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:37:16.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:37:16.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:37:16.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:37:16.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:37:12, diff=4.667373s, valid=True
2026-06-04T06:37:16.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:37:16.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:37:16.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:37:16.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122033.668158s, valid=True
2026-06-04T06:37:16.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:37:16.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:37:16.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:37:16.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:37:16.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:37:16.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:37:16.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:37:16.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:37:16.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:37:16.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:37:16.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:37:16.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:37:16.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:37:16.987 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:37:17.257 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:37:17.599 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:37:17.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:37:17.701 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:37:17.701 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:37:17.955 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:37:17.955 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:37:47.984 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:37:47.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:37:47.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:37:48.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:37:48.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:37:48.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:37:48.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:37:48.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:37:48.573 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:37:48.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:37:48.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:37:48.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:37:48.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:37:50.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:37:50.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:37:50.996 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:37:50.996 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:37:51.007 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:37:51.020 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:37:51.020 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:37:51.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:37:51.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:37:51.021 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:37:51.022 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:37:51.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:37:51.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:37:51.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:37:51.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:37:51.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:37:51.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:37:51.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:37:51.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:37:51.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:37:51.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:37:51.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:37:51.358 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:37:51.434 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:37:23
2026-06-04T06:37:51.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88182, datetime.datetime(2026, 6, 4, 6, 37, 23), datetime.datetime(2026, 6, 4, 6, 37, 22), 'salt', 1.77, 100.78, None, 30.84, 141.64, -0.11, 821.29, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:37:51.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:37:51.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:37:51.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:37:22, diff=29.441978s, valid=True
2026-06-04T06:37:51.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:37:51.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:37:51.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:37:12, diff=39.445873s, valid=True
2026-06-04T06:37:51.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:37:51.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:37:51.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:37:18, diff=33.454102s, valid=True
2026-06-04T06:37:51.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:37:51.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:37:51.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:37:51.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:37:51.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:37:51.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:37:51.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:37:12, diff=39.457819s, valid=True
2026-06-04T06:37:51.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:37:51.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:37:51.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:37:51.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122068.458611s, valid=True
2026-06-04T06:37:51.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:37:51.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:37:51.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:37:51.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:37:51.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:37:51.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:37:51.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:37:51.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:37:51.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:37:51.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:37:51.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:37:51.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:37:51.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:37:51.779 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:37:51.982 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:37:52.317 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:37:52.418 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:37:52.418 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:37:52.418 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:37:52.679 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:37:52.679 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:38:22.709 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:38:22.709 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:38:22.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:38:23.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:38:23.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:38:23.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:38:23.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:38:23.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:38:23.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:38:23.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:38:23.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:38:23.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:38:23.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:38:25.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:38:25.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:38:25.952 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:38:25.952 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:38:25.962 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:38:25.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:38:25.976 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:38:25.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:38:25.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:38:25.977 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:38:25.977 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:38:25.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:38:26.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:38:26.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:38:26.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:38:26.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:38:26.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:38:26.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:38:26.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:38:26.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:38:26.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:38:26.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:38:26.304 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:38:26.375 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:38:23
2026-06-04T06:38:26.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88184, datetime.datetime(2026, 6, 4, 6, 38, 23), datetime.datetime(2026, 6, 4, 6, 38, 22), 'salt', 1.77, 100.68, None, 37.51, 158.86, -0.09, 820.8, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:38:26.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:38:26.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:38:26.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:38:22, diff=4.382735s, valid=True
2026-06-04T06:38:26.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:38:26.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:38:26.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:38:12, diff=14.386248s, valid=True
2026-06-04T06:38:26.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:38:26.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:38:26.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:38:18, diff=8.394433s, valid=True
2026-06-04T06:38:26.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:38:26.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:38:26.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:38:26.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:38:26.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:38:26.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:38:26.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:38:12, diff=14.398162s, valid=True
2026-06-04T06:38:26.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:38:26.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:38:26.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:38:26.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122103.398977s, valid=True
2026-06-04T06:38:26.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:38:26.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:38:26.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:38:26.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:38:26.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:38:26.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:38:26.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:38:26.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:38:26.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:38:26.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:38:26.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:38:26.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:38:26.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:38:26.791 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:38:26.991 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:38:27.324 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:38:27.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:38:27.423 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:38:27.423 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:38:27.604 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:38:27.604 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:38:57.635 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:38:57.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:38:57.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:38:57.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:38:57.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:38:58.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:38:58.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:38:58.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:38:58.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:38:58.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:38:58.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:38:58.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:38:58.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:39:00.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:39:00.667 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:39:00.668 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:39:00.668 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:39:00.679 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:39:00.692 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:39:00.693 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:39:00.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:39:00.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:39:00.694 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:39:00.694 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:39:00.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:39:00.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:39:00.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:39:00.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:39:00.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:39:00.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:39:00.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:39:01.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:39:01.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:39:01.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:39:01.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:39:01.031 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:39:01.106 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:38:54
2026-06-04T06:39:01.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88185, datetime.datetime(2026, 6, 4, 6, 38, 54), datetime.datetime(2026, 6, 4, 6, 38, 53), 'salt', 1.77, 100.71, None, 36.24, 143.49, -0.1, 821.29, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:39:01.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:39:01.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:39:01.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:38:53, diff=8.122677s, valid=True
2026-06-04T06:39:01.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:39:01.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:39:01.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:39:12, diff=-10.873831s, valid=True
2026-06-04T06:39:01.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:39:01.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:39:01.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:38:48, diff=13.134441s, valid=True
2026-06-04T06:39:01.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:39:01.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:39:01.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:39:01.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:39:01.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:39:01.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:39:01.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:39:12, diff=-10.861798s, valid=True
2026-06-04T06:39:01.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:39:01.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:39:01.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:39:01.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122138.139023s, valid=True
2026-06-04T06:39:01.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:39:01.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:39:01.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:39:01.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:39:01.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:39:01.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:39:01.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:39:01.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:39:01.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:39:01.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:39:01.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:39:01.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:39:01.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:39:01.469 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:39:01.713 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:39:02.048 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:39:02.148 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:39:02.148 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:39:02.148 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:39:02.337 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:39:02.337 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:39:32.365 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:39:32.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:39:32.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:39:32.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:39:32.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:39:32.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:39:32.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:39:32.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:39:32.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:39:32.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:39:32.940 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:39:32.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:39:32.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:39:35.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:39:35.343 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:39:35.343 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:39:35.344 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:39:35.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:39:35.366 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:39:35.366 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:39:35.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:39:35.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:39:35.368 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:39:35.368 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:39:35.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:39:35.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:39:35.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:39:35.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:39:35.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:39:35.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:39:35.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:39:35.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:39:35.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:39:35.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:39:35.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:39:35.705 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:39:35.778 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:39:24
2026-06-04T06:39:35.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88186, datetime.datetime(2026, 6, 4, 6, 39, 24), datetime.datetime(2026, 6, 4, 6, 39, 23), 'salt', 1.67, 100.74, None, 30.2, 135.41, -0.1, 821.35, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:39:35.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:39:35.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:39:35.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:39:23, diff=12.785661s, valid=True
2026-06-04T06:39:35.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:39:35.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:39:35.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:39:12, diff=23.789167s, valid=True
2026-06-04T06:39:35.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:39:35.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:39:35.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:39:18, diff=17.797297s, valid=True
2026-06-04T06:39:35.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:39:35.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:39:35.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:39:35.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:39:35.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:39:35.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:39:35.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:39:12, diff=23.801002s, valid=True
2026-06-04T06:39:35.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:39:35.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:39:35.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:39:35.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122172.801814s, valid=True
2026-06-04T06:39:35.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:39:35.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:39:35.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:39:35.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:39:35.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:39:35.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:39:35.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:39:35.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:39:35.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:39:35.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:39:35.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:39:36.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:39:36.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:39:36.189 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:39:36.391 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:39:36.726 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:39:36.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:39:36.827 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:39:36.827 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:39:37.005 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:39:37.006 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:40:07.036 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:40:07.036 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:40:07.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:40:07.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:40:07.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:40:07.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:40:07.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:40:07.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:40:07.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:40:07.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:40:07.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:40:07.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:40:07.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:40:09.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:40:09.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:40:09.921 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:40:09.921 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:40:09.930 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:40:09.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:40:09.942 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:40:09.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:40:09.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:40:09.943 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:40:09.943 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:40:09.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:40:10.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:40:10.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:40:10.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:40:10.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:40:10.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:40:10.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:40:10.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:40:10.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:40:10.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:40:10.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:40:10.236 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:40:10.307 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:39:54
2026-06-04T06:40:10.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88187, datetime.datetime(2026, 6, 4, 6, 39, 54), datetime.datetime(2026, 6, 4, 6, 39, 53), 'salt', 1.67, 100.74, None, 28.72, 127.87, -0.1, 821.29, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:40:10.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:40:10.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:40:10.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:39:53, diff=17.314375s, valid=True
2026-06-04T06:40:10.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:40:10.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:40:10.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:40:12, diff=-1.682438s, valid=True
2026-06-04T06:40:10.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:40:10.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:40:10.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:39:49, diff=21.324936s, valid=True
2026-06-04T06:40:10.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:40:10.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:40:10.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:40:10.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:40:10.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:40:10.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:40:10.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:40:12, diff=-1.67114s, valid=True
2026-06-04T06:40:10.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:40:10.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:40:10.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:40:10.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122207.3296s, valid=True
2026-06-04T06:40:10.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:40:10.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:40:10.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:40:10.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:40:10.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:40:10.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:40:10.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:40:10.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:40:10.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:40:10.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:40:10.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:40:10.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:40:10.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:40:10.654 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:40:10.879 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:40:11.216 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:40:11.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:40:11.318 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:40:11.318 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:40:11.536 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:40:11.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:40:41.566 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:40:41.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:40:41.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:40:41.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:40:41.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:40:41.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:40:41.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:40:41.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:40:41.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:40:41.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:40:41.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:40:41.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:40:41.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:40:44.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:40:44.687 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:40:44.688 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:40:44.688 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:40:44.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:40:44.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:40:44.712 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:40:44.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:40:44.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:40:44.714 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:40:44.714 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:40:44.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:40:44.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:40:44.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:40:44.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:40:44.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:40:44.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:40:44.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:40:45.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:40:45.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:40:45.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:40:45.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:40:45.043 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:40:45.113 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:40:24
2026-06-04T06:40:45.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88188, datetime.datetime(2026, 6, 4, 6, 40, 24), datetime.datetime(2026, 6, 4, 6, 40, 24), 'salt', 1.8, 100.74, None, 26.78, 126.77, -0.1, 821.29, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:40:45.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:40:45.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:40:45.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:40:24, diff=21.119509s, valid=True
2026-06-04T06:40:45.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:40:45.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:40:45.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:40:12, diff=33.122296s, valid=True
2026-06-04T06:40:45.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:40:45.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:40:45.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:40:19, diff=26.128703s, valid=True
2026-06-04T06:40:45.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:40:45.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:40:45.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:40:45.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:40:45.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:40:45.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:40:45.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:40:12, diff=33.131672s, valid=True
2026-06-04T06:40:45.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:40:45.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:40:45.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:40:45.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122242.132316s, valid=True
2026-06-04T06:40:45.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:40:45.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:40:45.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:40:45.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:40:45.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:40:45.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:40:45.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:40:45.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:40:45.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:40:45.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:40:45.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:40:45.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:40:45.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:40:45.515 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:40:45.716 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:40:46.052 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:40:46.151 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:40:46.151 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:40:46.151 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:40:46.306 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:40:46.307 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:41:16.311 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:41:16.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:41:16.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:41:16.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:41:16.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:41:16.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:41:16.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:41:16.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:41:16.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:41:16.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:41:16.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:41:16.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:41:16.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:41:19.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:41:19.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:41:19.631 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:41:19.632 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:41:19.642 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:41:19.656 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:41:19.656 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:41:19.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:41:19.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:41:19.657 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:41:19.657 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:41:19.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:41:19.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:41:19.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:41:19.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:41:19.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:41:19.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:41:19.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:41:19.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:41:19.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:41:19.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:41:19.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:41:19.983 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:41:20.053 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:40:55
2026-06-04T06:41:20.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88189, datetime.datetime(2026, 6, 4, 6, 40, 55), datetime.datetime(2026, 6, 4, 6, 40, 54), 'salt', 1.73, 100.74, None, 40.93, 143.61, -0.11, 821.35, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:41:20.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:41:20.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:41:20.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:40:54, diff=26.059312s, valid=True
2026-06-04T06:41:20.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:41:20.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:41:20.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:41:12, diff=8.062209s, valid=True
2026-06-04T06:41:20.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:41:20.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:41:20.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:40:49, diff=31.069172s, valid=True
2026-06-04T06:41:20.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:41:20.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:41:20.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:41:20.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:41:20.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:41:20.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:41:20.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:41:12, diff=8.072638s, valid=True
2026-06-04T06:41:20.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:41:20.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:41:20.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:41:20.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122277.073341s, valid=True
2026-06-04T06:41:20.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:41:20.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:41:20.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:41:20.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:41:20.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:41:20.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:41:20.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:41:20.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:41:20.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:41:20.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:41:20.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:41:20.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:41:20.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:41:20.392 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:41:20.591 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:41:20.927 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:41:21.026 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:41:21.026 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:41:21.026 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:41:21.239 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:41:21.239 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:41:51.269 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:41:51.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:41:51.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:41:51.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:41:51.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:41:51.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:41:51.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:41:51.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:41:51.674 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:41:51.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:41:51.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:41:51.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:41:51.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:41:54.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:41:54.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:41:54.091 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:41:54.091 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:41:54.099 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:41:54.111 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:41:54.111 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:41:54.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:41:54.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:41:54.112 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:41:54.112 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:41:54.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:41:54.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:41:54.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:41:54.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:41:54.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:41:54.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:41:54.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:41:54.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:41:54.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:41:54.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:41:54.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:41:54.429 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:41:54.501 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:41:25
2026-06-04T06:41:54.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88190, datetime.datetime(2026, 6, 4, 6, 41, 25), datetime.datetime(2026, 6, 4, 6, 41, 24), 'salt', 1.73, 100.74, None, 27.13, 155.26, -0.11, 821.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:41:54.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:41:54.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:41:54.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:41:24, diff=30.508417s, valid=True
2026-06-04T06:41:54.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:41:54.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:41:54.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:41:12, diff=42.511851s, valid=True
2026-06-04T06:41:54.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:41:54.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:41:54.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:41:19, diff=35.519728s, valid=True
2026-06-04T06:41:54.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:41:54.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:41:54.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:41:54.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:41:54.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:41:54.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:41:54.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:41:12, diff=42.5233s, valid=True
2026-06-04T06:41:54.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:41:54.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:41:54.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:41:54.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122311.524079s, valid=True
2026-06-04T06:41:54.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:41:54.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:41:54.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:41:54.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:41:54.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:41:54.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:41:54.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:41:54.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:41:54.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:41:54.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:41:54.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:41:54.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:41:54.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:41:54.841 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:41:55.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:41:55.378 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:41:55.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:41:55.478 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:41:55.478 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:41:55.730 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:41:55.730 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:42:25.732 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:42:25.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:42:25.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:42:26.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:42:26.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:42:26.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:42:26.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:42:26.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:42:26.477 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:42:26.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:42:26.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:42:26.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:42:26.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:42:28.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:42:28.892 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:42:28.893 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:42:28.893 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:42:28.904 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:42:28.916 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:42:28.917 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:42:28.917 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:42:28.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:42:28.918 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:42:28.918 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:42:28.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:42:29.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:42:29.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:42:29.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:42:29.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:42:29.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:42:29.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:42:29.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:42:29.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:42:29.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:42:29.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:42:29.259 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:42:29.337 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:42:25
2026-06-04T06:42:29.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88192, datetime.datetime(2026, 6, 4, 6, 42, 25), datetime.datetime(2026, 6, 4, 6, 42, 25), 'salt', 1.6, 100.64, None, 28.9, 140.49, -0.09, 821.35, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:42:29.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:42:29.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:42:29.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:42:25, diff=4.344457s, valid=True
2026-06-04T06:42:29.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:42:29.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:42:29.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:42:12, diff=17.347932s, valid=True
2026-06-04T06:42:29.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:42:29.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:42:29.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:42:20, diff=9.356053s, valid=True
2026-06-04T06:42:29.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:42:29.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:42:29.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:42:29.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:42:29.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:42:29.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:42:29.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:42:12, diff=17.359789s, valid=True
2026-06-04T06:42:29.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:42:29.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:42:29.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:42:29.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122346.360594s, valid=True
2026-06-04T06:42:29.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:42:29.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:42:29.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:42:29.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:42:29.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:42:29.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:42:29.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:42:29.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:42:29.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:42:29.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:42:29.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:42:29.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:42:29.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:42:29.681 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:42:29.955 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:42:30.293 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:42:30.393 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:42:30.394 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:42:30.394 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:42:30.544 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:42:30.544 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:43:00.571 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:43:00.571 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:43:00.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:43:00.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:43:00.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:43:00.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:43:00.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:43:00.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:43:00.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:43:00.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:43:00.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:43:01.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:43:01.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:43:03.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:43:03.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:43:03.433 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:43:03.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:43:03.443 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:43:03.456 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:43:03.456 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:43:03.457 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:43:03.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:43:03.457 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:43:03.458 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:43:03.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:43:03.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:43:03.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:43:03.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:43:03.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:43:03.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:43:03.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:43:03.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:43:03.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:43:03.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:43:03.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:43:03.789 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:43:03.860 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:42:56
2026-06-04T06:43:03.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88193, datetime.datetime(2026, 6, 4, 6, 42, 56), datetime.datetime(2026, 6, 4, 6, 42, 55), 'salt', 1.73, 100.74, None, 32.64, 139.64, -0.11, 821.48, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:43:03.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:43:03.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:43:03.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:42:55, diff=8.867798s, valid=True
2026-06-04T06:43:03.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:43:03.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:43:03.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:43:12, diff=-8.12871s, valid=True
2026-06-04T06:43:03.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:43:03.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:43:03.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:42:50, diff=13.879541s, valid=True
2026-06-04T06:43:03.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:43:03.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:43:03.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:43:03.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:43:03.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:43:03.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:43:03.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:43:12, diff=-8.116716s, valid=True
2026-06-04T06:43:03.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:43:03.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:43:03.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:43:03.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122380.884083s, valid=True
2026-06-04T06:43:03.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:43:03.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:43:03.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:43:03.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:43:03.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:43:03.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:43:03.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:43:03.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:43:03.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:43:04.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:43:04.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:43:04.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:43:04.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:43:04.208 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:43:04.408 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:43:04.741 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:43:04.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:43:04.841 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:43:04.841 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:43:05.036 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:43:05.036 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:43:35.044 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:43:35.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:43:35.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:43:35.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:43:35.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:43:35.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:43:35.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:43:35.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:43:35.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:43:35.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:43:35.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:43:35.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:43:35.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:43:37.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:43:37.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:43:37.908 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:43:37.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:43:37.919 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:43:37.932 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:43:37.933 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:43:37.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:43:37.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:43:37.934 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:43:37.934 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:43:37.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:43:38.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:43:38.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:43:38.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:43:38.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:43:38.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:43:38.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:43:38.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:43:38.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:43:38.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:43:38.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:43:38.227 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:43:38.298 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:43:26
2026-06-04T06:43:38.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88194, datetime.datetime(2026, 6, 4, 6, 43, 26), datetime.datetime(2026, 6, 4, 6, 43, 25), 'salt', 1.73, 100.68, None, 28.12, 149.74, -0.1, 821.35, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:43:38.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:43:38.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:43:38.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:43:25, diff=13.304794s, valid=True
2026-06-04T06:43:38.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:43:38.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:43:38.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:43:12, diff=26.30767s, valid=True
2026-06-04T06:43:38.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:43:38.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:43:38.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:43:20, diff=18.314413s, valid=True
2026-06-04T06:43:38.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:43:38.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:43:38.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:43:38.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:43:38.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:43:38.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:43:38.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:43:12, diff=26.317441s, valid=True
2026-06-04T06:43:38.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:43:38.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:43:38.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:43:38.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122415.318107s, valid=True
2026-06-04T06:43:38.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:43:38.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:43:38.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:43:38.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:43:38.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:43:38.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:43:38.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:43:38.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:43:38.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:43:38.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:43:38.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:43:38.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:43:38.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:43:38.765 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:43:38.974 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:43:39.311 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:43:39.412 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:43:39.412 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:43:39.412 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:43:39.648 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:43:39.649 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:44:09.655 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:44:09.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:44:09.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:44:10.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:44:10.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:44:10.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:44:10.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:44:10.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:44:10.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:44:10.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:44:10.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:44:10.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:44:10.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:44:12.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:44:12.634 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:44:12.635 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:44:12.635 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:44:12.646 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:44:12.659 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:44:12.659 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:44:12.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:44:12.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:44:12.661 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:44:12.661 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:44:12.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:44:12.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:44:12.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:44:12.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:44:12.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:44:12.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:44:12.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:44:12.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:44:12.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:44:13.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:44:13.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:44:13.001 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:44:13.071 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:43:56
2026-06-04T06:44:13.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88195, datetime.datetime(2026, 6, 4, 6, 43, 56), datetime.datetime(2026, 6, 4, 6, 43, 55), 'salt', 1.8, 100.71, None, 37.44, 152.96, -0.1, 821.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:44:13.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:44:13.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:44:13.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:43:55, diff=18.078811s, valid=True
2026-06-04T06:44:13.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:44:13.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:44:13.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:44:12, diff=1.082612s, valid=True
2026-06-04T06:44:13.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:44:13.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:44:13.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:43:50, diff=23.090911s, valid=True
2026-06-04T06:44:13.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:44:13.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:44:13.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:44:13.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:44:13.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:44:13.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:44:13.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:44:12, diff=1.094686s, valid=True
2026-06-04T06:44:13.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:44:13.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:44:13.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:44:13.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122450.095488s, valid=True
2026-06-04T06:44:13.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:44:13.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:44:13.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:44:13.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:44:13.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:44:13.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:44:13.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:44:13.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:44:13.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:44:13.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:44:13.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:44:13.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:44:13.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:44:13.416 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:44:13.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:44:13.953 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:44:14.052 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:44:14.052 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:44:14.053 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:44:14.274 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:44:14.274 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:44:44.292 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:44:44.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:44:44.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:44:44.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:44:44.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:44:44.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:44:44.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:44:44.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:44:44.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:44:44.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:44:44.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:44:44.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:44:44.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:44:47.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:44:47.913 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:44:47.914 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:44:47.914 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:44:47.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:44:47.938 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:44:47.939 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:44:47.939 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:44:47.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:44:47.940 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:44:47.940 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:44:47.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:44:48.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:44:48.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:44:48.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:44:48.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:44:48.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:44:48.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:44:48.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:44:48.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:44:48.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:44:48.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:44:48.273 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:44:48.344 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:44:26
2026-06-04T06:44:48.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88196, datetime.datetime(2026, 6, 4, 6, 44, 26), datetime.datetime(2026, 6, 4, 6, 44, 26), 'salt', 1.7, 100.78, None, 32.92, 143.49, -0.11, 821.35, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:44:48.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:44:48.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:44:48.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:44:26, diff=22.351899s, valid=True
2026-06-04T06:44:48.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:44:48.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:44:48.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:44:12, diff=36.355367s, valid=True
2026-06-04T06:44:48.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:44:48.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:44:48.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:44:21, diff=27.363504s, valid=True
2026-06-04T06:44:48.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:44:48.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:44:48.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:44:48.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:44:48.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:44:48.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:44:48.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:44:12, diff=36.367213s, valid=True
2026-06-04T06:44:48.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:44:48.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:44:48.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:44:48.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122485.368037s, valid=True
2026-06-04T06:44:48.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:44:48.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:44:48.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:44:48.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:44:48.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:44:48.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:44:48.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:44:48.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:44:48.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:44:48.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:44:48.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:44:48.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:44:48.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:44:48.759 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:44:48.961 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:44:49.299 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:44:49.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:44:49.399 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:44:49.399 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:44:49.647 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:44:49.647 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:45:19.656 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:45:19.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:45:19.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:45:19.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:45:19.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:45:20.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:45:20.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:45:20.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:45:20.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:45:20.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:45:20.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:45:20.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:45:20.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:45:23.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:45:23.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:45:23.071 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:45:23.071 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:45:23.082 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:45:23.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:45:23.095 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:45:23.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:45:23.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:45:23.096 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:45:23.096 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:45:23.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:45:23.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:45:23.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:45:23.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:45:23.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:45:23.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:45:23.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:45:23.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:45:23.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:45:23.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:45:23.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:45:23.422 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:45:23.491 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:44:57
2026-06-04T06:45:23.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88197, datetime.datetime(2026, 6, 4, 6, 44, 57), datetime.datetime(2026, 6, 4, 6, 44, 56), 'salt', 1.8, 100.74, None, 34.4, 153.12, -0.1, 821.42, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:45:23.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:45:23.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:45:23.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:44:56, diff=27.49882s, valid=True
2026-06-04T06:45:23.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:45:23.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:45:23.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:45:12, diff=11.502302s, valid=True
2026-06-04T06:45:23.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:45:23.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:45:23.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:44:51, diff=32.510533s, valid=True
2026-06-04T06:45:23.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:45:23.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:45:23.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:45:23.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:45:23.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:45:23.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:45:23.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:45:12, diff=11.514348s, valid=True
2026-06-04T06:45:23.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:45:23.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:45:23.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:45:23.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122520.515191s, valid=True
2026-06-04T06:45:23.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:45:23.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:45:23.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:45:23.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:45:23.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:45:23.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:45:23.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:45:23.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:45:23.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:45:23.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:45:23.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:45:23.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:45:23.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:45:23.835 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:45:24.034 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:45:24.370 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:45:24.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:45:24.470 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:45:24.470 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:45:24.653 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:45:24.653 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:45:54.654 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:45:54.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:45:54.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:45:54.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:45:54.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:45:55.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:45:55.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:45:55.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:45:55.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:45:55.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:45:55.084 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:45:55.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:45:55.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:45:57.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:45:57.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:45:57.904 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:45:57.904 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:45:57.916 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:45:57.928 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:45:57.929 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:45:57.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:45:57.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:45:57.930 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:45:57.930 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:45:57.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:45:58.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:45:58.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:45:58.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:45:58.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:45:58.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:45:58.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:45:58.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:45:58.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:45:58.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:45:58.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:45:58.261 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:45:58.334 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:45:57
2026-06-04T06:45:58.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88199, datetime.datetime(2026, 6, 4, 6, 45, 57), datetime.datetime(2026, 6, 4, 6, 45, 56), 'salt', 1.67, 100.64, None, 39.94, 143.4, -0.09, 821.35, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:45:58.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:45:58.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:45:58.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:45:56, diff=2.341472s, valid=True
2026-06-04T06:45:58.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:45:58.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:45:58.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:46:12, diff=-13.655087s, valid=True
2026-06-04T06:45:58.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:45:58.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:45:58.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:45:51, diff=7.35296s, valid=True
2026-06-04T06:45:58.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:45:58.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:45:58.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:45:58.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:45:58.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:45:58.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:45:58.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:46:12, diff=-13.643418s, valid=True
2026-06-04T06:45:58.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:45:58.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:45:58.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:45:58.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122555.357384s, valid=True
2026-06-04T06:45:58.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:45:58.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:45:58.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:45:58.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:45:58.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:45:58.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:45:58.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:45:58.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:45:58.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:45:58.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:45:58.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:45:58.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:45:58.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:45:58.743 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:45:58.943 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:45:59.278 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:45:59.378 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:45:59.378 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:45:59.378 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:45:59.626 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:45:59.627 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:46:29.652 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:46:29.652 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:46:29.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:46:29.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:46:29.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:46:30.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:46:30.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:46:30.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:46:30.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:46:30.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:46:30.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:46:30.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:46:30.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:46:33.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:46:33.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:46:33.186 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:46:33.187 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:46:33.199 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:46:33.211 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:46:33.212 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:46:33.213 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:46:33.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:46:33.213 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:46:33.214 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:46:33.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:46:33.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:46:33.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:46:33.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:46:33.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:46:33.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:46:33.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:46:33.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:46:33.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:46:33.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:46:33.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:46:33.547 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:46:33.618 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:46:27
2026-06-04T06:46:33.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88200, datetime.datetime(2026, 6, 4, 6, 46, 27), datetime.datetime(2026, 6, 4, 6, 46, 27), 'salt', 1.77, 100.68, None, 37.68, 136.94, -0.09, 821.17, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:46:33.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:46:33.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:46:33.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:46:27, diff=6.626284s, valid=True
2026-06-04T06:46:33.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:46:33.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:46:33.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:46:12, diff=21.629751s, valid=True
2026-06-04T06:46:33.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:46:33.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:46:33.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:46:22, diff=11.637873s, valid=True
2026-06-04T06:46:33.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:46:33.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:46:33.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:46:33.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:46:33.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:46:33.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:46:33.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:46:12, diff=21.641596s, valid=True
2026-06-04T06:46:33.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:46:33.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:46:33.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:46:33.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122590.642416s, valid=True
2026-06-04T06:46:33.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:46:33.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:46:33.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:46:33.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:46:33.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:46:33.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:46:33.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:46:33.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:46:33.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:46:33.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:46:33.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:46:33.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:46:33.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:46:33.962 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:46:34.162 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:46:34.497 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:46:34.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:46:34.597 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:46:34.597 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:46:34.785 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:46:34.785 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:47:04.804 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:47:04.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:47:04.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:47:04.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:47:04.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:47:05.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:47:05.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:47:05.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:47:05.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:47:05.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:47:05.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:47:05.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:47:05.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:47:08.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:47:08.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:47:08.196 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:47:08.196 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:47:08.207 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:47:08.219 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:47:08.220 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:47:08.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:47:08.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:47:08.221 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:47:08.221 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:47:08.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:47:08.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:47:08.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:47:08.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:47:08.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:47:08.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:47:08.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:47:08.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:47:08.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:47:08.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:47:08.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:47:08.561 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:47:08.648 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:46:58
2026-06-04T06:47:08.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88201, datetime.datetime(2026, 6, 4, 6, 46, 58), datetime.datetime(2026, 6, 4, 6, 46, 57), 'salt', 1.73, 100.74, None, 32.92, 159.87, -0.11, 821.41, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:47:08.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:47:08.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:47:08.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:46:57, diff=11.656313s, valid=True
2026-06-04T06:47:08.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:47:08.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:47:08.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:47:12, diff=-3.340308s, valid=True
2026-06-04T06:47:08.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:47:08.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:47:08.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:46:52, diff=16.66768s, valid=True
2026-06-04T06:47:08.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:47:08.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:47:08.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:47:08.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:47:08.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:47:08.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:47:08.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:47:12, diff=-3.328755s, valid=True
2026-06-04T06:47:08.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:47:08.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:47:08.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:47:08.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122625.672022s, valid=True
2026-06-04T06:47:08.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:47:08.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:47:08.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:47:08.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:47:08.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:47:08.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:47:08.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:47:08.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:47:08.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:47:08.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:47:08.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:47:08.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:47:08.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:47:08.991 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:47:09.191 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:47:09.527 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:47:09.626 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:47:09.626 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:47:09.626 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:47:11.620 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:47:11.621 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:47:41.628 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:47:41.628 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:47:41.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:47:41.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:47:41.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:47:42.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:47:42.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:47:42.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:47:42.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:47:42.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:47:42.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:47:42.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:47:42.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:47:44.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:47:44.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:47:44.992 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:47:44.993 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:47:45.003 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:47:45.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:47:45.016 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:47:45.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:47:45.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:47:45.017 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:47:45.017 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:47:45.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:47:45.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:47:45.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:47:45.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:47:45.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:47:45.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:47:45.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:47:45.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:47:45.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:47:45.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:47:45.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:47:45.348 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:47:45.421 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:47:28
2026-06-04T06:47:45.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88202, datetime.datetime(2026, 6, 4, 6, 47, 28), datetime.datetime(2026, 6, 4, 6, 47, 27), 'salt', 1.73, 100.71, None, 36.17, 155.64, -0.1, 821.29, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:47:45.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:47:45.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:47:45.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:47:27, diff=18.428495s, valid=True
2026-06-04T06:47:45.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:47:45.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:47:45.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:47:12, diff=33.431994s, valid=True
2026-06-04T06:47:45.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:47:45.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:47:45.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:47:22, diff=23.440102s, valid=True
2026-06-04T06:47:45.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:47:45.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:47:45.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:47:45.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:47:45.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:47:45.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:47:45.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:47:12, diff=33.443803s, valid=True
2026-06-04T06:47:45.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:47:45.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:47:45.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:47:45.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122662.444592s, valid=True
2026-06-04T06:47:45.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:47:45.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:47:45.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:47:45.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:47:45.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:47:45.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:47:45.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:47:45.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:47:45.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:47:45.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:47:45.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:47:45.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:47:45.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:47:45.763 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:47:46.022 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:47:46.353 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:47:46.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:47:46.454 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:47:46.454 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:47:46.712 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:47:46.712 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:48:16.742 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:48:16.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:48:16.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:48:16.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:48:16.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:48:17.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:48:17.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:48:17.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:48:17.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:48:17.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:48:17.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:48:17.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:48:17.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:48:20.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:48:20.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:48:20.102 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:48:20.102 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:48:20.111 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:48:20.123 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:48:20.123 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:48:20.123 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:48:20.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:48:20.123 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:48:20.123 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:48:20.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:48:20.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:48:20.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:48:20.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:48:20.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:48:20.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:48:20.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:48:20.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:48:20.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:48:20.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:48:20.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:48:20.403 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:48:20.475 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:47:58
2026-06-04T06:48:20.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88203, datetime.datetime(2026, 6, 4, 6, 47, 58), datetime.datetime(2026, 6, 4, 6, 47, 57), 'salt', 1.73, 100.68, None, 42.34, 149.6, -0.1, 821.11, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:48:20.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:48:20.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:48:20.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:47:57, diff=23.482507s, valid=True
2026-06-04T06:48:20.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:48:20.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:48:20.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:48:12, diff=8.485814s, valid=True
2026-06-04T06:48:20.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:48:20.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:48:20.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:47:53, diff=27.493479s, valid=True
2026-06-04T06:48:20.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:48:20.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:48:20.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:48:20.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:48:20.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:48:20.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:48:20.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:48:12, diff=8.496967s, valid=True
2026-06-04T06:48:20.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:48:20.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:48:20.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:48:20.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122697.497744s, valid=True
2026-06-04T06:48:20.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:48:20.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:48:20.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:48:20.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:48:20.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:48:20.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:48:20.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:48:20.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:48:20.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:48:20.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:48:20.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:48:20.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:48:20.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:48:20.818 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:48:21.018 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:48:21.352 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:48:21.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:48:21.454 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:48:21.454 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:48:21.712 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:48:21.713 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:48:51.743 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:48:51.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:48:51.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:48:51.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:48:51.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:48:52.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:48:52.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:48:52.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:48:52.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:48:52.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:48:52.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:48:52.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:48:52.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:48:55.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:48:55.287 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:48:55.288 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:48:55.288 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:48:55.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:48:55.312 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:48:55.313 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:48:55.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:48:55.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:48:55.314 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:48:55.314 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:48:55.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:48:55.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:48:55.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:48:55.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:48:55.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:48:55.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:48:55.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:48:55.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:48:55.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:48:55.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:48:55.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:48:55.665 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:48:55.758 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:48:28
2026-06-04T06:48:55.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88204, datetime.datetime(2026, 6, 4, 6, 48, 28), datetime.datetime(2026, 6, 4, 6, 48, 28), 'salt', 1.7, 100.78, None, 33.17, 154.04, -0.11, 821.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:48:55.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:48:55.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:48:55.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:48:28, diff=27.766114s, valid=True
2026-06-04T06:48:55.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:48:55.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:48:55.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:48:12, diff=43.769724s, valid=True
2026-06-04T06:48:55.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:48:55.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:48:55.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:48:23, diff=32.77825s, valid=True
2026-06-04T06:48:55.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:48:55.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:48:55.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:48:55.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:48:55.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:48:55.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:48:55.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:48:12, diff=43.78213s, valid=True
2026-06-04T06:48:55.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:48:55.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:48:55.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:48:55.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122732.782977s, valid=True
2026-06-04T06:48:55.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:48:55.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:48:55.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:48:55.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:48:55.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:48:55.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:48:55.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:48:55.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:48:55.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:48:55.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:48:55.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:48:56.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:48:56.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:48:56.179 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:48:56.381 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:48:56.717 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:48:56.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:48:56.820 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:48:56.820 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:48:57.077 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:48:57.077 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:49:27.091 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:49:27.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:49:27.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:49:27.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:49:27.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:49:27.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:49:27.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:49:27.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:49:27.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:49:27.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:49:27.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:49:27.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:49:27.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:49:30.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:49:30.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:49:30.532 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:49:30.532 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:49:30.543 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:49:30.558 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:49:30.558 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:49:30.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:49:30.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:49:30.559 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:49:30.559 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:49:30.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:49:30.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:49:30.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:49:30.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:49:30.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:49:30.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:49:30.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:49:30.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:49:30.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:49:30.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:49:30.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:49:30.901 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:49:30.972 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:49:29
2026-06-04T06:49:30.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88206, datetime.datetime(2026, 6, 4, 6, 49, 29), datetime.datetime(2026, 6, 4, 6, 49, 28), 'salt', 1.67, 100.68, None, 30.66, 140.18, -0.09, 821.35, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:49:30.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:49:30.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:49:30.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:49:28, diff=2.980083s, valid=True
2026-06-04T06:49:30.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:49:30.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:49:30.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:49:12, diff=18.983603s, valid=True
2026-06-04T06:49:30.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:49:30.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:49:30.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:49:23, diff=7.991886s, valid=True
2026-06-04T06:49:30.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:49:30.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:49:30.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:49:30.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:49:30.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:49:30.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:49:30.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:49:12, diff=18.995631s, valid=True
2026-06-04T06:49:30.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:49:30.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:49:30.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:49:30.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122767.996442s, valid=True
2026-06-04T06:49:30.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:49:30.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:49:30.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:49:30.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:49:30.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:49:31.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:49:31.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:49:31.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:49:31.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:49:31.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:49:31.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:49:31.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:49:31.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:49:31.318 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:49:31.519 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:49:31.857 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:49:31.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:49:31.958 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:49:31.958 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:49:32.913 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:49:32.914 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:50:02.944 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:50:02.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:50:02.944 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:50:03.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:50:03.105 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:50:03.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:50:03.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:50:03.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:50:03.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:50:03.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:50:03.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:50:03.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:50:03.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:50:06.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:50:06.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:50:06.176 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:50:06.176 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:50:06.189 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:50:06.204 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:50:06.205 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:50:06.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:50:06.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:50:06.206 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:50:06.206 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:50:06.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:50:06.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:50:06.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:50:06.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:50:06.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:50:06.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:50:06.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:50:06.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:50:06.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:50:06.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:50:06.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:50:06.541 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:50:06.614 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:49:59
2026-06-04T06:50:06.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88207, datetime.datetime(2026, 6, 4, 6, 49, 59), datetime.datetime(2026, 6, 4, 6, 49, 58), 'salt', 1.7, 100.64, None, 30.87, 141.1, -0.09, 821.35, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:50:06.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:50:06.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:50:06.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:49:58, diff=8.621615s, valid=True
2026-06-04T06:50:06.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:50:06.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:50:06.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:50:12, diff=-5.374951s, valid=True
2026-06-04T06:50:06.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:50:06.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:50:06.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:49:54, diff=12.632923s, valid=True
2026-06-04T06:50:06.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:50:06.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:50:06.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:50:06.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:50:06.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:50:06.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:50:06.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:50:12, diff=-5.363483s, valid=True
2026-06-04T06:50:06.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:50:06.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:50:06.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:50:06.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122803.637322s, valid=True
2026-06-04T06:50:06.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:50:06.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:50:06.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:50:06.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:50:06.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:50:06.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:50:06.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:50:06.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:50:06.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:50:06.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:50:06.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:50:06.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:50:06.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:50:07.028 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:50:07.238 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:50:07.584 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:50:07.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:50:07.685 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:50:07.686 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:50:07.885 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:50:07.885 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:50:37.904 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:50:37.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:50:37.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:50:38.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:50:38.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:50:38.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:50:38.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:50:38.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:50:38.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:50:38.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:50:38.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:50:38.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:50:38.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:50:41.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:50:41.261 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:50:41.262 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:50:41.262 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:50:41.272 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:50:41.286 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:50:41.286 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:50:41.287 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:50:41.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:50:41.287 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:50:41.288 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:50:41.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:50:41.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:50:41.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:50:41.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:50:41.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:50:41.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:50:41.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:50:41.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:50:41.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:50:41.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:50:41.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:50:41.641 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:50:41.712 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:50:29
2026-06-04T06:50:41.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88208, datetime.datetime(2026, 6, 4, 6, 50, 29), datetime.datetime(2026, 6, 4, 6, 50, 29), 'salt', 1.7, 100.64, None, 31.83, 133.51, -0.09, 821.41, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:50:41.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:50:41.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:50:41.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:50:29, diff=12.719022s, valid=True
2026-06-04T06:50:41.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:50:41.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:50:41.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:50:12, diff=29.72263s, valid=True
2026-06-04T06:50:41.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:50:41.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:50:41.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:50:24, diff=17.730577s, valid=True
2026-06-04T06:50:41.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:50:41.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:50:41.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:50:41.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:50:41.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:50:41.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:50:41.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:50:12, diff=29.7341s, valid=True
2026-06-04T06:50:41.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:50:41.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:50:41.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:50:41.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122838.734849s, valid=True
2026-06-04T06:50:41.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:50:41.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:50:41.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:50:41.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:50:41.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:50:41.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:50:41.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:50:41.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:50:41.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:50:41.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:50:41.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:50:41.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:50:42.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:50:42.056 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:50:42.266 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:50:42.615 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:50:42.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:50:42.716 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:50:42.716 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:50:42.905 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:50:42.905 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:51:12.935 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:51:12.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:51:12.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:51:13.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:51:13.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:51:13.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:51:13.437 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:51:13.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:51:13.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:51:13.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:51:13.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:51:13.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:51:13.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:51:16.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:51:16.373 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:51:16.374 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:51:16.374 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:51:16.385 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:51:16.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:51:16.398 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:51:16.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:51:16.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:51:16.399 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:51:16.399 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:51:16.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:51:16.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:51:16.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:51:16.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:51:16.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:51:16.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:51:16.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:51:16.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:51:16.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:51:16.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:51:16.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:51:16.734 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:51:16.805 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:51:00
2026-06-04T06:51:16.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88209, datetime.datetime(2026, 6, 4, 6, 51), datetime.datetime(2026, 6, 4, 6, 50, 59), 'salt', 1.73, 100.71, None, 31.37, 159.54, -0.1, 821.41, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:51:16.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:51:16.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:51:16.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:50:59, diff=17.813185s, valid=True
2026-06-04T06:51:16.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:51:16.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:51:16.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:51:12, diff=4.816727s, valid=True
2026-06-04T06:51:16.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:51:16.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:51:16.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:50:54, diff=22.824911s, valid=True
2026-06-04T06:51:16.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:51:16.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:51:16.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:51:16.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:51:16.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:51:16.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:51:16.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:51:12, diff=4.828664s, valid=True
2026-06-04T06:51:16.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:51:16.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:51:16.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:51:16.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122873.829488s, valid=True
2026-06-04T06:51:16.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:51:16.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:51:16.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:51:16.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:51:16.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:51:16.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:51:16.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:51:16.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:51:16.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:51:17.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:51:17.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:51:17.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:51:17.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:51:17.218 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:51:17.430 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:51:17.776 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:51:17.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:51:17.877 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:51:17.877 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:51:18.167 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:51:18.168 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:51:48.195 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:51:48.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:51:48.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:51:48.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:51:48.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:51:48.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:51:48.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:51:48.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:51:48.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:51:48.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:51:48.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:51:48.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:51:48.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:51:51.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:51:51.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:51:51.724 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:51:51.725 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:51:51.734 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:51:51.747 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:51:51.747 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:51:51.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:51:51.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:51:51.749 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:51:51.749 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:51:51.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:51:51.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:51:51.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:51:51.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:51:51.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:51:52.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:51:52.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:51:52.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:51:52.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:51:52.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:51:52.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:51:52.088 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:51:52.160 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:51:30
2026-06-04T06:51:52.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88210, datetime.datetime(2026, 6, 4, 6, 51, 30), datetime.datetime(2026, 6, 4, 6, 51, 29), 'salt', 1.67, 100.68, None, 30.84, 148.8, -0.09, 821.29, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:51:52.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:51:52.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:51:52.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:51:29, diff=23.167311s, valid=True
2026-06-04T06:51:52.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:51:52.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:51:52.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:51:12, diff=40.170732s, valid=True
2026-06-04T06:51:52.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:51:52.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:51:52.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:51:24, diff=28.178559s, valid=True
2026-06-04T06:51:52.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:51:52.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:51:52.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:51:52.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:51:52.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:51:52.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:51:52.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:51:12, diff=40.182207s, valid=True
2026-06-04T06:51:52.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:51:52.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:51:52.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:51:52.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122909.183024s, valid=True
2026-06-04T06:51:52.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:51:52.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:51:52.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:51:52.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:51:52.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:51:52.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:51:52.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:51:52.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:51:52.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:51:52.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:51:52.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:51:52.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:51:52.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:51:52.504 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:51:52.712 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:51:53.055 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:51:53.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:51:53.180 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:51:53.180 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:51:53.367 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:51:53.367 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:52:23.369 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:52:23.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:52:23.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:52:23.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:52:23.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:52:23.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:52:23.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:52:23.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:52:23.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:52:23.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:52:23.860 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:52:23.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:52:23.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:52:26.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:52:26.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:52:26.787 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:52:26.787 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:52:26.800 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:52:26.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:52:26.813 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:52:26.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:52:26.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:52:26.814 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:52:26.814 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:52:26.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:52:26.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:52:26.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:52:27.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:52:27.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:52:27.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:52:27.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:52:27.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:52:27.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:52:27.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:52:27.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:52:27.140 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:52:27.211 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:52:00
2026-06-04T06:52:27.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88211, datetime.datetime(2026, 6, 4, 6, 52), datetime.datetime(2026, 6, 4, 6, 51, 59), 'salt', 1.7, 100.71, None, 33.7, 145.47, -0.1, 821.35, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:52:27.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:52:27.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:52:27.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:51:59, diff=28.21858s, valid=True
2026-06-04T06:52:27.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:52:27.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:52:27.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:52:12, diff=15.222071s, valid=True
2026-06-04T06:52:27.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:52:27.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:52:27.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:51:55, diff=32.230298s, valid=True
2026-06-04T06:52:27.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:52:27.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:52:27.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:52:27.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:52:27.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:52:27.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:52:27.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:52:12, diff=15.234048s, valid=True
2026-06-04T06:52:27.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:52:27.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:52:27.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:52:27.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122944.234863s, valid=True
2026-06-04T06:52:27.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:52:27.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:52:27.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:52:27.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:52:27.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:52:27.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:52:27.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:52:27.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:52:27.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:52:27.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:52:27.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:52:27.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:52:27.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:52:27.554 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:52:27.766 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:52:28.112 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:52:28.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:52:28.215 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:52:28.215 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:52:28.440 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:52:28.440 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:52:58.471 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:52:58.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:52:58.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:52:58.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:52:58.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:52:59.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:52:59.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:52:59.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:52:59.244 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:52:59.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:52:59.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:52:59.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:52:59.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:53:02.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:53:02.266 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:53:02.267 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:53:02.267 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:53:02.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:53:02.291 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:53:02.291 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:53:02.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:53:02.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:53:02.292 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:53:02.293 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:53:02.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:53:02.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:53:02.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:53:02.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:53:02.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:53:02.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:53:02.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:53:02.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:53:02.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:53:02.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:53:02.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:53:02.635 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:53:02.708 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:53:01
2026-06-04T06:53:02.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88213, datetime.datetime(2026, 6, 4, 6, 53, 1), datetime.datetime(2026, 6, 4, 6, 53), 'salt', 1.77, 100.78, None, 37.37, 152.82, -0.11, 821.41, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:53:02.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:53:02.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:53:02.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:53:00, diff=2.716288s, valid=True
2026-06-04T06:53:02.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:53:02.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:53:02.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:53:12, diff=-9.280143s, valid=True
2026-06-04T06:53:02.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:53:02.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:53:02.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:52:55, diff=7.728173s, valid=True
2026-06-04T06:53:02.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:53:02.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:53:02.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:53:02.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:53:02.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:53:02.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:53:02.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:53:12, diff=-9.268051s, valid=True
2026-06-04T06:53:02.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:53:02.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:53:02.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:53:02.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=122979.732774s, valid=True
2026-06-04T06:53:02.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:53:02.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:53:02.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:53:02.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:53:02.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:53:02.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:53:02.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:53:02.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:53:02.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:53:02.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:53:02.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:53:02.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:53:03.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:53:03.053 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:53:03.268 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:53:03.672 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:53:03.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:53:03.774 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:53:03.774 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:53:03.868 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:53:03.868 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:53:33.899 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:53:33.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:53:33.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:53:34.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:53:34.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:53:34.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:53:34.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:53:34.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:53:34.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:53:34.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:53:34.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:53:34.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:53:34.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:53:37.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:53:37.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:53:37.367 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:53:37.367 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:53:37.377 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:53:37.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:53:37.390 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:53:37.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:53:37.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:53:37.391 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:53:37.391 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:53:37.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:53:37.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:53:37.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:53:37.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:53:37.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:53:37.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:53:37.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:53:37.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:53:37.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:53:37.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:53:37.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:53:37.722 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:53:37.793 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:53:31
2026-06-04T06:53:37.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88214, datetime.datetime(2026, 6, 4, 6, 53, 31), datetime.datetime(2026, 6, 4, 6, 53, 30), 'salt', 1.67, 100.58, None, 39.45, 153.73, -0.08, 821.41, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:53:37.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:53:37.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:53:37.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:53:30, diff=7.801124s, valid=True
2026-06-04T06:53:37.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:53:37.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:53:37.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:53:12, diff=25.8046s, valid=True
2026-06-04T06:53:37.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:53:37.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:53:37.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:53:26, diff=11.812734s, valid=True
2026-06-04T06:53:37.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:53:37.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:53:37.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:53:37.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:53:37.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:53:37.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:53:37.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:53:12, diff=25.816471s, valid=True
2026-06-04T06:53:37.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:53:37.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:53:37.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:53:37.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123014.817287s, valid=True
2026-06-04T06:53:37.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:53:37.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:53:37.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:53:37.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:53:37.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:53:37.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:53:37.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:53:37.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:53:37.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:53:37.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:53:38.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:53:38.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:53:38.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:53:38.139 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:53:38.371 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:53:38.724 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:53:38.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:53:38.826 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:53:38.826 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:53:38.981 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:53:38.981 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:54:09.011 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:54:09.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:54:09.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:54:09.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:54:09.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:54:09.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:54:09.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:54:09.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:54:09.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:54:09.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:54:09.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:54:09.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:54:09.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:54:12.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:54:12.604 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:54:12.605 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:54:12.605 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:54:12.616 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:54:12.628 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:54:12.629 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:54:12.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:54:12.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:54:12.630 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:54:12.630 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:54:12.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:54:12.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:54:12.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:54:12.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:54:12.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:54:12.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:54:12.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:54:12.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:54:12.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:54:12.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:54:12.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:54:12.964 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:54:13.038 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:54:01
2026-06-04T06:54:13.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88215, datetime.datetime(2026, 6, 4, 6, 54, 1), datetime.datetime(2026, 6, 4, 6, 54), 'salt', 1.73, 100.74, None, 34.33, 169.26, -0.11, 821.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:54:13.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:54:13.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:54:13.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:54:00, diff=13.046091s, valid=True
2026-06-04T06:54:13.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:54:13.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:54:13.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:54:12, diff=1.049631s, valid=True
2026-06-04T06:54:13.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:54:13.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:54:13.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:53:56, diff=17.057724s, valid=True
2026-06-04T06:54:13.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:54:13.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:54:13.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:54:13.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:54:13.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:54:13.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:54:13.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:54:12, diff=1.061457s, valid=True
2026-06-04T06:54:13.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:54:13.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:54:13.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:54:13.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123050.062268s, valid=True
2026-06-04T06:54:13.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:54:13.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:54:13.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:54:13.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:54:13.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:54:13.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:54:13.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:54:13.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:54:13.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:54:13.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:54:13.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:54:13.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:54:13.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:54:13.381 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:54:13.664 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:54:14.004 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:54:14.107 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:54:14.108 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:54:14.108 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:54:16.470 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:54:16.470 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:54:46.497 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:54:46.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:54:46.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:54:46.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:54:46.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:54:47.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:54:47.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:54:47.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:54:47.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:54:47.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:54:47.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:54:47.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:54:47.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:54:50.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:54:50.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:54:50.057 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:54:50.058 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:54:50.066 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:54:50.078 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:54:50.079 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:54:50.079 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:54:50.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:54:50.079 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:54:50.080 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:54:50.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:54:50.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:54:50.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:54:50.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:54:50.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:54:50.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:54:50.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:54:50.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:54:50.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:54:50.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:54:50.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:54:50.365 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:54:50.436 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:54:31
2026-06-04T06:54:50.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88216, datetime.datetime(2026, 6, 4, 6, 54, 31), datetime.datetime(2026, 6, 4, 6, 54, 31), 'salt', 1.73, 100.71, None, 39.59, 142.51, -0.1, 821.41, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:54:50.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:54:50.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:54:50.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:54:31, diff=19.443888s, valid=True
2026-06-04T06:54:50.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:54:50.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:54:50.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:54:12, diff=38.447137s, valid=True
2026-06-04T06:54:50.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:54:50.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:54:50.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:54:26, diff=24.454645s, valid=True
2026-06-04T06:54:50.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:54:50.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:54:50.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:54:50.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:54:50.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:54:50.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:54:50.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:54:12, diff=38.458106s, valid=True
2026-06-04T06:54:50.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:54:50.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:54:50.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:54:50.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123087.458879s, valid=True
2026-06-04T06:54:50.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:54:50.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:54:50.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:54:50.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:54:50.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:54:50.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:54:50.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:54:50.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:54:50.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:54:50.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:54:50.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:54:50.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:54:50.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:54:50.781 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:54:50.991 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:54:51.335 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:54:51.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:54:51.437 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:54:51.437 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:54:51.526 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:54:51.526 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:55:21.557 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:55:21.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:55:21.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:55:21.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:55:21.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:55:21.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:55:21.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:55:21.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:55:21.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:55:21.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:55:21.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:55:21.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:55:21.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:55:24.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:55:24.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:55:24.886 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:55:24.887 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:55:24.897 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:55:24.910 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:55:24.910 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:55:24.911 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:55:24.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:55:24.911 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:55:24.911 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:55:24.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:55:25.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:55:25.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:55:25.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:55:25.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:55:25.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:55:25.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:55:25.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:55:25.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:55:25.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:55:25.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:55:25.241 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:55:25.314 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:55:02
2026-06-04T06:55:25.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88217, datetime.datetime(2026, 6, 4, 6, 55, 2), datetime.datetime(2026, 6, 4, 6, 55, 1), 'salt', 1.63, 100.64, None, 34.37, 149.91, -0.09, 821.41, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:55:25.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:55:25.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:55:25.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:55:01, diff=24.32145s, valid=True
2026-06-04T06:55:25.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:55:25.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:55:25.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:55:12, diff=13.324915s, valid=True
2026-06-04T06:55:25.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:55:25.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:55:25.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:54:56, diff=29.333064s, valid=True
2026-06-04T06:55:25.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:55:25.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:55:25.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:55:25.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:55:25.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:55:25.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:55:25.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:55:12, diff=13.336847s, valid=True
2026-06-04T06:55:25.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:55:25.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:55:25.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:55:25.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123122.33767s, valid=True
2026-06-04T06:55:25.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:55:25.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:55:25.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:55:25.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:55:25.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:55:25.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:55:25.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:55:25.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:55:25.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:55:25.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:55:25.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:55:25.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:55:25.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:55:25.724 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:55:25.935 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:55:26.279 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:55:26.380 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:55:26.380 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:55:26.380 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:55:26.540 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:55:26.540 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:55:56.570 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:55:56.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:55:56.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:55:56.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:55:56.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:55:57.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:55:57.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:55:57.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:55:57.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:55:57.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:55:57.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:55:57.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:55:57.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:55:59.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:55:59.905 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:55:59.905 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:55:59.906 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:55:59.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:55:59.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:55:59.927 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:55:59.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:55:59.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:55:59.927 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:55:59.928 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:55:59.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:56:00.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:56:00.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:56:00.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:56:00.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:56:00.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:56:00.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:56:00.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T06:56:00.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:56:00.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:56:00.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:56:00.206 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:56:00.276 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:55:32
2026-06-04T06:56:00.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88218, datetime.datetime(2026, 6, 4, 6, 55, 32), datetime.datetime(2026, 6, 4, 6, 55, 31), 'salt', 1.7, 100.68, None, 30.38, 142.83, -0.1, 821.29, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:56:00.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:56:00.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:56:00.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:55:31, diff=29.283352s, valid=True
2026-06-04T06:56:00.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:56:00.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:56:00.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:55:12, diff=48.29034s, valid=True
2026-06-04T06:56:00.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:56:00.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:56:00.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:55:27, diff=33.300587s, valid=True
2026-06-04T06:56:00.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:56:00.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:56:00.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:56:00.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:56:00.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:56:00.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T06:56:00.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:55:12, diff=48.303898s, valid=True
2026-06-04T06:56:00.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:56:00.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:56:00.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:56:00.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123157.304607s, valid=True
2026-06-04T06:56:00.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:56:00.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:56:00.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:56:00.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:56:00.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:56:00.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:56:00.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:56:00.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:56:00.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:56:00.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:56:00.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:56:00.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:56:00.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:56:00.621 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:56:00.832 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:56:01.225 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:56:01.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:56:01.327 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:56:01.327 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:56:01.599 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:56:01.599 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:56:31.630 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:56:31.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:56:31.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:56:31.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:56:31.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:56:32.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:56:32.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:56:32.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:56:32.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:56:32.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:56:32.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:56:32.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:56:32.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:56:34.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:56:34.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:56:34.931 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:56:34.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:56:34.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:56:34.954 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:56:34.955 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:56:34.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:56:34.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:56:34.956 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:56:34.956 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:56:34.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:56:35.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:56:35.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:56:35.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:56:35.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:56:35.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T06:56:35.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:56:35.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T06:56:35.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:56:35.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:56:35.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:56:35.314 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:56:35.389 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:56:32
2026-06-04T06:56:35.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88220, datetime.datetime(2026, 6, 4, 6, 56, 32), datetime.datetime(2026, 6, 4, 6, 56, 32), 'salt', 1.8, 100.74, None, 41.14, 154.77, -0.1, 821.23, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:56:35.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:56:35.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:56:35.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:56:32, diff=3.397187s, valid=True
2026-06-04T06:56:35.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:56:35.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T06:56:35.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:55:12, diff=83.400743s, valid=True
2026-06-04T06:56:35.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:56:35.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:56:35.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:56:27, diff=8.409175s, valid=True
2026-06-04T06:56:35.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:56:35.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:56:35.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:56:35.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:56:35.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:56:35.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T06:56:35.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:55:12, diff=83.413028s, valid=True
2026-06-04T06:56:35.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:56:35.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:56:35.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:56:35.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123192.413872s, valid=True
2026-06-04T06:56:35.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:56:35.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:56:35.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:56:35.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:56:35.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:56:35.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:56:35.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:56:35.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:56:35.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:56:35.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:56:35.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:56:35.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:56:35.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:56:35.801 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:56:36.010 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:56:36.355 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:56:36.457 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:56:36.457 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:56:36.457 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:56:36.611 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:56:36.612 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:57:06.641 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:57:06.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:57:06.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:57:06.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:57:06.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:57:07.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:57:07.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:57:07.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:57:07.221 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:57:07.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:57:07.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:57:07.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:57:07.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:57:10.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:57:10.170 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:57:10.171 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:57:10.171 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:57:10.181 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:57:10.193 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:57:10.193 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:57:10.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:57:10.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:57:10.194 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:57:10.194 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:57:10.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:57:10.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:57:10.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:57:10.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:57:10.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:57:10.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T06:57:10.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:57:10.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T06:57:10.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:57:10.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:57:10.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:57:10.543 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:57:10.627 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:57:03
2026-06-04T06:57:10.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88221, datetime.datetime(2026, 6, 4, 6, 57, 3), datetime.datetime(2026, 6, 4, 6, 57, 2), 'salt', 1.73, 100.74, None, 39.98, 156.01, -0.11, 821.41, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:57:10.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:57:10.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:57:10.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:57:02, diff=8.634534s, valid=True
2026-06-04T06:57:10.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:57:10.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T06:57:10.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:55:12, diff=118.63801s, valid=True
2026-06-04T06:57:10.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:57:10.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:57:10.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:56:57, diff=13.645998s, valid=True
2026-06-04T06:57:10.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:57:10.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:57:10.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:57:10.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:57:10.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:57:10.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T06:57:10.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:55:12, diff=118.649589s, valid=True
2026-06-04T06:57:10.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:57:10.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:57:10.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:57:10.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123227.650366s, valid=True
2026-06-04T06:57:10.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:57:10.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:57:10.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:57:10.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:57:10.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:57:10.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:57:10.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:57:10.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:57:10.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:57:10.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:57:10.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:57:10.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:57:10.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:57:10.972 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:57:11.182 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:57:11.525 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:57:11.633 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:57:11.633 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:57:11.633 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:57:11.819 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:57:11.820 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:57:41.832 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:57:41.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:57:41.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:57:42.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:57:42.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:57:42.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:57:42.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:57:42.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:57:42.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:57:42.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:57:42.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:57:42.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:57:42.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:57:45.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:57:45.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:57:45.367 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:57:45.367 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:57:45.378 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:57:45.391 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:57:45.392 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:57:45.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:57:45.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:57:45.393 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:57:45.393 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:57:45.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:57:45.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:57:45.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:57:45.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:57:45.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:57:45.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T06:57:45.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:57:45.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T06:57:45.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:57:45.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:57:45.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:57:45.730 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:57:45.800 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:57:33
2026-06-04T06:57:45.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88222, datetime.datetime(2026, 6, 4, 6, 57, 33), datetime.datetime(2026, 6, 4, 6, 57, 33), 'salt', 1.7, 100.78, None, 38.53, 159.39, -0.11, 821.35, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:57:45.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:57:45.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:57:45.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:57:33, diff=12.808162s, valid=True
2026-06-04T06:57:45.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:57:45.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T06:57:45.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:55:12, diff=153.811627s, valid=True
2026-06-04T06:57:45.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:57:45.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:57:45.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:57:28, diff=17.819656s, valid=True
2026-06-04T06:57:45.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:57:45.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:57:45.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:57:45.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:57:45.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:57:45.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T06:57:45.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:55:12, diff=153.823344s, valid=True
2026-06-04T06:57:45.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:57:45.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:57:45.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:57:45.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123262.824172s, valid=True
2026-06-04T06:57:45.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:57:45.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:57:45.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:57:45.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:57:45.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:57:45.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:57:45.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:57:45.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:57:45.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:57:45.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:57:46.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:57:46.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:57:46.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:57:46.142 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:57:46.351 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:57:46.694 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:57:46.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:57:46.796 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:57:46.796 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:57:46.988 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:57:46.988 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:58:16.997 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:58:16.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:58:16.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:58:17.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:58:17.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:58:17.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:58:17.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:58:17.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:58:17.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:58:17.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:58:17.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:58:17.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:58:17.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:58:20.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:58:20.652 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:58:20.653 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:58:20.653 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:58:20.664 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:58:20.677 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:58:20.678 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:58:20.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:58:20.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:58:20.679 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:58:20.679 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:58:20.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:58:20.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:58:20.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:58:20.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:58:20.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:58:20.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T06:58:20.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:58:20.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T06:58:20.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:58:20.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:58:20.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:58:20.995 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:58:21.068 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:58:03
2026-06-04T06:58:21.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88223, datetime.datetime(2026, 6, 4, 6, 58, 3), datetime.datetime(2026, 6, 4, 6, 58, 2), 'salt', 1.7, 100.74, None, 34.05, 134.47, -0.1, 821.41, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:58:21.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:58:21.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:58:21.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:58:02, diff=19.075352s, valid=True
2026-06-04T06:58:21.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:58:21.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T06:58:21.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:55:12, diff=189.078695s, valid=True
2026-06-04T06:58:21.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:58:21.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:58:21.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:57:58, diff=23.086752s, valid=True
2026-06-04T06:58:21.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:58:21.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:58:21.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:58:21.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:58:21.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:58:21.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T06:58:21.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:55:12, diff=189.090342s, valid=True
2026-06-04T06:58:21.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:58:21.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:58:21.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:58:21.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123298.091134s, valid=True
2026-06-04T06:58:21.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:58:21.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:58:21.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:58:21.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:58:21.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:58:21.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:58:21.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:58:21.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:58:21.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:58:21.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:58:21.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:58:21.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:58:21.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:58:21.415 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:58:21.686 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:58:22.026 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:58:22.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:58:22.127 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:58:22.127 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:58:22.355 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:58:22.355 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:58:52.386 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:58:52.386 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:58:52.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:58:52.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:58:52.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:58:52.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:58:52.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:58:52.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:58:52.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:58:52.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:58:52.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:58:52.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:58:52.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:58:55.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:58:55.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:58:55.936 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:58:55.937 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:58:55.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:58:55.962 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:58:55.962 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:58:55.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:58:55.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:58:55.963 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:58:55.964 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:58:55.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:58:56.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:58:56.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:58:56.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:58:56.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:58:56.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T06:58:56.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:58:56.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T06:58:56.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:58:56.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:58:56.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:58:56.297 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:58:56.373 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:58:33
2026-06-04T06:58:56.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88224, datetime.datetime(2026, 6, 4, 6, 58, 33), datetime.datetime(2026, 6, 4, 6, 58, 33), 'salt', 1.67, 100.64, None, 30.24, 151.41, -0.09, 821.41, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:58:56.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:58:56.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:58:56.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:58:33, diff=23.380636s, valid=True
2026-06-04T06:58:56.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:58:56.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T06:58:56.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:55:12, diff=224.384115s, valid=True
2026-06-04T06:58:56.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:58:56.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:58:56.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:58:28, diff=28.392268s, valid=True
2026-06-04T06:58:56.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:58:56.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:58:56.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:58:56.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:58:56.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:58:56.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T06:58:56.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:55:12, diff=224.395989s, valid=True
2026-06-04T06:58:56.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:58:56.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:58:56.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:58:56.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123333.396799s, valid=True
2026-06-04T06:58:56.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:58:56.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:58:56.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:58:56.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:58:56.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:58:56.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:58:56.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:58:56.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:58:56.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:58:56.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:58:56.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:58:56.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:58:56.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:58:56.715 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:58:56.923 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:58:57.264 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:58:57.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:58:57.365 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:58:57.365 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:58:57.524 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:58:57.525 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T06:59:27.555 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T06:59:27.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T06:59:27.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T06:59:27.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T06:59:27.882 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T06:59:28.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T06:59:28.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T06:59:28.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T06:59:28.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T06:59:28.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T06:59:28.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T06:59:28.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T06:59:28.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T06:59:31.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T06:59:31.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T06:59:31.442 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T06:59:31.442 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T06:59:31.452 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T06:59:31.464 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T06:59:31.465 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T06:59:31.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T06:59:31.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T06:59:31.466 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T06:59:31.467 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T06:59:31.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T06:59:31.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T06:59:31.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T06:59:31.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T06:59:31.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:59:31.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:59:31.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T06:59:31.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T06:59:31.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T06:59:31.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T06:59:31.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T06:59:31.808 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T06:59:31.881 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 06:59:04
2026-06-04T06:59:31.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88225, datetime.datetime(2026, 6, 4, 6, 59, 4), datetime.datetime(2026, 6, 4, 6, 59, 3), 'salt', 1.67, 100.71, None, 37.82, 157.52, -0.1, 821.29, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T06:59:31.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T06:59:31.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T06:59:31.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:59:03, diff=28.889293s, valid=True
2026-06-04T06:59:31.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T06:59:31.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:59:31.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:55:12, diff=259.892744s, valid=True
2026-06-04T06:59:31.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T06:59:31.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T06:59:31.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:58:59, diff=32.900837s, valid=True
2026-06-04T06:59:31.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T06:59:31.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:59:31.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T06:59:31.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T06:59:31.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T06:59:31.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T06:59:31.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:55:12, diff=259.904534s, valid=True
2026-06-04T06:59:31.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T06:59:31.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T06:59:31.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T06:59:31.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123368.905364s, valid=True
2026-06-04T06:59:31.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T06:59:31.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T06:59:31.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T06:59:31.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T06:59:31.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T06:59:31.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T06:59:31.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T06:59:31.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T06:59:31.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T06:59:32.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T06:59:32.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T06:59:32.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T06:59:32.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T06:59:32.300 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T06:59:32.507 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:59:32.849 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T06:59:32.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T06:59:32.951 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T06:59:32.951 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T06:59:33.139 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T06:59:33.140 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:00:03.166 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:00:03.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:00:03.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:00:03.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:00:03.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:00:03.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:00:03.485 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:00:03.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:00:03.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:00:03.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:00:03.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:00:03.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:00:03.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:00:06.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:00:06.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:00:06.265 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:00:06.265 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:00:06.274 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:00:06.285 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:00:06.286 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:00:06.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:00:06.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:00:06.286 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:00:06.286 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:00:06.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:00:06.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:00:06.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:00:06.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:00:06.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:00:06.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:00:06.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:00:06.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:00:06.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:00:06.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:00:06.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:00:06.554 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:00:06.625 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:00:04
2026-06-04T07:00:06.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88227, datetime.datetime(2026, 6, 4, 7, 0, 4), datetime.datetime(2026, 6, 4, 7, 0, 3), 'salt', 1.7, 100.74, None, 39.31, 145.09, -0.1, 821.54, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:00:06.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:00:06.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:00:06.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:00:03, diff=3.631307s, valid=True
2026-06-04T07:00:06.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:00:06.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:00:06.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:00:12, diff=-5.366003s, valid=True
2026-06-04T07:00:06.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:00:06.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:00:06.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 06:59:59, diff=7.640202s, valid=True
2026-06-04T07:00:06.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:00:06.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:00:06.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:00:06.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:00:06.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:00:06.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:00:06.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:00:12, diff=-5.356891s, valid=True
2026-06-04T07:00:06.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:00:06.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:00:06.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:00:06.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123403.643739s, valid=True
2026-06-04T07:00:06.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:00:06.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:00:06.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:00:06.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:00:06.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:00:06.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:00:06.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:00:06.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:00:06.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:00:06.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:00:06.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:00:06.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:00:06.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:00:06.941 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:00:07.141 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:00:07.467 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:00:07.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:00:07.566 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:00:07.566 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:00:07.751 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:00:07.751 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:00:37.781 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:00:37.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:00:37.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:00:38.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:00:38.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:00:38.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:00:38.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:00:38.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:00:38.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:00:38.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:00:38.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:00:38.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:00:38.363 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:00:41.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:00:41.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:00:41.248 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:00:41.248 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:00:41.258 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:00:41.271 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:00:41.271 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:00:41.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:00:41.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:00:41.272 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:00:41.273 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:00:41.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:00:41.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:00:41.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:00:41.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:00:41.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:00:41.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:00:41.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:00:41.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:00:41.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:00:41.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:00:41.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:00:41.622 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:00:41.693 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:00:34
2026-06-04T07:00:41.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88228, datetime.datetime(2026, 6, 4, 7, 0, 34), datetime.datetime(2026, 6, 4, 7, 0, 34), 'salt', 1.63, 100.74, None, 33.59, 154.56, -0.11, 821.35, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:00:41.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:00:41.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:00:41.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:00:34, diff=7.701555s, valid=True
2026-06-04T07:00:41.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:00:41.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:00:41.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:01:12, diff=-30.294931s, valid=True
2026-06-04T07:00:41.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:00:41.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:00:41.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:00:29, diff=12.714681s, valid=True
2026-06-04T07:00:41.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:00:41.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:00:41.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:00:41.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:00:41.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:00:41.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:00:41.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:01:12, diff=-30.28156s, valid=True
2026-06-04T07:00:41.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:00:41.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:00:41.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:00:41.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123438.719291s, valid=True
2026-06-04T07:00:41.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:00:41.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:00:41.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:00:41.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:00:41.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:00:41.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:00:41.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:00:41.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:00:41.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:00:41.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:00:41.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:00:42.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:00:42.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:00:42.128 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:00:42.358 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:00:42.706 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:00:42.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:00:42.810 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:00:42.810 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:00:42.899 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:00:42.899 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:01:12.926 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:01:12.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:01:12.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:01:13.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:01:13.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:01:13.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:01:13.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:01:13.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:01:13.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:01:13.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:01:13.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:01:13.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:01:13.525 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:01:16.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:01:16.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:01:16.534 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:01:16.534 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:01:16.544 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:01:16.556 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:01:16.556 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:01:16.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:01:16.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:01:16.556 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:01:16.556 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:01:16.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:01:16.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:01:16.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:01:16.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:01:16.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:01:16.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:01:16.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:01:16.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:01:16.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:01:16.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:01:16.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:01:16.899 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:01:16.971 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:01:05
2026-06-04T07:01:16.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88229, datetime.datetime(2026, 6, 4, 7, 1, 5), datetime.datetime(2026, 6, 4, 7, 1, 4), 'salt', 1.7, 100.71, None, 40.72, 147.81, -0.1, 821.35, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:01:16.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:01:16.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:01:16.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:01:04, diff=12.97903s, valid=True
2026-06-04T07:01:16.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:01:16.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:01:16.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:01:12, diff=4.982485s, valid=True
2026-06-04T07:01:16.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:01:16.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:01:16.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:00:59, diff=17.990608s, valid=True
2026-06-04T07:01:16.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:01:16.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:01:16.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:01:16.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:01:16.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:01:16.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:01:16.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:01:12, diff=4.994318s, valid=True
2026-06-04T07:01:16.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:01:16.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:01:16.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:01:16.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123473.995164s, valid=True
2026-06-04T07:01:16.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:01:16.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:01:16.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:01:16.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:01:16.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:01:17.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:01:17.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:01:17.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:01:17.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:01:17.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:01:17.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:01:17.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:01:17.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:01:17.315 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:01:17.526 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:01:17.872 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:01:17.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:01:17.975 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:01:17.975 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:01:18.062 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:01:18.062 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:01:48.063 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:01:48.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:01:48.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:01:48.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:01:48.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:01:48.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:01:48.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:01:48.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:01:48.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:01:48.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:01:48.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:01:48.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:01:48.507 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:01:51.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:01:51.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:01:51.714 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:01:51.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:01:51.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:01:51.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:01:51.737 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:01:51.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:01:51.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:01:51.738 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:01:51.738 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:01:51.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:01:51.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:01:51.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:01:51.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:01:51.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:01:52.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:01:52.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:01:52.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:01:52.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:01:52.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:01:52.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:01:52.081 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:01:52.153 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:01:35
2026-06-04T07:01:52.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88230, datetime.datetime(2026, 6, 4, 7, 1, 35), datetime.datetime(2026, 6, 4, 7, 1, 34), 'salt', 1.67, 100.68, None, 37.08, 142.57, -0.09, 821.48, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:01:52.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:01:52.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:01:52.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:01:34, diff=18.161086s, valid=True
2026-06-04T07:01:52.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:01:52.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:01:52.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:02:12, diff=-19.835529s, valid=True
2026-06-04T07:01:52.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:01:52.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:01:52.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:01:30, diff=22.172386s, valid=True
2026-06-04T07:01:52.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:01:52.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:01:52.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:01:52.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:01:52.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:01:52.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:01:52.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:02:12, diff=-19.824052s, valid=True
2026-06-04T07:01:52.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:01:52.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:01:52.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:01:52.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123509.176726s, valid=True
2026-06-04T07:01:52.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:01:52.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:01:52.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:01:52.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:01:52.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:01:52.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:01:52.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:01:52.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:01:52.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:01:52.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:01:52.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:01:52.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:01:52.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:01:52.564 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:01:52.773 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:01:53.116 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:01:53.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:01:53.217 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:01:53.217 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:01:53.416 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:01:53.416 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:02:23.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:02:23.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:02:23.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:02:23.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:02:23.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:02:23.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:02:23.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:02:24.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:02:24.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:02:24.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:02:24.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:02:24.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:02:24.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:02:27.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:02:27.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:02:27.031 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:02:27.032 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:02:27.042 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:02:27.055 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:02:27.055 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:02:27.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:02:27.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:02:27.056 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:02:27.056 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:02:27.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:02:27.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:02:27.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:02:27.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:02:27.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:02:27.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:02:27.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:02:27.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:02:27.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:02:27.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:02:27.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:02:27.385 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:02:27.454 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:02:06
2026-06-04T07:02:27.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88231, datetime.datetime(2026, 6, 4, 7, 2, 6), datetime.datetime(2026, 6, 4, 7, 2, 4), 'salt', 1.63, 100.74, None, 34.26, 147.18, -0.11, 821.48, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:02:27.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:02:27.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:02:27.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:02:04, diff=23.462101s, valid=True
2026-06-04T07:02:27.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:02:27.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:02:27.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:02:12, diff=15.465563s, valid=True
2026-06-04T07:02:27.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:02:27.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:02:27.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:02:00, diff=27.473702s, valid=True
2026-06-04T07:02:27.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:02:27.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:02:27.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:02:27.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:02:27.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:02:27.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:02:27.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:02:12, diff=15.47739s, valid=True
2026-06-04T07:02:27.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:02:27.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:02:27.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:02:27.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123544.4782s, valid=True
2026-06-04T07:02:27.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:02:27.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:02:27.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:02:27.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:02:27.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:02:27.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:02:27.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:02:27.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:02:27.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:02:27.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:02:27.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:02:27.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:02:27.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:02:27.799 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:02:28.006 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:02:28.348 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:02:28.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:02:28.450 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:02:28.450 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:02:28.538 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:02:28.538 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:02:58.555 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:02:58.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:02:58.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:02:58.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:02:58.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:02:59.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:02:59.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:02:59.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:02:59.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:02:59.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:02:59.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:02:59.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:02:59.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:03:02.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:03:02.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:03:02.022 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:03:02.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:03:02.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:03:02.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:03:02.046 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:03:02.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:03:02.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:03:02.047 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:03:02.047 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:03:02.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:03:02.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:03:02.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:03:02.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:03:02.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:03:02.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:03:02.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:03:02.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:03:02.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:03:02.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:03:02.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:03:02.385 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:03:02.456 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:02:36
2026-06-04T07:03:02.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88232, datetime.datetime(2026, 6, 4, 7, 2, 36), datetime.datetime(2026, 6, 4, 7, 2, 35), 'salt', 1.7, 100.68, None, 31.19, 154.27, -0.1, 821.54, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:03:02.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:03:02.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:03:02.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:02:35, diff=27.464396s, valid=True
2026-06-04T07:03:02.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:03:02.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:03:02.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:03:12, diff=-9.532101s, valid=True
2026-06-04T07:03:02.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:03:02.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:03:02.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:02:30, diff=32.476171s, valid=True
2026-06-04T07:03:02.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:03:02.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:03:02.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:03:02.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:03:02.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:03:02.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:03:02.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:03:12, diff=-9.520037s, valid=True
2026-06-04T07:03:02.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:03:02.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:03:02.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:03:02.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123579.480774s, valid=True
2026-06-04T07:03:02.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:03:02.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:03:02.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:03:02.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:03:02.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:03:02.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:03:02.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:03:02.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:03:02.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:03:02.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:03:02.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:03:02.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:03:02.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:03:02.802 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:03:03.011 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:03:03.358 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:03:03.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:03:03.459 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:03:03.460 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:03:03.648 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:03:03.649 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:03:33.678 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:03:33.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:03:33.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:03:33.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:03:33.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:03:34.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:03:34.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:03:34.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:03:34.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:03:34.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:03:34.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:03:34.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:03:34.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:03:37.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:03:37.077 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:03:37.078 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:03:37.079 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:03:37.090 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:03:37.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:03:37.104 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:03:37.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:03:37.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:03:37.107 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:03:37.107 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:03:37.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:03:37.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:03:37.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:03:37.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:03:37.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:03:37.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:03:37.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:03:37.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:03:37.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:03:37.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:03:37.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:03:37.448 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:03:37.555 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:03:36
2026-06-04T07:03:37.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88234, datetime.datetime(2026, 6, 4, 7, 3, 36), datetime.datetime(2026, 6, 4, 7, 3, 36), 'salt', 1.7, 100.74, None, 25.83, 139.62, -0.1, 821.54, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:03:37.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:03:37.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:03:37.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:03:36, diff=1.561422s, valid=True
2026-06-04T07:03:37.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:03:37.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:03:37.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:04:12, diff=-34.435715s, valid=True
2026-06-04T07:03:37.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:03:37.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:03:37.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:03:31, diff=6.570962s, valid=True
2026-06-04T07:03:37.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:03:37.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:03:37.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:03:37.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:03:37.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:03:37.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:03:37.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:04:12, diff=-34.426004s, valid=True
2026-06-04T07:03:37.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:03:37.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:03:37.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:03:37.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123614.574642s, valid=True
2026-06-04T07:03:37.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:03:37.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:03:37.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:03:37.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:03:37.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:03:37.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:03:37.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:03:37.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:03:37.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:03:37.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:03:37.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:03:37.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:03:37.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:03:37.891 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:03:38.114 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:03:38.518 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:03:38.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:03:38.620 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:03:38.620 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:03:38.840 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:03:38.840 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:04:08.860 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:04:08.860 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:04:08.860 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:04:09.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:04:09.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:04:09.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:04:09.534 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:04:09.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:04:09.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:04:09.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:04:09.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:04:09.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:04:09.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:04:12.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:04:12.517 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:04:12.518 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:04:12.518 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:04:12.530 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:04:12.542 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:04:12.543 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:04:12.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:04:12.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:04:12.544 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:04:12.544 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:04:12.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:04:12.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:04:12.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:04:12.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:04:12.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:04:12.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:04:12.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:04:12.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:04:12.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:04:12.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:04:12.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:04:12.892 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:04:12.980 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:04:07
2026-06-04T07:04:12.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88235, datetime.datetime(2026, 6, 4, 7, 4, 7), datetime.datetime(2026, 6, 4, 7, 4, 6), 'salt', 1.7, 100.74, None, 34.97, 151.71, -0.1, 821.48, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:04:12.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:04:12.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:04:12.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:04:06, diff=6.987608s, valid=True
2026-06-04T07:04:12.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:04:12.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:04:12.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:04:12, diff=0.991105s, valid=True
2026-06-04T07:04:12.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:04:12.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:04:12.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:04:01, diff=11.999426s, valid=True
2026-06-04T07:04:12.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:04:12.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:04:12.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:04:12.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:04:12.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:04:13.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:04:13.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:04:12, diff=1.003138s, valid=True
2026-06-04T07:04:13.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:04:13.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:04:13.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:04:13.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123650.00395s, valid=True
2026-06-04T07:04:13.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:04:13.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:04:13.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:04:13.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:04:13.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:04:13.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:04:13.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:04:13.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:04:13.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:04:13.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:04:13.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:04:13.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:04:13.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:04:13.323 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:04:13.532 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:04:13.874 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:04:13.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:04:13.975 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:04:13.975 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:04:14.236 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:04:14.236 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:04:44.244 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:04:44.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:04:44.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:04:44.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:04:44.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:04:44.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:04:44.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:04:44.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:04:44.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:04:44.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:04:44.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:04:44.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:04:44.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:04:47.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:04:47.703 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:04:47.703 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:04:47.704 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:04:47.713 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:04:47.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:04:47.726 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:04:47.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:04:47.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:04:47.728 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:04:47.728 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:04:47.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:04:47.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:04:47.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:04:47.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:04:47.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:04:48.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:04:48.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:04:48.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:04:48.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:04:48.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:04:48.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:04:48.066 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:04:48.145 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:04:37
2026-06-04T07:04:48.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88236, datetime.datetime(2026, 6, 4, 7, 4, 37), datetime.datetime(2026, 6, 4, 7, 4, 36), 'salt', 1.63, 100.68, None, 29.22, 141.54, -0.1, 821.6, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:04:48.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:04:48.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:04:48.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:04:36, diff=12.152904s, valid=True
2026-06-04T07:04:48.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:04:48.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:04:48.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:05:12, diff=-23.843665s, valid=True
2026-06-04T07:04:48.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:04:48.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:04:48.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:04:31, diff=17.164305s, valid=True
2026-06-04T07:04:48.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:04:48.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:04:48.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:04:48.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:04:48.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:04:48.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:04:48.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:05:12, diff=-23.832051s, valid=True
2026-06-04T07:04:48.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:04:48.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:04:48.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:04:48.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123685.168749s, valid=True
2026-06-04T07:04:48.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:04:48.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:04:48.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:04:48.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:04:48.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:04:48.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:04:48.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:04:48.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:04:48.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:04:48.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:04:48.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:04:48.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:04:48.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:04:48.489 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:04:48.768 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:04:49.109 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:04:49.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:04:49.210 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:04:49.210 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:04:49.396 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:04:49.397 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:05:19.414 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:05:19.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:05:19.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:05:19.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:05:19.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:05:19.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:05:19.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:05:19.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:05:19.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:05:20.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:05:20.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:05:20.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:05:20.012 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:05:22.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:05:22.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:05:22.969 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:05:22.970 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:05:22.980 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:05:22.992 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:05:22.993 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:05:22.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:05:22.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:05:22.994 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:05:22.994 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:05:23.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:05:23.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:05:23.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:05:23.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:05:23.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:05:23.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:05:23.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:05:23.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:05:23.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:05:23.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:05:23.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:05:23.334 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:05:23.405 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:05:07
2026-06-04T07:05:23.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88237, datetime.datetime(2026, 6, 4, 7, 5, 7), datetime.datetime(2026, 6, 4, 7, 5, 7), 'salt', 1.77, 100.74, None, 30.7, 157.68, -0.1, 821.6, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:05:23.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:05:23.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:05:23.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:05:07, diff=16.412849s, valid=True
2026-06-04T07:05:23.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:05:23.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:05:23.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:05:12, diff=11.416304s, valid=True
2026-06-04T07:05:23.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:05:23.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:05:23.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:05:01, diff=22.424558s, valid=True
2026-06-04T07:05:23.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:05:23.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:05:23.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:05:23.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:05:23.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:05:23.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:05:23.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:05:12, diff=11.428247s, valid=True
2026-06-04T07:05:23.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:05:23.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:05:23.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:05:23.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123720.429062s, valid=True
2026-06-04T07:05:23.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:05:23.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:05:23.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:05:23.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:05:23.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:05:23.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:05:23.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:05:23.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:05:23.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:05:23.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:05:23.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:05:23.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:05:23.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:05:23.748 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:05:23.965 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:05:24.306 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:05:24.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:05:24.408 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:05:24.408 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:05:24.496 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:05:24.497 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:05:54.527 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:05:54.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:05:54.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:05:54.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:05:54.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:05:55.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:05:55.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:05:55.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:05:55.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:05:55.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:05:55.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:05:55.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:05:55.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:05:57.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:05:57.959 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:05:57.959 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:05:57.960 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:05:57.969 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:05:57.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:05:57.983 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:05:57.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:05:57.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:05:57.984 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:05:57.984 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:05:57.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:05:58.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:05:58.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:05:58.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:05:58.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:05:58.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:05:58.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:05:58.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:05:58.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:05:58.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:05:58.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:05:58.343 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:05:58.414 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:05:38
2026-06-04T07:05:58.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88238, datetime.datetime(2026, 6, 4, 7, 5, 38), datetime.datetime(2026, 6, 4, 7, 5, 37), 'salt', 1.7, 100.68, None, 32.74, 143.94, -0.1, 821.66, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:05:58.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:05:58.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:05:58.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:05:37, diff=21.421535s, valid=True
2026-06-04T07:05:58.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:05:58.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:05:58.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:06:12, diff=-13.574986s, valid=True
2026-06-04T07:05:58.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:05:58.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:05:58.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:05:31, diff=27.433249s, valid=True
2026-06-04T07:05:58.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:05:58.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:05:58.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:05:58.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:05:58.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:05:58.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:05:58.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:06:12, diff=-13.563015s, valid=True
2026-06-04T07:05:58.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:05:58.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:05:58.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:05:58.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123755.4378s, valid=True
2026-06-04T07:05:58.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:05:58.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:05:58.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:05:58.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:05:58.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:05:58.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:05:58.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:05:58.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:05:58.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:05:58.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:05:58.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:05:58.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:05:58.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:05:58.832 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:05:59.038 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:05:59.379 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:05:59.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:05:59.481 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:05:59.481 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:05:59.636 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:05:59.636 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:06:29.642 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:06:29.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:06:29.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:06:30.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:06:30.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:06:30.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:06:30.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:06:30.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:06:30.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:06:30.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:06:30.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:06:30.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:06:30.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:06:33.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:06:33.088 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:06:33.089 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:06:33.089 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:06:33.096 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:06:33.109 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:06:33.109 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:06:33.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:06:33.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:06:33.109 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:06:33.109 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:06:33.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:06:33.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:06:33.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:06:33.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:06:33.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:06:33.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:06:33.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:06:33.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:06:33.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:06:33.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:06:33.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:06:33.444 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:06:33.518 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:06:08
2026-06-04T07:06:33.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88239, datetime.datetime(2026, 6, 4, 7, 6, 8), datetime.datetime(2026, 6, 4, 7, 6, 7), 'salt', 1.73, 100.78, None, 30.1, 141.66, -0.11, 821.54, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:06:33.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:06:33.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:06:33.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:06:07, diff=26.525566s, valid=True
2026-06-04T07:06:33.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:06:33.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:06:33.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:06:12, diff=21.529076s, valid=True
2026-06-04T07:06:33.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:06:33.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:06:33.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:06:02, diff=31.537257s, valid=True
2026-06-04T07:06:33.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:06:33.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:06:33.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:06:33.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:06:33.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:06:33.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:06:33.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:06:12, diff=21.540934s, valid=True
2026-06-04T07:06:33.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:06:33.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:06:33.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:06:33.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123790.541749s, valid=True
2026-06-04T07:06:33.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:06:33.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:06:33.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:06:33.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:06:33.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:06:33.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:06:33.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:06:33.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:06:33.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:06:33.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:06:33.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:06:33.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:06:33.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:06:33.856 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:06:34.064 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:06:34.404 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:06:34.506 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:06:34.506 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:06:34.506 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:06:34.594 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:06:34.594 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:07:04.601 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:07:04.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:07:04.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:07:04.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:07:04.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:07:05.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:07:05.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:07:05.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:07:05.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:07:05.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:07:05.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:07:05.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:07:05.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:07:08.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:07:08.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:07:08.083 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:07:08.083 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:07:08.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:07:08.104 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:07:08.104 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:07:08.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:07:08.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:07:08.105 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:07:08.105 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:07:08.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:07:08.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-06-04T07:07:08.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:07:08.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-06-04T07:07:08.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:07:08.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:07:08.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:07:08.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:07:08.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:07:08.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:07:08.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:07:08.455 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:07:08.525 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:06:38
2026-06-04T07:07:08.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88240, datetime.datetime(2026, 6, 4, 7, 6, 38), datetime.datetime(2026, 6, 4, 7, 6, 37), 'salt', 1.73, 100.71, None, 27.98, 149.04, -0.1, 821.66, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:07:08.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:07:08.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-06-04T07:07:08.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:06:37, diff=31.534318s, valid=True
2026-06-04T07:07:08.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:07:08.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:07:08.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:07:12, diff=-3.462464s, valid=True
2026-06-04T07:07:08.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:07:08.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-06-04T07:07:08.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:06:32, diff=36.545429s, valid=True
2026-06-04T07:07:08.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:07:08.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:07:08.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:07:08.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:07:08.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:07:08.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:07:08.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:07:12, diff=-3.449659s, valid=True
2026-06-04T07:07:08.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:07:08.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:07:08.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:07:08.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123825.551204s, valid=True
2026-06-04T07:07:08.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:07:08.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:07:08.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:07:08.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:07:08.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:07:08.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:07:08.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:07:08.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:07:08.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:07:08.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:07:08.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:07:08.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:07:08.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:07:08.961 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:07:09.168 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:07:09.512 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:07:09.615 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:07:09.615 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:07:09.615 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:07:09.800 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:07:09.801 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:07:39.830 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:07:39.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:07:39.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:07:40.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:07:40.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:07:40.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:07:40.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:07:40.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:07:40.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:07:40.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:07:40.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:07:40.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:07:40.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:07:43.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:07:43.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:07:43.306 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:07:43.306 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:07:43.316 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:07:43.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:07:43.329 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:07:43.330 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:07:43.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:07:43.330 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:07:43.331 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:07:43.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:07:43.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:07:43.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:07:43.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:07:43.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:07:43.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:07:43.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:07:43.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:07:43.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:07:43.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:07:43.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:07:43.697 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:07:43.770 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:07:39
2026-06-04T07:07:43.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88242, datetime.datetime(2026, 6, 4, 7, 7, 39), datetime.datetime(2026, 6, 4, 7, 7, 38), 'salt', 1.77, 100.74, None, 30.1, 133.7, -0.1, 821.78, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:07:43.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:07:43.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:07:43.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:07:38, diff=5.77777s, valid=True
2026-06-04T07:07:43.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:07:43.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:07:43.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:08:12, diff=-28.218614s, valid=True
2026-06-04T07:07:43.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:07:43.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:07:43.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:07:32, diff=11.78991s, valid=True
2026-06-04T07:07:43.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:07:43.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:07:43.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:07:43.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:07:43.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:07:43.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:07:43.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:08:12, diff=-28.206258s, valid=True
2026-06-04T07:07:43.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:07:43.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:07:43.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:07:43.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123860.794567s, valid=True
2026-06-04T07:07:43.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:07:43.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:07:43.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:07:43.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:07:43.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:07:43.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:07:43.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:07:43.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:07:43.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:07:43.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:07:43.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:07:44.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:07:44.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:07:44.115 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:07:44.323 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:07:44.663 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:07:44.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:07:44.764 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:07:44.764 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:07:45.015 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:07:45.015 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:08:15.045 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:08:15.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:08:15.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:08:15.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:08:15.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:08:15.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:08:15.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:08:15.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:08:15.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:08:15.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:08:15.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:08:15.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:08:15.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:08:18.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:08:18.339 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:08:18.340 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:08:18.340 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:08:18.352 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:08:18.364 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:08:18.365 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:08:18.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:08:18.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:08:18.366 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:08:18.366 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:08:18.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:08:18.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:08:18.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:08:18.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:08:18.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:08:18.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:08:18.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:08:18.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:08:18.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:08:18.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:08:18.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:08:18.758 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:08:18.834 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:08:09
2026-06-04T07:08:18.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88243, datetime.datetime(2026, 6, 4, 7, 8, 9), datetime.datetime(2026, 6, 4, 7, 8, 8), 'salt', 1.77, 100.71, None, 28.93, 149.53, -0.1, 821.6, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:08:18.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:08:18.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:08:18.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:08:08, diff=10.842198s, valid=True
2026-06-04T07:08:18.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:08:18.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:08:18.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:08:12, diff=6.845968s, valid=True
2026-06-04T07:08:18.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:08:18.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:08:18.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:08:03, diff=15.854541s, valid=True
2026-06-04T07:08:18.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:08:18.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:08:18.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:08:18.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:08:18.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:08:18.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:08:18.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:08:12, diff=6.858443s, valid=True
2026-06-04T07:08:18.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:08:18.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:08:18.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:08:18.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123895.859289s, valid=True
2026-06-04T07:08:18.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:08:18.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:08:18.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:08:18.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:08:18.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:08:18.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:08:18.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:08:18.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:08:19.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:08:19.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:08:19.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:08:19.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:08:19.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:08:19.249 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:08:19.456 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:08:19.800 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:08:19.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:08:19.909 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:08:19.909 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:08:20.096 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:08:20.096 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:08:50.126 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:08:50.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:08:50.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:08:50.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:08:50.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:08:50.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:08:50.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:08:50.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:08:50.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:08:50.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:08:50.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:08:50.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:08:50.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:08:53.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:08:53.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:08:53.528 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:08:53.528 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:08:53.537 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:08:53.551 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:08:53.551 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:08:53.552 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:08:53.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:08:53.552 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:08:53.553 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:08:53.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:08:53.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:08:53.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:08:53.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:08:53.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:08:53.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:08:53.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:08:53.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:08:53.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:08:53.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:08:53.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:08:53.900 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:08:53.971 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:08:39
2026-06-04T07:08:53.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88244, datetime.datetime(2026, 6, 4, 7, 8, 39), datetime.datetime(2026, 6, 4, 7, 8, 38), 'salt', 1.83, 100.78, None, 25.37, 158.36, -0.11, 821.66, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:08:53.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:08:53.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:08:53.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:08:38, diff=15.979048s, valid=True
2026-06-04T07:08:53.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:08:53.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:08:53.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:09:12, diff=-18.017464s, valid=True
2026-06-04T07:08:53.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:08:53.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:08:53.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:08:33, diff=20.990524s, valid=True
2026-06-04T07:08:53.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:08:53.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:08:53.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:08:53.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:08:53.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:08:53.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:08:53.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:09:12, diff=-18.005831s, valid=True
2026-06-04T07:08:53.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:08:53.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:08:53.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:08:53.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123930.994967s, valid=True
2026-06-04T07:08:53.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:08:53.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:08:53.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:08:53.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:08:53.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:08:54.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:08:54.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:08:54.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:08:54.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:08:54.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:08:54.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:08:54.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:08:54.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:08:54.312 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:08:54.518 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:08:54.858 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:08:54.959 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:08:54.960 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:08:54.960 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:08:55.211 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:08:55.211 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:09:25.214 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:09:25.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:09:25.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:09:25.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:09:25.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:09:25.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:09:25.849 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:09:25.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:09:25.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:09:25.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:09:25.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:09:25.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:09:25.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:09:28.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:09:28.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:09:28.871 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:09:28.872 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:09:28.883 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:09:28.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:09:28.896 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:09:28.897 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:09:28.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:09:28.897 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:09:28.898 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:09:28.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:09:29.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:09:29.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:09:29.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:09:29.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:09:29.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:09:29.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:09:29.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:09:29.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:09:29.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:09:29.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:09:29.254 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:09:29.327 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:09:09
2026-06-04T07:09:29.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88245, datetime.datetime(2026, 6, 4, 7, 9, 9), datetime.datetime(2026, 6, 4, 7, 9, 9), 'salt', 1.8, 100.68, None, 27.95, 145.86, -0.1, 821.54, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:09:29.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:09:29.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:09:29.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:09:09, diff=20.334724s, valid=True
2026-06-04T07:09:29.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:09:29.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:09:29.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:09:12, diff=17.338336s, valid=True
2026-06-04T07:09:29.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:09:29.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:09:29.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:09:03, diff=26.346699s, valid=True
2026-06-04T07:09:29.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:09:29.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:09:29.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:09:29.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:09:29.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:09:29.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:09:29.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:09:12, diff=17.350545s, valid=True
2026-06-04T07:09:29.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:09:29.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:09:29.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:09:29.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=123966.351384s, valid=True
2026-06-04T07:09:29.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:09:29.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:09:29.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:09:29.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:09:29.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:09:29.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:09:29.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:09:29.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:09:29.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:09:29.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:09:29.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:09:29.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:09:29.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:09:29.672 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:09:29.882 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:09:30.232 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:09:30.333 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:09:30.333 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:09:30.333 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:09:30.536 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:09:30.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:10:00.551 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:10:00.552 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:10:00.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:10:01.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:10:01.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:10:01.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:10:01.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:10:01.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:10:01.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:10:01.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:10:01.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:10:01.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:10:01.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:10:04.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:10:04.172 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:10:04.173 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:10:04.173 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:10:04.184 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:10:04.196 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:10:04.197 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:10:04.197 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:10:04.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:10:04.198 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:10:04.198 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:10:04.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:10:04.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:10:04.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:10:04.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:10:04.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:10:04.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:10:04.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:10:04.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:10:04.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:10:04.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:10:04.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:10:04.520 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:10:04.591 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:09:40
2026-06-04T07:10:04.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88246, datetime.datetime(2026, 6, 4, 7, 9, 40), datetime.datetime(2026, 6, 4, 7, 9, 39), 'salt', 1.73, 100.61, None, 32.07, 165.2, -0.09, 821.6, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:10:04.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:10:04.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:10:04.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:09:39, diff=25.597714s, valid=True
2026-06-04T07:10:04.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:10:04.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:10:04.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:10:12, diff=-7.399333s, valid=True
2026-06-04T07:10:04.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:10:04.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:10:04.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:09:33, diff=31.608035s, valid=True
2026-06-04T07:10:04.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:10:04.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:10:04.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:10:04.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:10:04.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:10:04.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:10:04.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:10:12, diff=-7.388396s, valid=True
2026-06-04T07:10:04.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:10:04.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:10:04.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:10:04.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124001.61237s, valid=True
2026-06-04T07:10:04.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:10:04.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:10:04.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:10:04.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:10:04.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:10:04.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:10:04.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:10:04.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:10:04.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:10:04.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:10:04.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:10:04.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:10:04.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:10:04.931 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:10:05.142 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:10:05.540 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:10:05.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:10:05.642 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:10:05.642 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:10:05.896 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:10:05.896 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:10:35.919 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:10:35.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:10:35.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:10:36.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:10:36.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:10:36.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:10:36.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:10:36.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:10:36.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:10:36.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:10:36.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:10:36.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:10:36.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:10:39.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:10:39.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:10:39.273 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:10:39.274 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:10:39.284 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:10:39.299 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:10:39.299 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:10:39.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:10:39.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:10:39.301 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:10:39.301 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:10:39.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:10:39.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:10:39.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:10:39.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:10:39.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:10:39.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:10:39.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:10:39.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:10:39.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:10:39.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:10:39.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:10:39.664 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:10:39.747 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:10:10
2026-06-04T07:10:39.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88247, datetime.datetime(2026, 6, 4, 7, 10, 10), datetime.datetime(2026, 6, 4, 7, 10, 9), 'salt', 1.8, 100.74, None, 38.81, 150.99, -0.1, 821.6, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:10:39.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:10:39.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:10:39.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:10:09, diff=30.755599s, valid=True
2026-06-04T07:10:39.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:10:39.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:10:39.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:10:12, diff=27.759221s, valid=True
2026-06-04T07:10:39.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:10:39.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:10:39.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:10:04, diff=35.767801s, valid=True
2026-06-04T07:10:39.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:10:39.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:10:39.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:10:39.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:10:39.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:10:39.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:10:39.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:10:12, diff=27.7716s, valid=True
2026-06-04T07:10:39.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:10:39.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:10:39.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:10:39.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124036.772482s, valid=True
2026-06-04T07:10:39.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:10:39.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:10:39.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:10:39.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:10:39.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:10:39.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:10:39.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:10:39.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:10:39.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:10:39.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:10:39.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:10:40.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:10:40.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:10:40.127 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:10:40.333 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:10:40.676 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:10:40.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:10:40.777 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:10:40.777 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:10:40.973 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:10:40.973 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:11:10.980 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:11:10.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:11:10.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:11:11.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:11:11.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:11:11.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:11:11.744 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:11:11.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:11:11.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:11:11.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:11:11.768 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:11:11.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:11:11.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:11:14.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:11:14.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:11:14.711 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:11:14.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:11:14.725 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:11:14.738 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:11:14.739 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:11:14.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:11:14.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:11:14.740 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:11:14.740 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:11:14.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:11:14.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:11:14.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:11:14.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:11:14.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:11:15.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:11:15.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:11:15.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:11:15.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:11:15.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:11:15.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:11:15.092 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:11:15.162 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:11:10
2026-06-04T07:11:15.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88249, datetime.datetime(2026, 6, 4, 7, 11, 10), datetime.datetime(2026, 6, 4, 7, 11, 10), 'salt', 1.73, 100.74, None, 33.91, 155.0, -0.11, 821.54, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:11:15.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:11:15.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:11:15.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:11:10, diff=5.169688s, valid=True
2026-06-04T07:11:15.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:11:15.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:11:15.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:11:12, diff=3.173092s, valid=True
2026-06-04T07:11:15.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:11:15.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:11:15.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:11:05, diff=10.180929s, valid=True
2026-06-04T07:11:15.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:11:15.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:11:15.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:11:15.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:11:15.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:11:15.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:11:15.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:11:12, diff=3.184498s, valid=True
2026-06-04T07:11:15.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:11:15.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:11:15.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:11:15.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124072.185279s, valid=True
2026-06-04T07:11:15.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:11:15.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:11:15.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:11:15.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:11:15.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:11:15.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:11:15.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:11:15.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:11:15.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:11:15.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:11:15.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:11:15.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:11:15.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:11:15.577 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:11:15.782 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:11:16.123 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:11:16.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:11:16.224 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:11:16.224 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:11:16.480 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:11:16.480 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:11:46.510 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:11:46.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:11:46.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:11:46.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:11:46.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:11:46.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:11:46.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:11:46.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:11:46.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:11:46.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:11:46.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:11:46.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:11:46.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:11:49.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:11:49.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:11:49.904 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:11:49.904 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:11:49.913 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:11:49.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:11:49.925 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:11:49.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:11:49.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:11:49.925 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:11:49.925 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:11:49.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:11:50.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:11:50.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:11:50.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:11:50.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:11:50.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:11:50.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:11:50.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:11:50.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:11:50.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:11:50.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:11:50.220 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:11:50.291 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:11:41
2026-06-04T07:11:50.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88250, datetime.datetime(2026, 6, 4, 7, 11, 41), datetime.datetime(2026, 6, 4, 7, 11, 40), 'salt', 1.67, 100.71, None, 35.85, 145.68, -0.1, 821.6, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:11:50.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:11:50.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:11:50.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:11:40, diff=10.297935s, valid=True
2026-06-04T07:11:50.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:11:50.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:11:50.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:12:12, diff=-21.699023s, valid=True
2026-06-04T07:11:50.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:11:50.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:11:50.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:11:35, diff=15.308335s, valid=True
2026-06-04T07:11:50.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:11:50.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:11:50.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:11:50.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:11:50.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:11:50.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:11:50.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:12:12, diff=-21.688428s, valid=True
2026-06-04T07:11:50.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:11:50.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:11:50.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:11:50.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124107.312284s, valid=True
2026-06-04T07:11:50.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:11:50.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:11:50.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:11:50.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:11:50.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:11:50.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:11:50.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:11:50.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:11:50.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:11:50.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:11:50.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:11:50.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:11:50.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:11:50.629 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:11:50.834 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:11:51.175 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:11:51.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:11:51.276 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:11:51.276 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:11:51.434 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:11:51.435 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:12:21.453 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:12:21.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:12:21.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:12:21.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:12:21.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:12:22.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:12:22.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:12:22.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:12:22.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:12:22.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:12:22.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:12:22.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:12:22.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:12:25.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:12:25.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:12:25.219 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:12:25.220 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:12:25.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:12:25.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:12:25.243 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:12:25.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:12:25.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:12:25.244 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:12:25.244 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:12:25.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:12:25.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:12:25.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:12:25.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:12:25.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:12:25.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:12:25.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:12:25.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:12:25.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:12:25.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:12:25.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:12:25.592 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:12:25.664 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:12:11
2026-06-04T07:12:25.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88251, datetime.datetime(2026, 6, 4, 7, 12, 11), datetime.datetime(2026, 6, 4, 7, 12, 10), 'salt', 1.77, 100.74, None, 34.82, 148.33, -0.1, 821.6, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:12:25.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:12:25.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:12:25.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:12:10, diff=15.672257s, valid=True
2026-06-04T07:12:25.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:12:25.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:12:25.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:12:12, diff=13.675724s, valid=True
2026-06-04T07:12:25.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:12:25.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:12:25.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:12:05, diff=20.683919s, valid=True
2026-06-04T07:12:25.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:12:25.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:12:25.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:12:25.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:12:25.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:12:25.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:12:25.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:12:12, diff=13.687647s, valid=True
2026-06-04T07:12:25.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:12:25.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:12:25.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:12:25.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124142.688471s, valid=True
2026-06-04T07:12:25.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:12:25.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:12:25.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:12:25.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:12:25.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:12:25.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:12:25.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:12:25.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:12:25.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:12:25.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:12:25.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:12:25.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:12:26.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:12:26.076 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:12:26.282 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:12:26.623 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:12:26.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:12:26.724 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:12:26.724 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:12:26.920 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:12:26.921 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:12:56.939 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:12:56.939 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:12:56.940 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:12:57.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:12:57.120 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:12:57.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:12:57.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:12:57.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:12:57.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:12:57.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:12:57.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:12:57.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:12:57.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:13:00.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:13:00.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:13:00.369 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:13:00.370 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:13:00.380 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:13:00.393 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:13:00.394 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:13:00.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:13:00.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:13:00.395 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:13:00.396 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:13:00.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:13:00.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:13:00.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:13:00.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:13:00.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:13:00.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:13:00.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:13:00.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:13:00.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:13:00.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:13:00.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:13:00.758 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:13:00.830 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:12:41
2026-06-04T07:13:00.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88252, datetime.datetime(2026, 6, 4, 7, 12, 41), datetime.datetime(2026, 6, 4, 7, 12, 40), 'salt', 1.73, 100.68, None, 30.31, 159.23, -0.1, 821.54, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:13:00.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:13:00.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:13:00.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:12:40, diff=20.83847s, valid=True
2026-06-04T07:13:00.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:13:00.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:13:00.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:13:12, diff=-11.157896s, valid=True
2026-06-04T07:13:00.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:13:00.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:13:00.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:12:36, diff=24.850595s, valid=True
2026-06-04T07:13:00.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:13:00.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:13:00.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:13:00.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:13:00.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:13:00.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:13:00.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:13:12, diff=-11.145551s, valid=True
2026-06-04T07:13:00.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:13:00.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:13:00.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:13:00.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124177.855295s, valid=True
2026-06-04T07:13:00.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:13:00.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:13:00.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:13:00.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:13:00.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:13:00.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:13:00.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:13:00.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:13:00.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:13:00.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:13:01.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:13:01.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:13:01.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:13:01.174 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:13:01.382 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:13:01.756 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:13:01.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:13:01.859 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:13:01.859 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:13:02.060 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:13:02.060 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:13:32.090 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:13:32.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:13:32.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:13:32.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:13:32.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:13:32.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:13:32.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:13:32.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:13:32.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:13:32.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:13:32.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:13:32.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:13:32.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:13:35.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:13:35.333 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:13:35.334 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:13:35.334 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:13:35.344 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:13:35.356 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:13:35.357 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:13:35.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:13:35.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:13:35.358 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:13:35.358 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:13:35.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:13:35.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:13:35.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:13:35.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:13:35.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:13:35.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:13:35.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:13:35.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-06-04T07:13:35.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:13:35.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:13:35.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:13:35.709 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:13:35.782 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:13:11
2026-06-04T07:13:35.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88253, datetime.datetime(2026, 6, 4, 7, 13, 11), datetime.datetime(2026, 6, 4, 7, 13, 11), 'salt', 1.67, 100.61, None, 32.18, 153.12, -0.08, 821.6, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:13:35.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:13:35.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:13:35.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:13:11, diff=24.789822s, valid=True
2026-06-04T07:13:35.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:13:35.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:13:35.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:13:12, diff=23.7934s, valid=True
2026-06-04T07:13:35.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:13:35.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:13:35.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:13:06, diff=29.801831s, valid=True
2026-06-04T07:13:35.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:13:35.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:13:35.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:13:35.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:13:35.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:13:35.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-06-04T07:13:35.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:13:12, diff=23.805666s, valid=True
2026-06-04T07:13:35.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:13:35.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:13:35.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:13:35.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124212.806478s, valid=True
2026-06-04T07:13:35.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:13:35.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:13:35.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:13:35.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:13:35.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:13:35.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:13:35.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:13:35.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:13:35.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:13:36.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:13:36.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:13:36.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:13:36.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:13:36.209 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:13:36.441 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:13:36.791 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:13:36.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:13:36.894 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:13:36.894 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:13:37.051 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:13:37.051 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:14:07.070 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:14:07.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:14:07.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:14:07.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:14:07.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:14:07.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:14:07.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:14:07.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:14:07.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:14:07.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:14:07.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:14:07.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:14:07.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:14:10.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:14:10.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:14:10.680 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:14:10.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:14:10.704 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:14:10.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:14:10.723 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:14:10.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:14:10.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:14:10.728 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:14:10.729 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:14:10.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:14:10.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:14:10.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:14:10.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:14:10.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:14:11.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:14:11.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:14:11.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:14:11.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:14:11.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:14:11.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:14:11.073 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:14:11.145 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:13:42
2026-06-04T07:14:11.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88254, datetime.datetime(2026, 6, 4, 7, 13, 42), datetime.datetime(2026, 6, 4, 7, 13, 41), 'salt', 1.77, 100.74, None, 32.43, 154.3, -0.1, 821.6, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:14:11.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:14:11.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:14:11.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:13:41, diff=30.152463s, valid=True
2026-06-04T07:14:11.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:14:11.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:14:11.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:14:12, diff=-0.844083s, valid=True
2026-06-04T07:14:11.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:14:11.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:14:11.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:13:36, diff=35.164097s, valid=True
2026-06-04T07:14:11.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:14:11.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:14:11.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:14:11.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:14:11.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:14:11.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:14:11.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:14:12, diff=-0.832167s, valid=True
2026-06-04T07:14:11.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:14:11.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:14:11.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:14:11.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124248.168675s, valid=True
2026-06-04T07:14:11.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:14:11.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:14:11.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:14:11.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:14:11.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:14:11.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:14:11.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:14:11.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:14:11.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:14:11.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:14:11.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:14:11.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:14:11.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:14:11.495 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:14:11.703 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:14:12.046 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:14:12.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:14:12.146 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:14:12.147 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:14:12.299 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:14:12.300 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:14:42.300 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:14:42.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:14:42.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:14:42.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:14:42.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:14:42.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:14:42.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:14:42.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:14:42.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:14:42.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:14:42.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:14:42.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:14:42.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:14:45.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:14:45.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:14:45.886 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:14:45.886 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:14:45.897 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:14:45.909 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:14:45.910 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:14:45.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:14:45.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:14:45.911 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:14:45.911 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:14:45.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:14:46.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:14:46.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:14:46.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:14:46.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:14:46.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:14:46.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:14:46.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:14:46.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:14:46.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:14:46.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:14:46.237 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:14:46.309 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:14:42
2026-06-04T07:14:46.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88256, datetime.datetime(2026, 6, 4, 7, 14, 42), datetime.datetime(2026, 6, 4, 7, 14, 41), 'salt', 1.63, 100.68, None, 32.67, 148.59, -0.1, 821.54, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:14:46.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:14:46.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:14:46.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:14:41, diff=5.316463s, valid=True
2026-06-04T07:14:46.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:14:46.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:14:46.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:15:12, diff=-25.68008s, valid=True
2026-06-04T07:14:46.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:14:46.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:14:46.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:14:36, diff=10.328159s, valid=True
2026-06-04T07:14:46.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:14:46.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:14:46.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:14:46.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:14:46.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:14:46.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:14:46.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:15:12, diff=-25.668139s, valid=True
2026-06-04T07:14:46.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:14:46.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:14:46.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:14:46.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124283.332677s, valid=True
2026-06-04T07:14:46.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:14:46.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:14:46.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:14:46.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:14:46.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:14:46.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:14:46.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:14:46.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:14:46.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:14:46.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:14:46.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:14:46.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:14:46.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:14:46.651 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:14:46.859 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:14:47.204 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:14:47.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:14:47.307 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:14:47.307 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:14:47.533 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:14:47.534 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:15:17.541 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:15:17.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:15:17.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:15:17.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:15:17.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:15:17.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:15:17.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:15:17.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:15:17.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:15:17.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:15:17.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:15:17.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:15:17.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:15:20.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:15:20.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:15:20.872 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:15:20.872 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:15:20.883 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:15:20.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:15:20.897 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:15:20.897 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:15:20.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:15:20.898 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:15:20.898 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:15:20.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:15:21.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:15:21.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:15:21.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:15:21.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:15:21.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:15:21.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:15:21.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T07:15:21.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:15:21.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:15:21.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:15:21.223 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:15:21.294 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:15:12
2026-06-04T07:15:21.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88257, datetime.datetime(2026, 6, 4, 7, 15, 12), datetime.datetime(2026, 6, 4, 7, 15, 12), 'salt', 1.67, 100.71, None, 34.79, 146.43, -0.1, 821.6, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:15:21.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:15:21.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:15:21.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:15:12, diff=9.301885s, valid=True
2026-06-04T07:15:21.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:15:21.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:15:21.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:15:12, diff=9.305343s, valid=True
2026-06-04T07:15:21.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:15:21.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:15:21.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:15:07, diff=14.313541s, valid=True
2026-06-04T07:15:21.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:15:21.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:15:21.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:15:21.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:15:21.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:15:21.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T07:15:21.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:15:12, diff=9.317237s, valid=True
2026-06-04T07:15:21.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:15:21.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:15:21.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:15:21.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124318.31805s, valid=True
2026-06-04T07:15:21.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:15:21.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:15:21.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:15:21.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:15:21.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:15:21.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:15:21.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:15:21.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:15:21.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:15:21.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:15:21.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:15:21.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:15:21.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:15:21.642 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:15:21.849 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:15:22.246 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:15:22.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:15:22.348 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:15:22.348 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:15:22.578 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:15:22.578 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:15:52.589 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:15:52.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:15:52.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:15:52.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:15:52.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:15:52.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:15:52.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:15:53.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:15:53.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:15:53.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:15:53.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:15:53.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:15:53.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:15:55.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:15:55.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:15:55.947 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:15:55.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:15:55.977 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:15:55.995 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:15:55.996 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:15:55.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:15:55.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:15:55.997 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:15:55.997 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:15:56.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:15:56.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:15:56.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:15:56.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:15:56.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:15:56.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T07:15:56.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:15:56.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T07:15:56.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:15:56.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:15:56.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:15:56.327 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:15:56.398 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:15:43
2026-06-04T07:15:56.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88258, datetime.datetime(2026, 6, 4, 7, 15, 43), datetime.datetime(2026, 6, 4, 7, 15, 42), 'salt', 1.73, 100.74, None, 32.71, 152.68, -0.11, 821.6, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:15:56.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:15:56.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:15:56.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:15:42, diff=14.406269s, valid=True
2026-06-04T07:15:56.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:15:56.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T07:15:56.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:16:12, diff=-15.590287s, valid=True
2026-06-04T07:15:56.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:15:56.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:15:56.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:15:37, diff=19.418109s, valid=True
2026-06-04T07:15:56.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:15:56.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:15:56.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:15:56.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:15:56.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:15:56.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T07:15:56.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:16:12, diff=-15.578123s, valid=True
2026-06-04T07:15:56.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:15:56.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:15:56.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:15:56.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124353.422699s, valid=True
2026-06-04T07:15:56.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:15:56.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:15:56.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:15:56.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:15:56.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:15:56.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:15:56.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:15:56.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:15:56.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:15:56.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:15:56.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:15:56.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:15:56.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:15:56.742 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:15:56.948 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:15:57.290 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:15:57.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:15:57.392 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:15:57.392 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:15:57.588 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:15:57.588 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:16:27.619 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:16:27.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:16:27.619 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:16:27.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:16:27.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:16:28.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:16:28.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:16:28.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:16:28.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:16:28.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:16:28.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:16:28.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:16:28.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:16:31.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:16:31.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:16:31.078 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:16:31.079 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:16:31.091 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:16:31.104 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:16:31.104 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:16:31.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:16:31.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:16:31.106 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:16:31.106 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:16:31.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:16:31.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:16:31.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:16:31.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:16:31.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:16:31.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T07:16:31.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:16:31.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T07:16:31.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:16:31.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:16:31.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:16:31.442 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:16:31.520 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:16:13
2026-06-04T07:16:31.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88259, datetime.datetime(2026, 6, 4, 7, 16, 13), datetime.datetime(2026, 6, 4, 7, 16, 12), 'salt', 1.7, 100.74, None, 32.32, 131.67, -0.1, 821.6, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:16:31.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:16:31.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:16:31.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:16:12, diff=19.528084s, valid=True
2026-06-04T07:16:31.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:16:31.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T07:16:31.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:16:12, diff=19.531574s, valid=True
2026-06-04T07:16:31.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:16:31.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:16:31.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:16:07, diff=24.539857s, valid=True
2026-06-04T07:16:31.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:16:31.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:16:31.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:16:31.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:16:31.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:16:31.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T07:16:31.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:16:12, diff=19.54369s, valid=True
2026-06-04T07:16:31.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:16:31.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:16:31.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:16:31.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124388.544499s, valid=True
2026-06-04T07:16:31.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:16:31.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:16:31.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:16:31.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:16:31.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:16:31.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:16:31.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:16:31.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:16:31.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:16:31.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:16:31.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:16:31.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:16:31.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:16:31.941 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:16:32.152 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:16:32.495 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:16:32.596 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:16:32.596 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:16:32.596 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:16:32.790 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:16:32.790 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:17:02.820 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:17:02.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:17:02.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:17:02.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:17:02.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:17:03.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:17:03.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:17:03.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:17:03.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:17:03.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:17:03.221 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:17:03.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:17:03.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:17:06.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:17:06.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:17:06.040 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:17:06.040 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:17:06.049 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:17:06.061 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:17:06.061 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:17:06.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:17:06.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:17:06.062 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:17:06.062 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:17:06.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:17:06.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:17:06.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:17:06.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:17:06.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:17:06.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T07:17:06.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:17:06.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T07:17:06.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:17:06.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:17:06.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:17:06.333 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:17:06.402 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:16:43
2026-06-04T07:17:06.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88260, datetime.datetime(2026, 6, 4, 7, 16, 43), datetime.datetime(2026, 6, 4, 7, 16, 42), 'salt', 1.7, 100.71, None, 38.81, 146.94, -0.1, 821.72, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:17:06.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:17:06.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:17:06.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:16:42, diff=24.409432s, valid=True
2026-06-04T07:17:06.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:17:06.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T07:17:06.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:17:12, diff=-5.587439s, valid=True
2026-06-04T07:17:06.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:17:06.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:17:06.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:16:37, diff=29.419796s, valid=True
2026-06-04T07:17:06.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:17:06.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:17:06.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:17:06.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:17:06.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:17:06.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T07:17:06.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:17:12, diff=-5.576872s, valid=True
2026-06-04T07:17:06.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:17:06.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:17:06.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:17:06.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124423.423853s, valid=True
2026-06-04T07:17:06.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:17:06.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:17:06.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:17:06.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:17:06.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:17:06.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:17:06.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:17:06.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:17:06.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:17:06.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:17:06.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:17:06.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:17:06.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:17:06.758 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:17:06.962 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:17:07.308 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:17:07.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:17:07.410 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:17:07.410 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:17:07.645 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:17:07.645 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:17:37.675 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:17:37.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:17:37.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:17:37.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:17:38.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:17:38.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:17:38.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:17:38.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:17:38.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:17:38.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:17:38.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:17:38.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:17:38.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:17:41.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:17:41.203 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:17:41.204 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:17:41.204 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:17:41.215 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:17:41.228 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:17:41.228 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:17:41.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:17:41.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:17:41.230 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:17:41.230 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:17:41.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:17:41.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:17:41.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:17:41.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:17:41.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:17:41.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T07:17:41.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:17:41.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T07:17:41.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:17:41.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:17:41.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:17:41.559 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:17:41.630 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:17:13
2026-06-04T07:17:41.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88261, datetime.datetime(2026, 6, 4, 7, 17, 13), datetime.datetime(2026, 6, 4, 7, 17, 13), 'salt', 1.7, 100.74, None, 30.38, 155.75, -0.1, 821.66, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:17:41.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:17:41.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:17:41.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:17:13, diff=28.63835s, valid=True
2026-06-04T07:17:41.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:17:41.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T07:17:41.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:17:12, diff=29.641859s, valid=True
2026-06-04T07:17:41.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:17:41.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:17:41.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:17:08, diff=33.650177s, valid=True
2026-06-04T07:17:41.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:17:41.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:17:41.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:17:41.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:17:41.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:17:41.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T07:17:41.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:17:12, diff=29.653946s, valid=True
2026-06-04T07:17:41.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:17:41.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:17:41.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:17:41.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124458.654764s, valid=True
2026-06-04T07:17:41.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:17:41.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:17:41.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:17:41.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:17:41.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:17:41.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:17:41.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:17:41.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:17:41.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:17:41.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:17:41.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:17:41.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:17:42.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:17:42.046 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:17:42.254 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:17:42.599 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:17:42.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:17:42.701 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:17:42.701 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:17:42.995 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:17:42.995 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:18:13.017 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:18:13.017 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:18:13.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:18:13.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:18:13.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:18:13.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:18:13.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:18:13.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:18:13.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:18:13.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:18:13.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:18:13.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:18:13.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:18:16.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:18:16.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:18:16.459 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:18:16.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:18:16.470 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:18:16.482 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:18:16.483 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:18:16.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:18:16.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:18:16.484 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:18:16.484 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:18:16.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:18:16.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:18:16.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:18:16.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:18:16.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:18:16.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T07:18:16.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:18:16.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T07:18:16.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:18:16.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:18:16.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:18:16.814 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:18:16.886 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:18:14
2026-06-04T07:18:16.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88263, datetime.datetime(2026, 6, 4, 7, 18, 14), datetime.datetime(2026, 6, 4, 7, 18, 13), 'salt', 1.7, 100.68, None, 34.4, 153.64, -0.1, 821.78, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:18:16.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:18:16.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:18:16.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:18:13, diff=3.893819s, valid=True
2026-06-04T07:18:16.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:18:16.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T07:18:16.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:18:12, diff=4.897323s, valid=True
2026-06-04T07:18:16.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:18:16.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:18:16.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:18:08, diff=8.905447s, valid=True
2026-06-04T07:18:16.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:18:16.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:18:16.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:18:16.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:18:16.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:18:16.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T07:18:16.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:18:12, diff=4.90922s, valid=True
2026-06-04T07:18:16.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:18:16.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:18:16.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:18:16.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124493.910039s, valid=True
2026-06-04T07:18:16.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:18:16.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:18:16.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:18:16.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:18:16.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:18:16.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:18:16.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:18:16.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:18:16.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:18:17.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:18:17.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:18:17.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:18:17.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:18:17.232 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:18:17.439 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:18:17.782 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:18:17.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:18:17.886 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:18:17.886 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:18:18.123 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:18:18.123 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:18:48.153 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:18:48.153 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:18:48.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:18:48.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:18:48.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:18:48.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:18:48.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:18:48.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:18:48.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:18:48.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:18:48.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:18:48.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:18:48.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:18:51.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:18:51.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:18:51.478 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:18:51.479 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:18:51.489 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:18:51.503 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:18:51.504 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:18:51.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:18:51.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:18:51.505 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:18:51.505 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:18:51.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:18:51.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:18:51.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:18:51.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:18:51.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:18:51.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:18:51.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:18:51.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:18:51.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:18:51.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:18:51.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:18:51.855 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:18:51.927 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:18:44
2026-06-04T07:18:51.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88264, datetime.datetime(2026, 6, 4, 7, 18, 44), datetime.datetime(2026, 6, 4, 7, 18, 43), 'salt', 1.73, 100.74, None, 33.34, 141.4, -0.11, 821.72, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:18:51.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:18:51.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:18:51.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:18:43, diff=8.934822s, valid=True
2026-06-04T07:18:51.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:18:51.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:18:51.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:19:12, diff=-20.061634s, valid=True
2026-06-04T07:18:51.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:18:51.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:18:51.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:18:38, diff=13.946733s, valid=True
2026-06-04T07:18:51.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:18:51.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:18:51.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:18:51.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:18:51.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:18:51.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:18:51.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:19:12, diff=-20.049531s, valid=True
2026-06-04T07:18:51.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:18:51.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:18:51.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:18:51.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124528.95129s, valid=True
2026-06-04T07:18:51.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:18:51.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:18:51.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:18:51.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:18:51.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:18:52.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:18:52.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:18:52.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:18:52.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:18:52.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:18:52.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:18:52.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:18:52.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:18:52.337 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:18:52.545 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:18:52.887 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:18:52.989 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:18:52.989 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:18:52.989 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:18:53.183 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:18:53.184 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:19:23.214 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:19:23.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:19:23.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:19:23.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:19:23.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:19:23.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:19:23.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:19:23.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:19:23.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:19:23.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:19:23.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:19:23.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:19:23.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:19:26.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:19:26.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:19:26.870 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:19:26.871 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:19:26.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:19:26.898 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:19:26.898 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:19:26.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:19:26.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:19:26.899 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:19:26.900 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:19:26.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:19:27.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:19:27.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:19:27.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:19:27.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:19:27.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:19:27.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:19:27.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:19:27.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:19:27.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:19:27.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:19:27.228 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:19:27.301 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:19:14
2026-06-04T07:19:27.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88265, datetime.datetime(2026, 6, 4, 7, 19, 14), datetime.datetime(2026, 6, 4, 7, 19, 14), 'salt', 1.7, 100.71, None, 35.95, 145.02, -0.1, 821.72, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:19:27.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:19:27.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:19:27.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:19:14, diff=13.308712s, valid=True
2026-06-04T07:19:27.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:19:27.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:19:27.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:19:12, diff=15.312119s, valid=True
2026-06-04T07:19:27.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:19:27.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:19:27.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:19:09, diff=18.320111s, valid=True
2026-06-04T07:19:27.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:19:27.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:19:27.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:19:27.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:19:27.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:19:27.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:19:27.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:19:12, diff=15.323729s, valid=True
2026-06-04T07:19:27.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:19:27.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:19:27.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:19:27.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124564.324514s, valid=True
2026-06-04T07:19:27.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:19:27.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:19:27.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:19:27.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:19:27.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:19:27.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:19:27.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:19:27.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:19:27.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:19:27.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:19:27.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:19:27.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:19:27.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:19:27.645 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:19:27.851 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:19:28.192 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:19:28.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:19:28.293 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:19:28.293 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:19:28.452 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:19:28.452 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:19:58.481 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:19:58.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:19:58.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:19:58.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:19:58.806 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:19:59.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:19:59.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:19:59.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:19:59.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:19:59.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:19:59.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:19:59.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:19:59.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:20:01.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:20:01.987 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:20:01.988 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:20:01.988 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:20:01.996 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:20:02.008 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:20:02.009 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:20:02.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:20:02.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:20:02.009 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:20:02.010 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:20:02.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:20:02.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:20:02.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:20:02.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:20:02.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:20:02.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:20:02.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:20:02.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:20:02.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:20:02.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:20:02.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:20:02.283 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:20:02.356 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:19:45
2026-06-04T07:20:02.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88266, datetime.datetime(2026, 6, 4, 7, 19, 45), datetime.datetime(2026, 6, 4, 7, 19, 44), 'salt', 1.7, 100.74, None, 28.44, 140.98, -0.1, 821.72, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:20:02.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:20:02.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:20:02.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:19:44, diff=18.362734s, valid=True
2026-06-04T07:20:02.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:20:02.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:20:02.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:20:12, diff=-9.634118s, valid=True
2026-06-04T07:20:02.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:20:02.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:20:02.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:19:39, diff=23.373394s, valid=True
2026-06-04T07:20:02.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:20:02.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:20:02.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:20:02.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:20:02.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:20:02.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:20:02.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:20:12, diff=-9.623185s, valid=True
2026-06-04T07:20:02.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:20:02.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:20:02.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:20:02.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124599.37754s, valid=True
2026-06-04T07:20:02.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:20:02.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:20:02.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:20:02.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:20:02.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:20:02.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:20:02.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:20:02.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:20:02.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:20:02.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:20:02.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:20:02.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:20:02.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:20:02.701 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:20:02.909 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:20:03.258 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:20:03.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:20:03.360 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:20:03.360 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:20:05.253 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:20:05.253 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:20:35.279 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:20:35.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:20:35.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:20:35.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:20:35.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:20:35.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:20:35.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:20:35.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:20:35.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:20:35.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:20:35.926 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:20:35.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:20:35.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:20:38.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:20:38.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:20:38.851 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:20:38.851 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:20:38.862 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:20:38.875 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:20:38.876 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:20:38.876 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:20:38.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:20:38.877 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:20:38.877 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:20:38.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:20:39.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:20:39.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:20:39.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:20:39.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:20:39.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:20:39.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:20:39.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:20:39.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:20:39.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:20:39.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:20:39.209 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:20:39.280 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:20:15
2026-06-04T07:20:39.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88267, datetime.datetime(2026, 6, 4, 7, 20, 15), datetime.datetime(2026, 6, 4, 7, 20, 14), 'salt', 1.73, 100.68, None, 29.89, 142.48, -0.1, 821.54, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:20:39.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:20:39.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:20:39.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:20:14, diff=25.287574s, valid=True
2026-06-04T07:20:39.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:20:39.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:20:39.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:20:12, diff=27.290986s, valid=True
2026-06-04T07:20:39.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:20:39.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:20:39.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:20:09, diff=30.298836s, valid=True
2026-06-04T07:20:39.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:20:39.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:20:39.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:20:39.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:20:39.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:20:39.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:20:39.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:20:12, diff=27.302419s, valid=True
2026-06-04T07:20:39.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:20:39.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:20:39.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:20:39.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124636.303204s, valid=True
2026-06-04T07:20:39.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:20:39.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:20:39.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:20:39.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:20:39.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:20:39.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:20:39.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:20:39.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:20:39.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:20:39.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:20:39.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:20:39.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:20:39.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:20:39.624 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:20:39.830 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:20:40.246 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:20:40.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:20:40.347 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:20:40.347 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:20:40.549 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:20:40.549 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:21:10.554 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:21:10.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:21:10.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:21:10.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:21:10.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:21:10.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:21:10.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:21:11.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:21:11.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:21:11.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:21:11.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:21:11.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:21:11.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:21:13.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:21:13.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:21:13.978 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:21:13.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:21:13.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:21:14.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:21:14.011 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:21:14.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:21:14.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:21:14.012 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:21:14.012 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:21:14.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:21:14.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:21:14.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:21:14.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:21:14.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:21:14.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:21:14.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:21:14.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:21:14.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:21:14.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:21:14.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:21:14.291 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:21:14.362 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:20:46
2026-06-04T07:21:14.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88268, datetime.datetime(2026, 6, 4, 7, 20, 46), datetime.datetime(2026, 6, 4, 7, 20, 45), 'salt', 1.67, 100.61, None, 33.34, 156.76, -0.08, 821.6, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:21:14.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:21:14.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:21:14.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:20:45, diff=29.369331s, valid=True
2026-06-04T07:21:14.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:21:14.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:21:14.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:21:12, diff=2.372579s, valid=True
2026-06-04T07:21:14.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:21:14.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:21:14.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:20:39, diff=35.380278s, valid=True
2026-06-04T07:21:14.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:21:14.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:21:14.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:21:14.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:21:14.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:21:14.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:21:14.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:21:12, diff=2.383738s, valid=True
2026-06-04T07:21:14.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:21:14.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:21:14.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:21:14.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124671.384482s, valid=True
2026-06-04T07:21:14.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:21:14.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:21:14.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:21:14.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:21:14.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:21:14.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:21:14.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:21:14.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:21:14.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:21:14.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:21:14.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:21:14.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:21:14.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:21:14.702 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:21:14.913 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:21:15.252 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:21:15.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:21:15.353 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:21:15.353 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:21:15.613 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:21:15.613 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:21:45.625 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:21:45.626 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:21:45.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:21:45.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:21:45.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:21:46.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:21:46.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:21:46.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:21:46.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:21:46.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:21:46.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:21:46.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:21:46.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:21:49.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:21:49.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:21:49.026 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:21:49.026 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:21:49.059 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:21:49.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:21:49.084 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:21:49.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:21:49.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:21:49.086 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:21:49.086 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:21:49.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:21:49.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:21:49.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:21:49.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:21:49.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:21:49.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:21:49.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:21:49.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:21:49.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:21:49.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:21:49.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:21:49.415 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:21:49.486 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:21:46
2026-06-04T07:21:49.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88270, datetime.datetime(2026, 6, 4, 7, 21, 46), datetime.datetime(2026, 6, 4, 7, 21, 46), 'salt', 1.73, 100.71, None, 40.26, 157.21, -0.1, 821.78, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:21:49.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:21:49.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:21:49.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:21:46, diff=3.493424s, valid=True
2026-06-04T07:21:49.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:21:49.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:21:49.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:22:12, diff=-22.503082s, valid=True
2026-06-04T07:21:49.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:21:49.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:21:49.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:21:40, diff=9.505128s, valid=True
2026-06-04T07:21:49.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:21:49.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:21:49.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:21:49.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:21:49.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:21:49.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:21:49.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:22:12, diff=-22.491141s, valid=True
2026-06-04T07:21:49.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:21:49.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:21:49.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:21:49.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124706.509674s, valid=True
2026-06-04T07:21:49.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:21:49.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:21:49.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:21:49.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:21:49.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:21:49.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:21:49.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:21:49.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:21:49.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:21:49.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:21:49.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:21:49.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:21:49.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:21:49.832 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:21:50.132 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:21:50.474 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:21:50.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:21:50.575 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:21:50.575 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:21:50.844 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:21:50.844 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:22:20.850 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:22:20.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:22:20.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:22:21.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:22:21.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:22:21.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:22:21.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:22:21.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:22:21.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:22:21.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:22:21.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:22:21.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:22:21.428 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:22:24.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:22:24.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:22:24.319 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:22:24.320 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:22:24.330 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:22:24.342 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:22:24.343 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:22:24.343 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:22:24.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:22:24.344 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:22:24.344 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:22:24.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:22:24.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:22:24.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:22:24.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:22:24.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:22:24.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:22:24.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:22:24.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:22:24.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:22:24.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:22:24.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:22:24.683 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:22:24.755 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:22:17
2026-06-04T07:22:24.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88271, datetime.datetime(2026, 6, 4, 7, 22, 17), datetime.datetime(2026, 6, 4, 7, 22, 16), 'salt', 1.63, 100.64, None, 29.96, 156.69, -0.09, 821.48, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:22:24.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:22:24.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:22:24.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:22:16, diff=8.762988s, valid=True
2026-06-04T07:22:24.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:22:24.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:22:24.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:22:12, diff=12.766515s, valid=True
2026-06-04T07:22:24.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:22:24.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:22:24.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:22:10, diff=14.774746s, valid=True
2026-06-04T07:22:24.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:22:24.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:22:24.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:22:24.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:22:24.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:22:24.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:22:24.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:22:12, diff=12.778473s, valid=True
2026-06-04T07:22:24.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:22:24.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:22:24.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:22:24.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124741.779288s, valid=True
2026-06-04T07:22:24.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:22:24.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:22:24.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:22:24.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:22:24.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:22:24.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:22:24.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:22:24.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:22:24.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:22:24.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:22:24.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:22:25.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:22:25.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:22:25.106 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:22:25.311 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:22:25.653 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:22:25.753 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:22:25.753 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:22:25.754 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:22:25.976 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:22:25.977 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:22:55.997 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:22:55.998 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:22:55.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:22:56.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:22:56.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:22:56.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:22:56.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:22:56.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:22:56.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:22:56.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:22:56.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:22:56.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:22:56.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:22:59.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:22:59.363 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:22:59.364 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:22:59.364 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:22:59.375 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:22:59.387 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:22:59.388 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:22:59.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:22:59.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:22:59.389 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:22:59.389 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:22:59.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:22:59.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:22:59.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:22:59.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:22:59.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:22:59.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:22:59.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:22:59.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:22:59.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:22:59.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:22:59.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:22:59.723 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:22:59.797 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:22:47
2026-06-04T07:22:59.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88272, datetime.datetime(2026, 6, 4, 7, 22, 47), datetime.datetime(2026, 6, 4, 7, 22, 46), 'salt', 1.7, 100.74, None, 29.85, 149.76, -0.1, 821.72, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:22:59.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:22:59.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:22:59.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:22:46, diff=13.805013s, valid=True
2026-06-04T07:22:59.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:22:59.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:22:59.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:23:12, diff=-12.191465s, valid=True
2026-06-04T07:22:59.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:22:59.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:22:59.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:22:40, diff=19.81678s, valid=True
2026-06-04T07:22:59.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:22:59.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:22:59.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:22:59.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:22:59.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:22:59.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:22:59.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:23:12, diff=-12.179487s, valid=True
2026-06-04T07:22:59.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:22:59.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:22:59.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:22:59.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124776.821328s, valid=True
2026-06-04T07:22:59.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:22:59.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:22:59.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:22:59.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:22:59.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:22:59.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:22:59.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:22:59.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:22:59.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:22:59.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:23:00.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:23:00.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:23:00.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:23:00.230 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:23:00.436 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:23:00.781 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:23:00.882 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:23:00.882 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:23:00.882 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:23:01.080 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:23:01.080 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:23:31.091 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:23:31.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:23:31.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:23:31.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:23:31.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:23:31.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:23:31.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:23:31.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:23:31.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:23:31.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:23:31.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:23:31.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:23:31.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:23:34.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:23:34.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:23:34.443 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:23:34.443 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:23:34.453 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:23:34.467 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:23:34.467 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:23:34.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:23:34.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:23:34.468 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:23:34.469 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:23:34.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:23:34.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:23:34.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:23:34.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:23:34.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:23:34.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:23:34.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:23:34.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:23:34.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:23:34.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:23:34.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:23:34.802 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:23:34.874 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:23:17
2026-06-04T07:23:34.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88273, datetime.datetime(2026, 6, 4, 7, 23, 17), datetime.datetime(2026, 6, 4, 7, 23, 16), 'salt', 1.77, 100.74, None, 25.02, 159.82, -0.1, 821.66, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:23:34.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:23:34.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:23:34.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:23:16, diff=18.881863s, valid=True
2026-06-04T07:23:34.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:23:34.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:23:34.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:23:12, diff=22.885381s, valid=True
2026-06-04T07:23:34.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:23:34.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:23:34.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:23:10, diff=24.893545s, valid=True
2026-06-04T07:23:34.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:23:34.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:23:34.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:23:34.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:23:34.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:23:34.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:23:34.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:23:12, diff=22.897305s, valid=True
2026-06-04T07:23:34.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:23:34.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:23:34.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:23:34.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124811.898142s, valid=True
2026-06-04T07:23:34.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:23:34.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:23:34.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:23:34.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:23:34.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:23:34.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:23:34.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:23:34.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:23:34.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:23:35.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:23:35.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:23:35.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:23:35.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:23:35.225 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:23:35.432 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:23:35.773 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:23:35.874 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:23:35.875 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:23:35.875 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:23:36.109 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:23:36.126 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:24:06.140 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:24:06.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:24:06.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:24:06.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:24:06.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:24:06.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:24:06.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:24:06.719 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:24:06.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:24:06.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:24:06.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:24:06.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:24:06.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:24:09.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:24:09.682 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:24:09.683 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:24:09.683 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:24:09.693 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:24:09.706 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:24:09.707 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:24:09.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:24:09.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:24:09.708 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:24:09.708 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:24:09.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:24:09.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:24:09.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:24:09.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:24:09.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:24:09.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:24:09.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:24:10.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:24:10.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:24:10.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:24:10.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:24:10.044 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:24:10.114 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:23:47
2026-06-04T07:24:10.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88274, datetime.datetime(2026, 6, 4, 7, 23, 47), datetime.datetime(2026, 6, 4, 7, 23, 47), 'salt', 1.67, 100.71, None, 30.94, 150.87, -0.1, 821.6, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:24:10.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:24:10.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:24:10.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:23:47, diff=23.120897s, valid=True
2026-06-04T07:24:10.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:24:10.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:24:10.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:24:12, diff=-1.876187s, valid=True
2026-06-04T07:24:10.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:24:10.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:24:10.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:23:41, diff=29.131036s, valid=True
2026-06-04T07:24:10.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:24:10.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:24:10.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:24:10.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:24:10.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:24:10.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:24:10.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:24:12, diff=-1.865787s, valid=True
2026-06-04T07:24:10.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:24:10.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:24:10.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:24:10.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124847.134884s, valid=True
2026-06-04T07:24:10.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:24:10.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:24:10.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:24:10.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:24:10.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:24:10.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:24:10.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:24:10.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:24:10.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:24:10.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:24:10.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:24:10.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:24:10.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:24:10.550 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:24:10.764 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:24:11.110 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:24:11.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:24:11.214 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:24:11.214 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:24:11.445 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:24:11.445 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:24:41.475 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:24:41.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:24:41.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:24:41.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:24:41.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:24:42.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:24:42.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:24:42.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:24:42.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:24:42.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:24:42.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:24:42.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:24:42.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:24:45.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:24:45.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:24:45.103 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:24:45.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:24:45.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:24:45.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:24:45.127 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:24:45.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:24:45.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:24:45.128 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:24:45.129 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:24:45.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:24:45.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:24:45.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:24:45.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:24:45.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:24:45.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:24:45.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:24:45.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:24:45.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:24:45.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:24:45.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:24:45.457 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:24:45.527 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:24:18
2026-06-04T07:24:45.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88275, datetime.datetime(2026, 6, 4, 7, 24, 18), datetime.datetime(2026, 6, 4, 7, 24, 17), 'salt', 1.6, 100.61, None, 27.66, 150.54, -0.09, 821.54, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:24:45.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:24:45.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:24:45.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:24:17, diff=28.535319s, valid=True
2026-06-04T07:24:45.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:24:45.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:24:45.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:24:12, diff=33.538797s, valid=True
2026-06-04T07:24:45.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:24:45.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:24:45.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:24:11, diff=34.547042s, valid=True
2026-06-04T07:24:45.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:24:45.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:24:45.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:24:45.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:24:45.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:24:45.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:24:45.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:24:12, diff=33.550777s, valid=True
2026-06-04T07:24:45.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:24:45.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:24:45.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:24:45.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124882.551586s, valid=True
2026-06-04T07:24:45.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:24:45.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:24:45.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:24:45.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:24:45.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:24:45.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:24:45.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:24:45.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:24:45.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:24:45.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:24:45.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:24:45.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:24:45.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:24:45.887 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:24:46.095 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:24:46.438 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:24:46.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:24:46.540 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:24:46.540 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:24:47.121 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:24:47.121 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:25:17.152 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:25:17.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:25:17.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:25:17.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:25:17.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:25:17.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:25:17.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:25:17.719 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:25:17.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:25:17.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:25:17.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:25:17.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:25:17.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:25:20.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:25:20.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:25:20.647 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:25:20.648 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:25:20.659 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:25:20.671 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:25:20.672 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:25:20.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:25:20.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:25:20.673 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:25:20.673 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:25:20.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:25:20.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:25:20.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:25:20.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:25:20.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:25:20.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:25:20.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:25:21.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:25:21.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:25:21.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:25:21.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:25:21.014 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:25:21.086 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:25:18
2026-06-04T07:25:21.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88277, datetime.datetime(2026, 6, 4, 7, 25, 18), datetime.datetime(2026, 6, 4, 7, 25, 17), 'salt', 1.7, 100.68, None, 36.45, 142.69, -0.1, 821.6, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:25:21.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:25:21.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:25:21.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:25:17, diff=4.094239s, valid=True
2026-06-04T07:25:21.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:25:21.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:25:21.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:25:12, diff=9.09773s, valid=True
2026-06-04T07:25:21.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:25:21.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:25:21.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:25:12, diff=9.105848s, valid=True
2026-06-04T07:25:21.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:25:21.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:25:21.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:25:21.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:25:21.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:25:21.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:25:21.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:25:12, diff=9.109571s, valid=True
2026-06-04T07:25:21.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:25:21.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:25:21.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:25:21.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124918.110397s, valid=True
2026-06-04T07:25:21.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:25:21.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:25:21.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:25:21.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:25:21.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:25:21.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:25:21.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:25:21.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:25:21.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:25:21.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:25:21.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:25:21.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:25:21.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:25:21.499 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:25:21.711 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:25:22.057 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:25:22.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:25:22.159 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:25:22.160 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:25:22.387 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:25:22.387 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:25:52.417 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:25:52.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:25:52.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:25:52.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:25:52.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:25:53.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:25:53.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:25:53.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:25:53.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:25:53.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:25:53.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:25:53.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:25:53.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:25:56.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:25:56.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:25:56.035 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:25:56.036 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:25:56.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:25:56.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:25:56.057 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:25:56.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:25:56.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:25:56.057 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:25:56.057 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:25:56.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:25:56.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:25:56.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:25:56.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:25:56.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:25:56.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:25:56.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:25:56.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:25:56.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:25:56.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:25:56.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:25:56.340 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:25:56.422 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:25:48
2026-06-04T07:25:56.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88278, datetime.datetime(2026, 6, 4, 7, 25, 48), datetime.datetime(2026, 6, 4, 7, 25, 48), 'salt', 1.77, 100.74, None, 36.94, 149.34, -0.1, 821.54, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:25:56.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:25:56.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:25:56.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:25:48, diff=8.429162s, valid=True
2026-06-04T07:25:56.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:25:56.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:25:56.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:26:12, diff=-15.567536s, valid=True
2026-06-04T07:25:56.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:25:56.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:25:56.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:25:42, diff=14.44016s, valid=True
2026-06-04T07:25:56.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:25:56.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:25:56.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:25:56.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:25:56.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:25:56.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:25:56.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:26:12, diff=-15.556322s, valid=True
2026-06-04T07:25:56.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:25:56.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:25:56.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:25:56.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124953.44443s, valid=True
2026-06-04T07:25:56.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:25:56.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:25:56.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:25:56.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:25:56.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:25:56.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:25:56.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:25:56.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:25:56.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:25:56.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:25:56.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:25:56.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:25:56.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:25:56.763 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:25:56.970 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:25:57.314 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:25:57.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:25:57.416 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:25:57.416 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:25:57.615 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:25:57.615 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:26:27.644 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:26:27.644 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:26:27.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:26:27.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:26:27.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:26:28.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:26:28.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:26:28.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:26:28.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:26:28.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:26:28.310 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:26:28.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:26:28.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:26:31.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:26:31.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:26:31.308 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:26:31.308 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:26:31.319 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:26:31.332 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:26:31.332 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:26:31.333 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:26:31.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:26:31.333 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:26:31.334 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:26:31.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:26:31.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:26:31.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:26:31.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:26:31.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:26:31.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:26:31.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:26:31.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:26:31.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:26:31.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:26:31.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:26:31.658 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:26:31.731 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:26:19
2026-06-04T07:26:31.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88279, datetime.datetime(2026, 6, 4, 7, 26, 19), datetime.datetime(2026, 6, 4, 7, 26, 18), 'salt', 1.7, 100.71, None, 29.89, 153.07, -0.1, 821.72, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:26:31.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:26:31.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:26:31.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:26:18, diff=13.738947s, valid=True
2026-06-04T07:26:31.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:26:31.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:26:31.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:26:12, diff=19.742379s, valid=True
2026-06-04T07:26:31.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:26:31.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:26:31.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:26:12, diff=19.750503s, valid=True
2026-06-04T07:26:31.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:26:31.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:26:31.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:26:31.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:26:31.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:26:31.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:26:31.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:26:12, diff=19.75419s, valid=True
2026-06-04T07:26:31.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:26:31.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:26:31.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:26:31.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=124988.754985s, valid=True
2026-06-04T07:26:31.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:26:31.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:26:31.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:26:31.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:26:31.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:26:31.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:26:31.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:26:31.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:26:31.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:26:31.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:26:31.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:26:31.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:26:32.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:26:32.078 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:26:32.288 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:26:32.636 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:26:32.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:26:32.738 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:26:32.738 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:26:32.932 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:26:32.932 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:27:02.936 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:27:02.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:27:02.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:27:03.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:27:03.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:27:03.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:27:03.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:27:03.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:27:03.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:27:03.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:27:03.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:27:03.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:27:03.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:27:06.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:27:06.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:27:06.486 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:27:06.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:27:06.498 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:27:06.511 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:27:06.511 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:27:06.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:27:06.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:27:06.513 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:27:06.513 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:27:06.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:27:06.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:27:06.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:27:06.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:27:06.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:27:06.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:27:06.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:27:06.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:27:06.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:27:06.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:27:06.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:27:06.843 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:27:06.921 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:26:49
2026-06-04T07:27:06.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88280, datetime.datetime(2026, 6, 4, 7, 26, 49), datetime.datetime(2026, 6, 4, 7, 26, 48), 'salt', 1.73, 100.74, None, 29.39, 148.4, -0.11, 821.54, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:27:06.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:27:06.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:27:06.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:26:48, diff=18.928902s, valid=True
2026-06-04T07:27:06.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:27:06.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:27:06.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:27:12, diff=-5.067634s, valid=True
2026-06-04T07:27:06.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:27:06.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:27:06.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:26:42, diff=24.940452s, valid=True
2026-06-04T07:27:06.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:27:06.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:27:06.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:27:06.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:27:06.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:27:06.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:27:06.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:27:12, diff=-5.055837s, valid=True
2026-06-04T07:27:06.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:27:06.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:27:06.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:27:06.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125023.944992s, valid=True
2026-06-04T07:27:06.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:27:06.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:27:06.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:27:06.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:27:06.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:27:07.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:27:07.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:27:07.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:27:07.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:27:07.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:27:07.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:27:07.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:27:07.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:27:07.265 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:27:07.473 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:27:07.872 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:27:07.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:27:07.975 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:27:07.975 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:27:08.174 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:27:08.174 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:27:38.204 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:27:38.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:27:38.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:27:38.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:27:38.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:27:38.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:27:38.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:27:38.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:27:38.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:27:38.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:27:38.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:27:38.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:27:38.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:27:41.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:27:41.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:27:41.558 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:27:41.559 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:27:41.568 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:27:41.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:27:41.581 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:27:41.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:27:41.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:27:41.583 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:27:41.583 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:27:41.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:27:41.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:27:41.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:27:41.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:27:41.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:27:41.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:27:41.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:27:41.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:27:41.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:27:41.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:27:41.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:27:41.932 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:27:42.011 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:27:19
2026-06-04T07:27:42.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88281, datetime.datetime(2026, 6, 4, 7, 27, 19), datetime.datetime(2026, 6, 4, 7, 27, 18), 'salt', 1.7, 100.74, None, 30.52, 146.5, -0.1, 821.66, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:27:42.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:27:42.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:27:42.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:27:18, diff=24.018456s, valid=True
2026-06-04T07:27:42.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:27:42.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:27:42.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:27:12, diff=30.021982s, valid=True
2026-06-04T07:27:42.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:27:42.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:27:42.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:27:13, diff=29.030172s, valid=True
2026-06-04T07:27:42.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:27:42.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:27:42.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:27:42.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:27:42.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:27:42.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:27:42.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:27:12, diff=30.03391s, valid=True
2026-06-04T07:27:42.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:27:42.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:27:42.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:27:42.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125059.034728s, valid=True
2026-06-04T07:27:42.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:27:42.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:27:42.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:27:42.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:27:42.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:27:42.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:27:42.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:27:42.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:27:42.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:27:42.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:27:42.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:27:42.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:27:42.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:27:42.357 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:27:42.567 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:27:42.910 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:27:43.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:27:43.012 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:27:43.012 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:27:43.245 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:27:43.245 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:28:13.271 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:28:13.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:28:13.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:28:13.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:28:13.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:28:13.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:28:13.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:28:13.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:28:13.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:28:13.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:28:13.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:28:13.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:28:13.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:28:16.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:28:16.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:28:16.641 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:28:16.642 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:28:16.653 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:28:16.666 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:28:16.667 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:28:16.667 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:28:16.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:28:16.668 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:28:16.668 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:28:16.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:28:16.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:28:16.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:28:16.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:28:16.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:28:16.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:28:16.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:28:16.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:28:16.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:28:17.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:28:17.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:28:17.002 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:28:17.080 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:27:49
2026-06-04T07:28:17.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88282, datetime.datetime(2026, 6, 4, 7, 27, 49), datetime.datetime(2026, 6, 4, 7, 27, 49), 'salt', 1.63, 100.61, None, 34.01, 136.33, -0.09, 821.66, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:28:17.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:28:17.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:28:17.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:27:49, diff=28.087808s, valid=True
2026-06-04T07:28:17.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:28:17.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:28:17.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:28:12, diff=5.09103s, valid=True
2026-06-04T07:28:17.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:28:17.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:28:17.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:27:43, diff=34.098395s, valid=True
2026-06-04T07:28:17.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:28:17.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:28:17.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:28:17.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:28:17.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:28:17.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:28:17.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:28:12, diff=5.101605s, valid=True
2026-06-04T07:28:17.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:28:17.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:28:17.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:28:17.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125094.102301s, valid=True
2026-06-04T07:28:17.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:28:17.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:28:17.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:28:17.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:28:17.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:28:17.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:28:17.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:28:17.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:28:17.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:28:17.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:28:17.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:28:17.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:28:17.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:28:17.497 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:28:17.705 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:28:18.050 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:28:18.153 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:28:18.153 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:28:18.153 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:28:18.345 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:28:18.345 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:28:48.375 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:28:48.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:28:48.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:28:48.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:28:48.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:28:48.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:28:48.939 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:28:48.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:28:48.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:28:48.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:28:48.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:28:48.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:28:48.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:28:52.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:28:52.084 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:28:52.085 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:28:52.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:28:52.095 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:28:52.107 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:28:52.108 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:28:52.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:28:52.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:28:52.109 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:28:52.109 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:28:52.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:28:52.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:28:52.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:28:52.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:28:52.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:28:52.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:28:52.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:28:52.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:28:52.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:28:52.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:28:52.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:28:52.445 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:28:52.521 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:28:50
2026-06-04T07:28:52.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88284, datetime.datetime(2026, 6, 4, 7, 28, 50), datetime.datetime(2026, 6, 4, 7, 28, 49), 'salt', 1.67, 100.74, None, 30.63, 157.87, -0.1, 821.72, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:28:52.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:28:52.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:28:52.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:28:49, diff=3.52856s, valid=True
2026-06-04T07:28:52.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:28:52.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:28:52.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:29:12, diff=-19.467954s, valid=True
2026-06-04T07:28:52.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:28:52.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:28:52.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:28:43, diff=9.540228s, valid=True
2026-06-04T07:28:52.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:28:52.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:28:52.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:28:52.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:28:52.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:28:52.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:28:52.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:29:12, diff=-19.456025s, valid=True
2026-06-04T07:28:52.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:28:52.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:28:52.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:28:52.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125129.5448s, valid=True
2026-06-04T07:28:52.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:28:52.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:28:52.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:28:52.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:28:52.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:28:52.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:28:52.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:28:52.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:28:52.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:28:52.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:28:52.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:28:52.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:28:52.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:28:52.865 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:28:53.072 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:28:53.416 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:28:53.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:28:53.519 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:28:53.519 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:28:53.676 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:28:53.676 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:29:23.706 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:29:23.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:29:23.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:29:23.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:29:23.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:29:24.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:29:24.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:29:24.117 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:29:24.117 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:29:24.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:29:24.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:29:24.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:29:24.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:29:27.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:29:27.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:29:27.057 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:29:27.057 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:29:27.069 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:29:27.082 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:29:27.082 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:29:27.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:29:27.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:29:27.083 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:29:27.084 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:29:27.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:29:27.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:29:27.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:29:27.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:29:27.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:29:27.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:29:27.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:29:27.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:29:27.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:29:27.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:29:27.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:29:27.425 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:29:27.500 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:29:20
2026-06-04T07:29:27.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88285, datetime.datetime(2026, 6, 4, 7, 29, 20), datetime.datetime(2026, 6, 4, 7, 29, 20), 'salt', 1.67, 100.68, None, 31.65, 130.92, -0.09, 821.66, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:29:27.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:29:27.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:29:27.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:29:20, diff=7.507949s, valid=True
2026-06-04T07:29:27.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:29:27.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:29:27.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:29:12, diff=15.511596s, valid=True
2026-06-04T07:29:27.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:29:27.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:29:27.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:29:14, diff=13.519968s, valid=True
2026-06-04T07:29:27.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:29:27.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:29:27.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:29:27.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:29:27.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:29:27.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:29:27.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:29:12, diff=15.52386s, valid=True
2026-06-04T07:29:27.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:29:27.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:29:27.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:29:27.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125164.524717s, valid=True
2026-06-04T07:29:27.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:29:27.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:29:27.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:29:27.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:29:27.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:29:27.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:29:27.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:29:27.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:29:27.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:29:27.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:29:27.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:29:27.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:29:27.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:29:27.917 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:29:28.126 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:29:28.471 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:29:28.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:29:28.573 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:29:28.573 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:29:28.766 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:29:28.766 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:29:58.785 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:29:58.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:29:58.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:29:58.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:29:58.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:29:59.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:29:59.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:29:59.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:29:59.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:29:59.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:29:59.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:29:59.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:29:59.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:30:02.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:30:02.161 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:30:02.162 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:30:02.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:30:02.171 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:30:02.183 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:30:02.183 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:30:02.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:30:02.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:30:02.184 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:30:02.184 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:30:02.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:30:02.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:30:02.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:30:02.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:30:02.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:30:02.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:30:02.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:30:02.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:30:02.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:30:02.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:30:02.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:30:02.475 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:30:02.549 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:29:51
2026-06-04T07:30:02.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88286, datetime.datetime(2026, 6, 4, 7, 29, 51), datetime.datetime(2026, 6, 4, 7, 29, 50), 'salt', 1.63, 100.61, None, 35.92, 155.05, -0.09, 821.78, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:30:02.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:30:02.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:30:02.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:29:50, diff=12.55609s, valid=True
2026-06-04T07:30:02.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:30:02.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:30:02.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:30:12, diff=-9.441092s, valid=True
2026-06-04T07:30:02.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:30:02.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:30:02.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:29:44, diff=18.565412s, valid=True
2026-06-04T07:30:02.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:30:02.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:30:02.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:30:02.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:30:02.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:30:02.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:30:02.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:30:12, diff=-9.431679s, valid=True
2026-06-04T07:30:02.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:30:02.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:30:02.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:30:02.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125199.568958s, valid=True
2026-06-04T07:30:02.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:30:02.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:30:02.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:30:02.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:30:02.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:30:02.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:30:02.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:30:02.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:30:02.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:30:02.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:30:02.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:30:02.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:30:02.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:30:02.859 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:30:03.061 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:30:03.384 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:30:03.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:30:03.477 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:30:03.477 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:30:03.561 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:30:03.561 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:30:33.571 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:30:33.571 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:30:33.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:30:33.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:30:33.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:30:33.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:30:33.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:30:33.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:30:33.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:30:33.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:30:33.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:30:33.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:30:33.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:30:36.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:30:36.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:30:36.943 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:30:36.943 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:30:36.952 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:30:36.965 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:30:36.965 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:30:36.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:30:36.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:30:36.966 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:30:36.967 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:30:36.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:30:37.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:30:37.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:30:37.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:30:37.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:30:37.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:30:37.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:30:37.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:30:37.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:30:37.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:30:37.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:30:37.297 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:30:37.369 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:30:21
2026-06-04T07:30:37.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88287, datetime.datetime(2026, 6, 4, 7, 30, 21), datetime.datetime(2026, 6, 4, 7, 30, 20), 'salt', 1.6, 100.68, None, 37.93, 164.42, -0.1, 821.6, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:30:37.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:30:37.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:30:37.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:30:20, diff=17.37707s, valid=True
2026-06-04T07:30:37.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:30:37.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:30:37.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:30:12, diff=25.380598s, valid=True
2026-06-04T07:30:37.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:30:37.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:30:37.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:30:14, diff=23.388815s, valid=True
2026-06-04T07:30:37.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:30:37.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:30:37.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:30:37.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:30:37.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:30:37.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:30:37.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:30:12, diff=25.392553s, valid=True
2026-06-04T07:30:37.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:30:37.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:30:37.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:30:37.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125234.393361s, valid=True
2026-06-04T07:30:37.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:30:37.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:30:37.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:30:37.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:30:37.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:30:37.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:30:37.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:30:37.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:30:37.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:30:37.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:30:37.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:30:37.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:30:37.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:30:37.781 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:30:37.989 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:30:38.335 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:30:38.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:30:38.437 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:30:38.437 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:30:38.621 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:30:38.621 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:31:08.651 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:31:08.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:31:08.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:31:08.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:31:08.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:31:09.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:31:09.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:31:09.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:31:09.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:31:09.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:31:09.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:31:09.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:31:09.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:31:11.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:31:11.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:31:11.976 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:31:11.976 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:31:11.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:31:12.001 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:31:12.003 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:31:12.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:31:12.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:31:12.004 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:31:12.005 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:31:12.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:31:12.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:31:12.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:31:12.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:31:12.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:31:12.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:31:12.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:31:12.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:31:12.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:31:12.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:31:12.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:31:12.331 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:31:12.405 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:30:51
2026-06-04T07:31:12.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88288, datetime.datetime(2026, 6, 4, 7, 30, 51), datetime.datetime(2026, 6, 4, 7, 30, 50), 'salt', 1.73, 100.78, None, 28.9, 142.17, -0.11, 821.78, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:31:12.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:31:12.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:31:12.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:30:50, diff=22.412776s, valid=True
2026-06-04T07:31:12.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:31:12.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:31:12.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:31:12, diff=0.416225s, valid=True
2026-06-04T07:31:12.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:31:12.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:31:12.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:30:44, diff=28.424173s, valid=True
2026-06-04T07:31:12.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:31:12.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:31:12.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:31:12.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:31:12.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:31:12.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:31:12.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:31:12, diff=0.427754s, valid=True
2026-06-04T07:31:12.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:31:12.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:31:12.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:31:12.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125269.428516s, valid=True
2026-06-04T07:31:12.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:31:12.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:31:12.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:31:12.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:31:12.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:31:12.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:31:12.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:31:12.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:31:12.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:31:12.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:31:12.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:31:12.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:31:12.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:31:12.751 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:31:12.990 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:31:13.331 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:31:13.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:31:13.432 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:31:13.432 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:31:13.820 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:31:13.820 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:31:43.828 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:31:43.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:31:43.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:31:43.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:31:43.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:31:44.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:31:44.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:31:44.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:31:44.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:31:44.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:31:44.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:31:44.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:31:44.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:31:47.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:31:47.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:31:47.220 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:31:47.220 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:31:47.229 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:31:47.241 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:31:47.241 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:31:47.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:31:47.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:31:47.242 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:31:47.242 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:31:47.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:31:47.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:31:47.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:31:47.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:31:47.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:31:47.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:31:47.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:31:47.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:31:47.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:31:47.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:31:47.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:31:47.531 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:31:47.602 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:31:21
2026-06-04T07:31:47.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88289, datetime.datetime(2026, 6, 4, 7, 31, 21), datetime.datetime(2026, 6, 4, 7, 31, 21), 'salt', 1.7, 100.68, None, 23.22, 155.66, -0.1, 821.78, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:31:47.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:31:47.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:31:47.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:31:21, diff=26.609281s, valid=True
2026-06-04T07:31:47.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:31:47.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:31:47.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:31:12, diff=35.612574s, valid=True
2026-06-04T07:31:47.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:31:47.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:31:47.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:31:15, diff=32.620278s, valid=True
2026-06-04T07:31:47.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:31:47.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:31:47.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:31:47.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:31:47.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:31:47.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:31:47.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:31:12, diff=35.623794s, valid=True
2026-06-04T07:31:47.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:31:47.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:31:47.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:31:47.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125304.624535s, valid=True
2026-06-04T07:31:47.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:31:47.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:31:47.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:31:47.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:31:47.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:31:47.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:31:47.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:31:47.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:31:47.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:31:47.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:31:47.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:31:47.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:31:47.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:31:47.940 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:31:48.148 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:31:48.490 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:31:48.591 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:31:48.591 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:31:48.591 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:31:48.784 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:31:48.784 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:32:18.814 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:32:18.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:32:18.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:32:18.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:32:18.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:32:19.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:32:19.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:32:19.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:32:19.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:32:19.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:32:19.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:32:19.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:32:19.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:32:22.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:32:22.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:32:22.176 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:32:22.177 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:32:22.187 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:32:22.199 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:32:22.200 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:32:22.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:32:22.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:32:22.201 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:32:22.202 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:32:22.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:32:22.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-06-04T07:32:22.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:32:22.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-06-04T07:32:22.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:32:22.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:32:22.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:32:22.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:32:22.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:32:22.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:32:22.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:32:22.535 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:32:22.606 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:32:22
2026-06-04T07:32:22.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88291, datetime.datetime(2026, 6, 4, 7, 32, 22), datetime.datetime(2026, 6, 4, 7, 32, 21), 'salt', 1.8, 100.68, None, 26.57, 156.9, -0.1, 821.78, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:32:22.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:32:22.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-06-04T07:32:22.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:32:21, diff=1.614483s, valid=True
2026-06-04T07:32:22.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:32:22.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:32:22.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:32:12, diff=10.617976s, valid=True
2026-06-04T07:32:22.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:32:22.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-06-04T07:32:22.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:32:15, diff=7.62603s, valid=True
2026-06-04T07:32:22.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:32:22.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:32:22.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:32:22.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:32:22.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:32:22.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:32:22.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:32:12, diff=10.629786s, valid=True
2026-06-04T07:32:22.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:32:22.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:32:22.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:32:22.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125339.630589s, valid=True
2026-06-04T07:32:22.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:32:22.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:32:22.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:32:22.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:32:22.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:32:22.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:32:22.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:32:22.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:32:22.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:32:22.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:32:22.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:32:22.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:32:22.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:32:22.951 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:32:23.157 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:32:23.554 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:32:23.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:32:23.658 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:32:23.659 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:32:23.840 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:32:23.840 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:32:53.870 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:32:53.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:32:53.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:32:54.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:32:54.034 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:32:54.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:32:54.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:32:54.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:32:54.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:32:54.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:32:54.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:32:54.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:32:54.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:32:57.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:32:57.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:32:57.047 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:32:57.048 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:32:57.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:32:57.068 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:32:57.069 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:32:57.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:32:57.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:32:57.070 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:32:57.070 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:32:57.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:32:57.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:32:57.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:32:57.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:32:57.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:32:57.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:32:57.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:32:57.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:32:57.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:32:57.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:32:57.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:32:57.404 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:32:57.475 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:32:52
2026-06-04T07:32:57.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88292, datetime.datetime(2026, 6, 4, 7, 32, 52), datetime.datetime(2026, 6, 4, 7, 32, 51), 'salt', 1.83, 100.74, None, 32.6, 142.22, -0.11, 821.66, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:32:57.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:32:57.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:32:57.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:32:51, diff=6.483123s, valid=True
2026-06-04T07:32:57.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:32:57.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:32:57.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:33:12, diff=-14.513283s, valid=True
2026-06-04T07:32:57.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:32:57.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:32:57.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:32:45, diff=12.495054s, valid=True
2026-06-04T07:32:57.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:32:57.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:32:57.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:32:57.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:32:57.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:32:57.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:32:57.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:33:12, diff=-14.501088s, valid=True
2026-06-04T07:32:57.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:32:57.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:32:57.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:32:57.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125374.499757s, valid=True
2026-06-04T07:32:57.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:32:57.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:32:57.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:32:57.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:32:57.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:32:57.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:32:57.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:32:57.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:32:57.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:32:57.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:32:57.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:32:57.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:32:57.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:32:57.912 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:32:58.122 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:32:58.465 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:32:58.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:32:58.567 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:32:58.567 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:32:58.757 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:32:58.757 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:33:28.788 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:33:28.788 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:33:28.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:33:28.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:33:28.940 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:33:29.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:33:29.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:33:29.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:33:29.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:33:29.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:33:29.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:33:29.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:33:29.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:33:31.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:33:31.851 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:33:31.852 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:33:31.852 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:33:31.863 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:33:31.876 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:33:31.877 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:33:31.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:33:31.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:33:31.878 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:33:31.878 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:33:31.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:33:32.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:33:32.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:33:32.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:33:32.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:33:32.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:33:32.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:33:32.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:33:32.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:33:32.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:33:32.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:33:32.209 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:33:32.280 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:33:22
2026-06-04T07:33:32.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88293, datetime.datetime(2026, 6, 4, 7, 33, 22), datetime.datetime(2026, 6, 4, 7, 33, 22), 'salt', 1.8, 100.74, None, 26.71, 148.96, -0.1, 821.72, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:33:32.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:33:32.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:33:32.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:33:22, diff=10.288499s, valid=True
2026-06-04T07:33:32.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:33:32.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:33:32.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:33:12, diff=20.292056s, valid=True
2026-06-04T07:33:32.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:33:32.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:33:32.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:33:15, diff=17.300336s, valid=True
2026-06-04T07:33:32.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:33:32.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:33:32.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:33:32.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:33:32.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:33:32.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:33:32.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:33:12, diff=20.304055s, valid=True
2026-06-04T07:33:32.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:33:32.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:33:32.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:33:32.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125409.304878s, valid=True
2026-06-04T07:33:32.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:33:32.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:33:32.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:33:32.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:33:32.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:33:32.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:33:32.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:33:32.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:33:32.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:33:32.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:33:32.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:33:32.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:33:32.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:33:32.702 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:33:32.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:33:33.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:33:33.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:33:33.356 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:33:33.356 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:33:34.509 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:33:34.510 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:34:04.521 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:34:04.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:34:04.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:34:04.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:34:04.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:34:04.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:34:04.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:34:04.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:34:04.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:34:04.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:34:04.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:34:04.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:34:04.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:34:07.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:34:07.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:34:07.510 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:34:07.510 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:34:07.521 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:34:07.534 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:34:07.534 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:34:07.535 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:34:07.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:34:07.536 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:34:07.536 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:34:07.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:34:07.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:34:07.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:34:07.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:34:07.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:34:07.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:34:07.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:34:07.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:34:07.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:34:07.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:34:07.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:34:07.869 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:34:07.939 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:33:53
2026-06-04T07:34:07.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88294, datetime.datetime(2026, 6, 4, 7, 33, 53), datetime.datetime(2026, 6, 4, 7, 33, 52), 'salt', 1.67, 100.68, None, 28.93, 145.39, -0.09, 821.72, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:34:07.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:34:07.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:34:07.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:33:52, diff=15.947139s, valid=True
2026-06-04T07:34:07.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:34:07.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:34:07.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:34:12, diff=-4.049393s, valid=True
2026-06-04T07:34:07.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:34:07.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:34:07.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:33:46, diff=21.958827s, valid=True
2026-06-04T07:34:07.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:34:07.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:34:07.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:34:07.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:34:07.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:34:07.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:34:07.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:34:12, diff=-4.037459s, valid=True
2026-06-04T07:34:07.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:34:07.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:34:07.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:34:07.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125444.963364s, valid=True
2026-06-04T07:34:07.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:34:07.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:34:07.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:34:07.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:34:07.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:34:08.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:34:08.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:34:08.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:34:08.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:34:08.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:34:08.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:34:08.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:34:08.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:34:08.284 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:34:08.492 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:34:08.835 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:34:08.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:34:08.936 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:34:08.936 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:34:09.130 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:34:09.130 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:34:39.159 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:34:39.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:34:39.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:34:39.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:34:39.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:34:39.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:34:39.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:34:39.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:34:39.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:34:39.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:34:39.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:34:39.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:34:39.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:34:42.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:34:42.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:34:42.432 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:34:42.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:34:42.442 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:34:42.454 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:34:42.455 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:34:42.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:34:42.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:34:42.456 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:34:42.456 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:34:42.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:34:42.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:34:42.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:34:42.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:34:42.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:34:42.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:34:42.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:34:42.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:34:42.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:34:42.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:34:42.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:34:42.791 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:34:42.863 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:34:23
2026-06-04T07:34:42.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88295, datetime.datetime(2026, 6, 4, 7, 34, 23), datetime.datetime(2026, 6, 4, 7, 34, 22), 'salt', 1.67, 100.68, None, 26.29, 138.42, -0.09, 821.84, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:34:42.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:34:42.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:34:42.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:34:22, diff=20.871051s, valid=True
2026-06-04T07:34:42.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:34:42.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:34:42.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:34:12, diff=30.87439s, valid=True
2026-06-04T07:34:42.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:34:42.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:34:42.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:34:16, diff=26.88214s, valid=True
2026-06-04T07:34:42.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:34:42.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:34:42.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:34:42.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:34:42.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:34:42.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:34:42.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:34:12, diff=30.885734s, valid=True
2026-06-04T07:34:42.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:34:42.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:34:42.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:34:42.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125479.886498s, valid=True
2026-06-04T07:34:42.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:34:42.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:34:42.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:34:42.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:34:42.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:34:42.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:34:42.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:34:42.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:34:42.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:34:43.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:34:43.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:34:43.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:34:43.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:34:43.286 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:34:43.495 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:34:43.839 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:34:43.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:34:43.944 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:34:43.944 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:34:44.133 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:34:44.133 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:35:14.164 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:35:14.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:35:14.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:35:14.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:35:14.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:35:14.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:35:14.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:35:14.601 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:35:14.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:35:14.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:35:14.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:35:14.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:35:14.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:35:17.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:35:17.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:35:17.297 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:35:17.297 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:35:17.308 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:35:17.321 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:35:17.321 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:35:17.322 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:35:17.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:35:17.322 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:35:17.323 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:35:17.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:35:17.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:35:17.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:35:17.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:35:17.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:35:17.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:35:17.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:35:17.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:35:17.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:35:17.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:35:17.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:35:17.657 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:35:17.734 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:34:53
2026-06-04T07:35:17.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88296, datetime.datetime(2026, 6, 4, 7, 34, 53), datetime.datetime(2026, 6, 4, 7, 34, 53), 'salt', 1.7, 100.71, None, 38.6, 147.88, -0.1, 821.66, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:35:17.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:35:17.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:35:17.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:34:53, diff=24.741564s, valid=True
2026-06-04T07:35:17.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:35:17.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:35:17.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:35:12, diff=5.74501s, valid=True
2026-06-04T07:35:17.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:35:17.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:35:17.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:34:46, diff=31.752983s, valid=True
2026-06-04T07:35:17.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:35:17.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:35:17.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:35:17.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:35:17.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:35:17.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:35:17.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:35:12, diff=5.756596s, valid=True
2026-06-04T07:35:17.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:35:17.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:35:17.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:35:17.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125514.757376s, valid=True
2026-06-04T07:35:17.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:35:17.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:35:17.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:35:17.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:35:17.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:35:17.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:35:17.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:35:17.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:35:17.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:35:17.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:35:17.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:35:17.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:35:18.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:35:18.079 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:35:18.288 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:35:18.631 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:35:18.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:35:18.735 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:35:18.735 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:35:18.922 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:35:18.922 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:35:48.923 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:35:48.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:35:48.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:35:49.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:35:49.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:35:49.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:35:49.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:35:49.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:35:49.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:35:49.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:35:49.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:35:49.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:35:49.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:35:51.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:35:51.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:35:51.968 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:35:51.968 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:35:51.978 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:35:51.990 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:35:51.991 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:35:51.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:35:51.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:35:51.992 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:35:51.992 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:35:52.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:35:52.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:35:52.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:35:52.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:35:52.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:35:52.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:35:52.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:35:52.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:35:52.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:35:52.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:35:52.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:35:52.279 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:35:52.349 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:35:24
2026-06-04T07:35:52.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88297, datetime.datetime(2026, 6, 4, 7, 35, 24), datetime.datetime(2026, 6, 4, 7, 35, 23), 'salt', 1.67, 100.61, None, 33.45, 147.79, -0.08, 821.66, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:35:52.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:35:52.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:35:52.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:35:23, diff=29.356613s, valid=True
2026-06-04T07:35:52.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:35:52.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:35:52.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:35:12, diff=40.359871s, valid=True
2026-06-04T07:35:52.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:35:52.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:35:52.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:35:16, diff=36.367408s, valid=True
2026-06-04T07:35:52.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:35:52.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:35:52.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:35:52.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:35:52.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:35:52.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:35:52.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:35:12, diff=40.370904s, valid=True
2026-06-04T07:35:52.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:35:52.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:35:52.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:35:52.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125549.371655s, valid=True
2026-06-04T07:35:52.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:35:52.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:35:52.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:35:52.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:35:52.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:35:52.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:35:52.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:35:52.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:35:52.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:35:52.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:35:52.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:35:52.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:35:52.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:35:52.760 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:35:52.967 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:35:53.310 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:35:53.412 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:35:53.412 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:35:53.412 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:35:53.572 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:35:53.572 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:36:23.602 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:36:23.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:36:23.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:36:23.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:36:23.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:36:24.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:36:24.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:36:24.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:36:24.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:36:24.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:36:24.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:36:24.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:36:24.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:36:26.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:36:26.947 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:36:26.948 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:36:26.948 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:36:26.959 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:36:26.972 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:36:26.973 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:36:26.973 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:36:26.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:36:26.974 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:36:26.974 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:36:26.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:36:27.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:36:27.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:36:27.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:36:27.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:36:27.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:36:27.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:36:27.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:36:27.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:36:27.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:36:27.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:36:27.304 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:36:27.377 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:36:24
2026-06-04T07:36:27.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88299, datetime.datetime(2026, 6, 4, 7, 36, 24), datetime.datetime(2026, 6, 4, 7, 36, 23), 'salt', 1.67, 100.71, None, 27.2, 164.56, -0.1, 821.72, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:36:27.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:36:27.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:36:27.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:36:23, diff=4.384378s, valid=True
2026-06-04T07:36:27.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:36:27.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:36:27.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:36:12, diff=15.387897s, valid=True
2026-06-04T07:36:27.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:36:27.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:36:27.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:36:17, diff=10.395997s, valid=True
2026-06-04T07:36:27.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:36:27.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:36:27.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:36:27.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:36:27.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:36:27.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:36:27.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:36:12, diff=15.399698s, valid=True
2026-06-04T07:36:27.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:36:27.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:36:27.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:36:27.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125584.400509s, valid=True
2026-06-04T07:36:27.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:36:27.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:36:27.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:36:27.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:36:27.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:36:27.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:36:27.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:36:27.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:36:27.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:36:27.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:36:27.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:36:27.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:36:27.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:36:27.720 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:36:27.926 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:36:28.267 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:36:28.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:36:28.368 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:36:28.368 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:36:28.559 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:36:28.560 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:36:58.590 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:36:58.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:36:58.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:36:58.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:36:58.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:36:59.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:36:59.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:36:59.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:36:59.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:36:59.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:36:59.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:36:59.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:36:59.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:37:01.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:37:01.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:37:01.767 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:37:01.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:37:01.778 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:37:01.789 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:37:01.790 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:37:01.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:37:01.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:37:01.790 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:37:01.790 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:37:01.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:37:01.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:37:01.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:37:01.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:37:01.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:37:02.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:37:02.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:37:02.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:37:02.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:37:02.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:37:02.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:37:02.066 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:37:02.136 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:36:54
2026-06-04T07:37:02.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88300, datetime.datetime(2026, 6, 4, 7, 36, 54), datetime.datetime(2026, 6, 4, 7, 36, 54), 'salt', 1.67, 100.68, None, 26.89, 150.89, -0.09, 821.84, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:37:02.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:37:02.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:37:02.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:36:54, diff=8.142181s, valid=True
2026-06-04T07:37:02.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:37:02.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:37:02.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:37:12, diff=-9.855011s, valid=True
2026-06-04T07:37:02.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:37:02.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:37:02.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:36:47, diff=15.15178s, valid=True
2026-06-04T07:37:02.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:37:02.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:37:02.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:37:02.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:37:02.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:37:02.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:37:02.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:37:12, diff=-9.845081s, valid=True
2026-06-04T07:37:02.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:37:02.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:37:02.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:37:02.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125619.155559s, valid=True
2026-06-04T07:37:02.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:37:02.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:37:02.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:37:02.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:37:02.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:37:02.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:37:02.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:37:02.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:37:02.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:37:02.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:37:02.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:37:02.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:37:02.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:37:02.472 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:37:02.673 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:37:03.010 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:37:03.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:37:03.110 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:37:03.110 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:37:03.314 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:37:03.314 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:37:33.325 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:37:33.325 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:37:33.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:37:33.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:37:33.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:37:33.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:37:33.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:37:33.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:37:33.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:37:33.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:37:33.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:37:33.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:37:33.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:37:36.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:37:36.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:37:36.620 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:37:36.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:37:36.631 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:37:36.643 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:37:36.644 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:37:36.645 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:37:36.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:37:36.645 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:37:36.645 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:37:36.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:37:36.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:37:36.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:37:36.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:37:36.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:37:36.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:37:36.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:37:36.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:37:36.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:37:36.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:37:36.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:37:36.978 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:37:37.051 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:37:25
2026-06-04T07:37:37.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88301, datetime.datetime(2026, 6, 4, 7, 37, 25), datetime.datetime(2026, 6, 4, 7, 37, 24), 'salt', 1.73, 100.71, None, 34.15, 144.78, -0.1, 821.72, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:37:37.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:37:37.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:37:37.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:37:24, diff=13.058528s, valid=True
2026-06-04T07:37:37.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:37:37.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:37:37.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:37:12, diff=25.062008s, valid=True
2026-06-04T07:37:37.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:37:37.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:37:37.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:37:18, diff=19.070282s, valid=True
2026-06-04T07:37:37.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:37:37.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:37:37.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:37:37.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:37:37.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:37:37.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:37:37.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:37:12, diff=25.074034s, valid=True
2026-06-04T07:37:37.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:37:37.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:37:37.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:37:37.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125654.074845s, valid=True
2026-06-04T07:37:37.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:37:37.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:37:37.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:37:37.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:37:37.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:37:37.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:37:37.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:37:37.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:37:37.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:37:37.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:37:37.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:37:37.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:37:37.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:37:37.396 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:37:37.619 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:37:38.042 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:37:38.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:37:38.144 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:37:38.144 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:37:38.313 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:37:38.313 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:38:08.320 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:38:08.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:38:08.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:38:08.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:38:08.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:38:08.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:38:08.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:38:08.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:38:08.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:38:08.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:38:08.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:38:08.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:38:08.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:38:11.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:38:11.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:38:11.887 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:38:11.887 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:38:11.897 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:38:11.911 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:38:11.912 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:38:11.912 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:38:11.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:38:11.913 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:38:11.914 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:38:11.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:38:12.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:38:12.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:38:12.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:38:12.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:38:12.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:38:12.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:38:12.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:38:12.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:38:12.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:38:12.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:38:12.237 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:38:12.308 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:37:55
2026-06-04T07:38:12.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88302, datetime.datetime(2026, 6, 4, 7, 37, 55), datetime.datetime(2026, 6, 4, 7, 37, 54), 'salt', 1.7, 100.74, None, 31.26, 140.37, -0.1, 821.72, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:38:12.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:38:12.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:38:12.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:37:54, diff=18.31586s, valid=True
2026-06-04T07:38:12.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:38:12.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:38:12.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:38:12, diff=0.319118s, valid=True
2026-06-04T07:38:12.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:38:12.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:38:12.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:37:48, diff=24.326515s, valid=True
2026-06-04T07:38:12.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:38:12.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:38:12.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:38:12.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:38:12.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:38:12.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:38:12.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:38:12, diff=0.329885s, valid=True
2026-06-04T07:38:12.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:38:12.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:38:12.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:38:12.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125689.330639s, valid=True
2026-06-04T07:38:12.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:38:12.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:38:12.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:38:12.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:38:12.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:38:12.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:38:12.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:38:12.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:38:12.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:38:12.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:38:12.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:38:12.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:38:12.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:38:12.649 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:38:12.847 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:38:13.187 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:38:13.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:38:13.288 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:38:13.288 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:38:13.366 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:38:13.366 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:38:43.392 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:38:43.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:38:43.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:38:43.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:38:43.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:38:43.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:38:43.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:38:43.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:38:43.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:38:43.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:38:43.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:38:43.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:38:43.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:38:46.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:38:46.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:38:46.521 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:38:46.521 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:38:46.531 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:38:46.543 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:38:46.544 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:38:46.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:38:46.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:38:46.545 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:38:46.545 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:38:46.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:38:46.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:38:46.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:38:46.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:38:46.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:38:46.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:38:46.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:38:46.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:38:46.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:38:46.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:38:46.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:38:46.874 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:38:46.951 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:38:25
2026-06-04T07:38:46.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88303, datetime.datetime(2026, 6, 4, 7, 38, 25), datetime.datetime(2026, 6, 4, 7, 38, 24), 'salt', 1.77, 100.78, None, 30.06, 148.96, -0.11, 821.84, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:38:46.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:38:46.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:38:46.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:38:24, diff=22.959168s, valid=True
2026-06-04T07:38:46.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:38:46.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:38:46.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:38:12, diff=34.962632s, valid=True
2026-06-04T07:38:46.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:38:46.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:38:46.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:38:18, diff=28.970778s, valid=True
2026-06-04T07:38:46.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:38:46.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:38:46.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:38:46.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:38:46.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:38:46.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:38:46.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:38:12, diff=34.974494s, valid=True
2026-06-04T07:38:46.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:38:46.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:38:46.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:38:46.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125723.975307s, valid=True
2026-06-04T07:38:46.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:38:46.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:38:46.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:38:46.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:38:46.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:38:47.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:38:47.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:38:47.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:38:47.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:38:47.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:38:47.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:38:47.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:38:47.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:38:47.297 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:38:47.567 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:38:47.903 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:38:48.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:38:48.003 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:38:48.003 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:38:48.076 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:38:48.076 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:39:18.097 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:39:18.098 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:39:18.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:39:18.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:39:18.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:39:18.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:39:18.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:39:18.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:39:18.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:39:18.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:39:18.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:39:18.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:39:18.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:39:21.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:39:21.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:39:21.048 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:39:21.048 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:39:21.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:39:21.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:39:21.073 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:39:21.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:39:21.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:39:21.075 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:39:21.075 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:39:21.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:39:21.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:39:21.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:39:21.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:39:21.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:39:21.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:39:21.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:39:21.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:39:21.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:39:21.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:39:21.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:39:21.429 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:39:21.501 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:38:55
2026-06-04T07:39:21.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88304, datetime.datetime(2026, 6, 4, 7, 38, 55), datetime.datetime(2026, 6, 4, 7, 38, 55), 'salt', 1.6, 100.68, None, 36.27, 156.88, -0.1, 821.72, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:39:21.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:39:21.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:39:21.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:38:55, diff=26.509526s, valid=True
2026-06-04T07:39:21.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:39:21.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:39:21.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:39:12, diff=9.513104s, valid=True
2026-06-04T07:39:21.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:39:21.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:39:21.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:38:48, diff=33.521547s, valid=True
2026-06-04T07:39:21.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:39:21.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:39:21.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:39:21.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:39:21.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:39:21.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:39:21.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:39:12, diff=9.52539s, valid=True
2026-06-04T07:39:21.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:39:21.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:39:21.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:39:21.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125758.526227s, valid=True
2026-06-04T07:39:21.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:39:21.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:39:21.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:39:21.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:39:21.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:39:21.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:39:21.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:39:21.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:39:21.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:39:21.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:39:21.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:39:21.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:39:21.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:39:21.854 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:39:22.065 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:39:22.424 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:39:22.532 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:39:22.532 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:39:22.532 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:39:22.700 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:39:22.700 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:39:52.730 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:39:52.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:39:52.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:39:53.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:39:53.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:39:53.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:39:53.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:39:53.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:39:53.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:39:53.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:39:53.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:39:53.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:39:53.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:39:56.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:39:56.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:39:56.020 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:39:56.020 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:39:56.031 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:39:56.043 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:39:56.044 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:39:56.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:39:56.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:39:56.045 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:39:56.045 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:39:56.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:39:56.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-06-04T07:39:56.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:39:56.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-06-04T07:39:56.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:39:56.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T07:39:56.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:39:56.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T07:39:56.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:39:56.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:39:56.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:39:56.393 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:39:56.464 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:39:56
2026-06-04T07:39:56.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88306, datetime.datetime(2026, 6, 4, 7, 39, 56), datetime.datetime(2026, 6, 4, 7, 39, 55), 'salt', 1.7, 100.71, None, 32.6, 151.57, -0.1, 821.72, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:39:56.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:39:56.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-06-04T07:39:56.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:39:55, diff=1.472054s, valid=True
2026-06-04T07:39:56.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:39:56.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T07:39:56.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:40:12, diff=-15.524593s, valid=True
2026-06-04T07:39:56.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:39:56.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-06-04T07:39:56.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:39:49, diff=7.482955s, valid=True
2026-06-04T07:39:56.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:39:56.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:39:56.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:39:56.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:39:56.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:39:56.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T07:39:56.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:40:12, diff=-15.513537s, valid=True
2026-06-04T07:39:56.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:39:56.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:39:56.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:39:56.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125793.487198s, valid=True
2026-06-04T07:39:56.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:39:56.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:39:56.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:39:56.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:39:56.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:39:56.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:39:56.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:39:56.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:39:56.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:39:56.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:39:56.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:39:56.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:39:56.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:39:56.880 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:39:57.077 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:39:57.410 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:39:57.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:39:57.510 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:39:57.510 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:39:57.783 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:39:57.783 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:40:27.813 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:40:27.813 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:40:27.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:40:27.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:40:27.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:40:28.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:40:28.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:40:28.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:40:28.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:40:28.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:40:28.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:40:28.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:40:28.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:40:31.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:40:31.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:40:31.107 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:40:31.108 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:40:31.128 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:40:31.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:40:31.144 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:40:31.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:40:31.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:40:31.145 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:40:31.145 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:40:31.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:40:31.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:40:31.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:40:31.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:40:31.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:40:31.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:40:31.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:40:31.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:40:31.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:40:31.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:40:31.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:40:31.495 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:40:31.568 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:40:26
2026-06-04T07:40:31.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88307, datetime.datetime(2026, 6, 4, 7, 40, 26), datetime.datetime(2026, 6, 4, 7, 40, 25), 'salt', 1.8, 100.71, None, 31.3, 157.42, -0.1, 821.78, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:40:31.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:40:31.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:40:31.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:40:25, diff=6.575604s, valid=True
2026-06-04T07:40:31.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:40:31.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:40:31.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:40:12, diff=19.57908s, valid=True
2026-06-04T07:40:31.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:40:31.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:40:31.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:40:20, diff=11.587701s, valid=True
2026-06-04T07:40:31.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:40:31.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:40:31.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:40:31.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:40:31.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:40:31.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:40:31.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:40:12, diff=19.591588s, valid=True
2026-06-04T07:40:31.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:40:31.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:40:31.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:40:31.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125828.592408s, valid=True
2026-06-04T07:40:31.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:40:31.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:40:31.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:40:31.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:40:31.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:40:31.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:40:31.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:40:31.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:40:31.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:40:31.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:40:31.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:40:31.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:40:31.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:40:31.912 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:40:32.111 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:40:32.442 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:40:32.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:40:32.542 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:40:32.542 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:40:32.725 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:40:32.725 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:41:02.749 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:41:02.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:41:02.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:41:03.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:41:03.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:41:03.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:41:03.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:41:03.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:41:03.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:41:03.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:41:03.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:41:03.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:41:03.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:41:06.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:41:06.148 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:41:06.148 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:41:06.149 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:41:06.159 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:41:06.171 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:41:06.172 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:41:06.173 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:41:06.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:41:06.173 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:41:06.173 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:41:06.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:41:06.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:41:06.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:41:06.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:41:06.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:41:06.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:41:06.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:41:06.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:41:06.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:41:06.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:41:06.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:41:06.520 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:41:06.591 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:40:56
2026-06-04T07:41:06.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88308, datetime.datetime(2026, 6, 4, 7, 40, 56), datetime.datetime(2026, 6, 4, 7, 40, 56), 'salt', 1.7, 100.71, None, 32.96, 148.71, -0.1, 821.78, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:41:06.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:41:06.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:41:06.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:40:56, diff=10.598639s, valid=True
2026-06-04T07:41:06.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:41:06.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:41:06.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:41:12, diff=-5.397871s, valid=True
2026-06-04T07:41:06.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:41:06.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:41:06.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:40:50, diff=16.610249s, valid=True
2026-06-04T07:41:06.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:41:06.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:41:06.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:41:06.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:41:06.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:41:06.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:41:06.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:41:12, diff=-5.386023s, valid=True
2026-06-04T07:41:06.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:41:06.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:41:06.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:41:06.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125863.614789s, valid=True
2026-06-04T07:41:06.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:41:06.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:41:06.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:41:06.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:41:06.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:41:06.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:41:06.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:41:06.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:41:06.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:41:06.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:41:06.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:41:06.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:41:06.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:41:07.003 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:41:07.202 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:41:07.535 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:41:07.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:41:07.635 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:41:07.636 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:41:07.833 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:41:07.833 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:41:37.863 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:41:37.863 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:41:37.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:41:38.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:41:38.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:41:38.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:41:38.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:41:38.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:41:38.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:41:38.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:41:38.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:41:38.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:41:38.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:41:40.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:41:40.969 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:41:40.970 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:41:40.970 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:41:40.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:41:40.994 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:41:40.995 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:41:40.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:41:40.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:41:40.996 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:41:40.996 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:41:41.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:41:41.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:41:41.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:41:41.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:41:41.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:41:41.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:41:41.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:41:41.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:41:41.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:41:41.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:41:41.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:41:41.345 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:41:41.417 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:41:27
2026-06-04T07:41:41.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88309, datetime.datetime(2026, 6, 4, 7, 41, 27), datetime.datetime(2026, 6, 4, 7, 41, 26), 'salt', 1.77, 100.74, None, 35.21, 154.58, -0.1, 821.72, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:41:41.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:41:41.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:41:41.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:41:26, diff=15.42508s, valid=True
2026-06-04T07:41:41.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:41:41.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:41:41.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:41:12, diff=29.428558s, valid=True
2026-06-04T07:41:41.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:41:41.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:41:41.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:41:20, diff=21.436792s, valid=True
2026-06-04T07:41:41.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:41:41.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:41:41.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:41:41.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:41:41.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:41:41.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:41:41.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:41:12, diff=29.440574s, valid=True
2026-06-04T07:41:41.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:41:41.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:41:41.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:41:41.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125898.441391s, valid=True
2026-06-04T07:41:41.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:41:41.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:41:41.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:41:41.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:41:41.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:41:41.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:41:41.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:41:41.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:41:41.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:41:41.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:41:41.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:41:41.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:41:41.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:41:41.770 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:41:41.967 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:41:42.300 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:41:42.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:41:42.400 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:41:42.400 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:41:42.666 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:41:42.666 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:42:12.692 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:42:12.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:42:12.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:42:13.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:42:13.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:42:13.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:42:13.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:42:13.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:42:13.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:42:13.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:42:13.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:42:13.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:42:13.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:42:16.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:42:16.425 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:42:16.426 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:42:16.426 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:42:16.436 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:42:16.448 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:42:16.449 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:42:16.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:42:16.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:42:16.450 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:42:16.450 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:42:16.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:42:16.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:42:16.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:42:16.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:42:16.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:42:16.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:42:16.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:42:16.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:42:16.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:42:16.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:42:16.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:42:16.856 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:42:16.930 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:41:57
2026-06-04T07:42:16.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88310, datetime.datetime(2026, 6, 4, 7, 41, 57), datetime.datetime(2026, 6, 4, 7, 41, 56), 'salt', 1.73, 100.68, None, 35.57, 148.99, -0.1, 821.66, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:42:16.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:42:16.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:42:16.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:41:56, diff=20.936314s, valid=True
2026-06-04T07:42:16.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:42:16.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:42:16.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:42:12, diff=4.939187s, valid=True
2026-06-04T07:42:16.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:42:16.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:42:16.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:41:51, diff=25.945789s, valid=True
2026-06-04T07:42:16.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:42:16.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:42:16.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:42:16.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:42:16.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:42:16.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:42:16.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:42:12, diff=4.948768s, valid=True
2026-06-04T07:42:16.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:42:16.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:42:16.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:42:16.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125933.9494s, valid=True
2026-06-04T07:42:16.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:42:16.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:42:16.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:42:16.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:42:16.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:42:17.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:42:17.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:42:17.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:42:17.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:42:17.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:42:17.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:42:17.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:42:17.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:42:17.261 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:42:17.460 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:42:17.797 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:42:17.897 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:42:17.897 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:42:17.897 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:42:18.051 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:42:18.051 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:42:48.078 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:42:48.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:42:48.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:42:48.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:42:48.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:42:48.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:42:48.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:42:48.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:42:48.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:42:48.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:42:48.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:42:48.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:42:48.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:42:51.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:42:51.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:42:51.660 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:42:51.660 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:42:51.669 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:42:51.682 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:42:51.683 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:42:51.683 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:42:51.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:42:51.684 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:42:51.684 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:42:51.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:42:51.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:42:51.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:42:51.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:42:51.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:42:51.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:42:51.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:42:52.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:42:52.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:42:52.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:42:52.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:42:52.025 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:42:52.106 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:42:27
2026-06-04T07:42:52.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88311, datetime.datetime(2026, 6, 4, 7, 42, 27), datetime.datetime(2026, 6, 4, 7, 42, 26), 'salt', 1.73, 100.64, None, 33.66, 156.2, -0.09, 821.84, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:42:52.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:42:52.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:42:52.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:42:26, diff=26.113796s, valid=True
2026-06-04T07:42:52.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:42:52.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:42:52.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:42:12, diff=40.11744s, valid=True
2026-06-04T07:42:52.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:42:52.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:42:52.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:42:21, diff=31.125934s, valid=True
2026-06-04T07:42:52.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:42:52.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:42:52.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:42:52.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:42:52.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:42:52.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:42:52.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:42:12, diff=40.129794s, valid=True
2026-06-04T07:42:52.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:42:52.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:42:52.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:42:52.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=125969.130602s, valid=True
2026-06-04T07:42:52.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:42:52.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:42:52.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:42:52.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:42:52.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:42:52.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:42:52.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:42:52.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:42:52.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:42:52.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:42:52.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:42:52.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:42:52.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:42:52.452 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:42:52.649 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:42:52.983 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:42:53.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:42:53.082 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:42:53.082 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:42:53.347 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:42:53.347 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:43:23.358 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:43:23.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:43:23.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:43:23.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:43:23.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:43:23.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:43:23.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:43:23.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:43:23.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:43:24.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:43:24.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:43:24.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:43:24.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:43:26.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:43:26.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:43:26.731 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:43:26.732 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:43:26.742 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:43:26.754 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:43:26.755 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:43:26.756 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:43:26.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:43:26.756 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:43:26.757 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:43:26.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:43:26.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:43:26.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:43:26.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:43:26.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:43:27.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:43:27.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:43:27.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:43:27.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:43:27.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:43:27.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:43:27.099 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:43:27.172 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:42:57
2026-06-04T07:43:27.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88312, datetime.datetime(2026, 6, 4, 7, 42, 57), datetime.datetime(2026, 6, 4, 7, 42, 57), 'salt', 1.77, 100.74, None, 22.76, 172.9, -0.1, 821.84, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:43:27.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:43:27.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:43:27.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:42:57, diff=30.179811s, valid=True
2026-06-04T07:43:27.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:43:27.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:43:27.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:43:12, diff=15.183503s, valid=True
2026-06-04T07:43:27.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:43:27.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:43:27.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:42:51, diff=36.192039s, valid=True
2026-06-04T07:43:27.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:43:27.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:43:27.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:43:27.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:43:27.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:43:27.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:43:27.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:43:12, diff=15.1961s, valid=True
2026-06-04T07:43:27.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:43:27.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:43:27.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:43:27.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126004.196964s, valid=True
2026-06-04T07:43:27.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:43:27.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:43:27.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:43:27.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:43:27.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:43:27.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:43:27.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:43:27.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:43:27.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:43:27.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:43:27.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:43:27.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:43:27.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:43:27.518 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:43:27.720 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:43:28.053 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:43:28.153 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:43:28.154 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:43:28.154 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:43:28.412 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:43:28.412 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:43:58.426 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:43:58.426 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:43:58.427 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:43:58.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:43:58.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:43:58.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:43:58.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:43:58.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:43:58.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:43:58.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:43:58.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:43:58.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:43:58.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:44:01.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:44:01.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:44:01.568 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:44:01.568 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:44:01.579 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:44:01.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:44:01.592 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:44:01.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:44:01.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:44:01.593 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:44:01.594 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:44:01.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:44:01.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:44:01.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:44:01.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:44:01.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:44:01.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:44:01.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:44:01.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:44:01.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:44:01.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:44:01.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:44:01.934 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:44:02.006 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:43:58
2026-06-04T07:44:02.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88314, datetime.datetime(2026, 6, 4, 7, 43, 58), datetime.datetime(2026, 6, 4, 7, 43, 57), 'salt', 1.73, 100.74, None, 34.82, 155.96, -0.11, 821.72, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:44:02.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:44:02.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:44:02.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:43:57, diff=5.01387s, valid=True
2026-06-04T07:44:02.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:44:02.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:44:02.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:44:12, diff=-9.982634s, valid=True
2026-06-04T07:44:02.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:44:02.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:44:02.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:43:52, diff=10.025568s, valid=True
2026-06-04T07:44:02.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:44:02.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:44:02.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:44:02.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:44:02.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:44:02.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:44:02.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:44:12, diff=-9.970705s, valid=True
2026-06-04T07:44:02.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:44:02.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:44:02.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:44:02.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126039.030117s, valid=True
2026-06-04T07:44:02.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:44:02.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:44:02.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:44:02.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:44:02.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:44:02.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:44:02.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:44:02.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:44:02.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:44:02.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:44:02.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:44:02.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:44:02.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:44:02.351 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:44:02.552 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:44:02.884 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:44:03.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:44:03.041 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:44:03.041 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:44:03.289 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:44:03.289 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:44:33.313 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:44:33.314 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:44:33.314 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:44:33.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:44:33.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:44:33.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:44:33.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:44:33.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:44:33.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:44:33.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:44:33.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:44:33.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:44:33.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:44:36.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:44:36.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:44:36.745 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:44:36.746 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:44:36.756 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:44:36.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:44:36.769 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:44:36.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:44:36.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:44:36.770 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:44:36.771 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:44:36.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:44:36.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:44:36.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:44:37.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:44:37.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:44:37.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:44:37.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:44:37.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:44:37.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:44:37.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:44:37.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:44:37.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:44:37.203 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:44:28
2026-06-04T07:44:37.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88315, datetime.datetime(2026, 6, 4, 7, 44, 28), datetime.datetime(2026, 6, 4, 7, 44, 27), 'salt', 1.7, 100.71, None, 33.2, 161.01, -0.1, 821.72, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:44:37.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:44:37.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:44:37.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:44:27, diff=10.21096s, valid=True
2026-06-04T07:44:37.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:44:37.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:44:37.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:44:12, diff=25.214641s, valid=True
2026-06-04T07:44:37.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:44:37.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:44:37.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:44:22, diff=15.223101s, valid=True
2026-06-04T07:44:37.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:44:37.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:44:37.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:44:37.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:44:37.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:44:37.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:44:37.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:44:12, diff=25.226986s, valid=True
2026-06-04T07:44:37.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:44:37.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:44:37.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:44:37.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126074.227834s, valid=True
2026-06-04T07:44:37.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:44:37.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:44:37.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:44:37.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:44:37.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:44:37.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:44:37.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:44:37.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:44:37.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:44:37.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:44:37.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:44:37.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:44:37.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:44:37.548 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:44:37.745 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:44:38.078 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:44:38.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:44:38.183 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:44:38.183 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:44:38.359 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:44:38.359 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:45:08.389 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:45:08.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:45:08.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:45:08.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:45:08.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:45:08.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:45:08.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:45:08.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:45:08.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:45:08.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:45:08.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:45:08.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:45:08.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:45:11.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:45:11.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:45:11.491 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:45:11.491 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:45:11.502 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:45:11.515 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:45:11.515 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:45:11.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:45:11.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:45:11.517 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:45:11.517 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:45:11.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:45:11.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:45:11.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:45:11.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:45:11.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:45:11.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:45:11.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:45:11.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:45:11.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:45:11.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:45:11.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:45:11.836 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:45:11.908 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:44:58
2026-06-04T07:45:11.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88316, datetime.datetime(2026, 6, 4, 7, 44, 58), datetime.datetime(2026, 6, 4, 7, 44, 58), 'salt', 1.8, 100.74, None, 39.09, 137.05, -0.1, 821.72, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:45:11.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:45:11.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:45:11.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:44:58, diff=13.915606s, valid=True
2026-06-04T07:45:11.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:45:11.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:45:11.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:45:12, diff=-0.0812s, valid=True
2026-06-04T07:45:11.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:45:11.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:45:11.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:44:52, diff=19.92633s, valid=True
2026-06-04T07:45:11.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:45:11.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:45:11.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:45:11.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:45:11.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:45:11.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:45:11.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:45:12, diff=-0.070229s, valid=True
2026-06-04T07:45:11.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:45:11.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:45:11.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:45:11.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126108.930504s, valid=True
2026-06-04T07:45:11.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:45:11.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:45:11.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:45:11.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:45:11.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:45:11.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:45:11.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:45:11.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:45:12.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:45:12.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:45:12.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:45:12.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:45:12.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:45:12.245 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:45:12.518 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:45:12.855 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:45:12.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:45:12.955 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:45:12.955 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:45:13.140 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:45:13.140 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:45:43.170 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:45:43.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:45:43.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:45:43.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:45:43.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:45:43.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:45:43.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:45:43.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:45:43.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:45:43.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:45:43.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:45:43.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:45:43.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:45:46.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:45:46.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:45:46.466 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:45:46.466 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:45:46.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:45:46.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:45:46.488 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:45:46.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:45:46.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:45:46.490 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:45:46.490 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:45:46.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:45:46.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:45:46.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:45:46.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:45:46.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:45:46.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:45:46.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:45:46.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:45:46.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:45:46.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:45:46.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:45:46.827 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:45:46.897 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:45:29
2026-06-04T07:45:46.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88317, datetime.datetime(2026, 6, 4, 7, 45, 29), datetime.datetime(2026, 6, 4, 7, 45, 28), 'salt', 1.63, 100.61, None, 32.04, 152.91, -0.09, 821.78, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:45:46.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:45:46.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:45:46.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:45:28, diff=18.905464s, valid=True
2026-06-04T07:45:46.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:45:46.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:45:46.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:45:12, diff=34.909093s, valid=True
2026-06-04T07:45:46.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:45:46.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:45:46.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:45:22, diff=24.917563s, valid=True
2026-06-04T07:45:46.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:45:46.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:45:46.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:45:46.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:45:46.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:45:46.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:45:46.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:45:12, diff=34.921438s, valid=True
2026-06-04T07:45:46.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:45:46.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:45:46.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:45:46.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126143.922297s, valid=True
2026-06-04T07:45:46.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:45:46.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:45:46.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:45:46.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:45:46.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:45:46.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:45:46.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:45:46.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:45:47.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:45:47.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:45:47.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:45:47.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:45:47.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:45:47.251 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:45:47.454 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:45:47.794 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:45:47.896 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:45:47.896 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:45:47.896 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:45:48.188 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:45:48.948 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:46:18.978 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:46:18.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:46:18.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:46:19.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:46:19.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:46:19.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:46:19.634 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:46:19.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:46:19.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:46:19.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:46:19.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:46:19.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:46:19.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:46:22.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:46:22.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:46:22.337 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:46:22.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:46:22.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:46:22.363 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:46:22.363 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:46:22.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:46:22.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:46:22.365 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:46:22.365 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:46:22.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:46:22.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:46:22.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:46:22.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:46:22.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:46:22.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:46:22.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:46:22.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:46:22.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:46:22.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:46:22.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:46:22.703 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:46:22.774 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:45:59
2026-06-04T07:46:22.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88318, datetime.datetime(2026, 6, 4, 7, 45, 59), datetime.datetime(2026, 6, 4, 7, 45, 58), 'salt', 1.73, 100.68, None, 29.99, 162.5, -0.1, 821.78, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:46:22.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:46:22.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:46:22.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:45:58, diff=24.782008s, valid=True
2026-06-04T07:46:22.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:46:22.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:46:22.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:46:12, diff=10.785481s, valid=True
2026-06-04T07:46:22.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:46:22.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:46:22.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:45:53, diff=29.793667s, valid=True
2026-06-04T07:46:22.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:46:22.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:46:22.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:46:22.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:46:22.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:46:22.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:46:22.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:46:12, diff=10.797425s, valid=True
2026-06-04T07:46:22.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:46:22.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:46:22.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:46:22.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126179.798239s, valid=True
2026-06-04T07:46:22.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:46:22.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:46:22.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:46:22.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:46:22.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:46:22.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:46:22.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:46:22.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:46:22.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:46:22.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:46:22.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:46:23.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:46:23.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:46:23.190 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:46:23.385 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:46:23.719 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:46:23.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:46:23.819 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:46:23.819 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:46:24.011 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:46:24.066 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:46:54.085 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:46:54.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:46:54.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:46:54.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:46:54.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:46:54.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:46:54.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:46:54.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:46:54.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:46:54.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:46:54.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:46:54.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:46:54.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:46:57.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:46:57.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:46:57.224 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:46:57.224 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:46:57.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:46:57.247 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:46:57.248 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:46:57.248 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:46:57.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:46:57.249 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:46:57.249 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:46:57.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:46:57.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:46:57.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:46:57.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:46:57.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:46:57.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:46:57.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:46:57.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:46:57.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:46:57.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:46:57.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:46:57.595 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:46:57.671 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:46:29
2026-06-04T07:46:57.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88319, datetime.datetime(2026, 6, 4, 7, 46, 29), datetime.datetime(2026, 6, 4, 7, 46, 28), 'salt', 1.8, 100.78, None, 27.17, 157.26, -0.11, 821.84, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:46:57.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:46:57.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:46:57.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:46:28, diff=29.678695s, valid=True
2026-06-04T07:46:57.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:46:57.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:46:57.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:46:12, diff=45.682229s, valid=True
2026-06-04T07:46:57.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:46:57.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:46:57.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:46:23, diff=34.691044s, valid=True
2026-06-04T07:46:57.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:46:57.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:46:57.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:46:57.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:46:57.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:46:57.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:46:57.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:46:12, diff=45.694938s, valid=True
2026-06-04T07:46:57.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:46:57.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:46:57.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:46:57.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126214.695827s, valid=True
2026-06-04T07:46:57.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:46:57.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:46:57.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:46:57.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:46:57.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:46:57.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:46:57.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:46:57.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:46:57.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:46:57.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:46:57.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:46:57.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:46:57.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:46:58.023 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:46:58.224 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:46:58.558 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:46:58.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:46:58.658 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:46:58.658 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:46:58.905 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:46:58.905 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:47:28.935 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:47:28.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:47:28.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:47:29.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:47:29.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:47:29.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:47:29.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:47:29.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:47:29.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:47:29.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:47:29.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:47:29.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:47:29.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:47:32.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:47:32.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:47:32.612 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:47:32.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:47:32.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:47:32.634 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:47:32.635 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:47:32.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:47:32.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:47:32.636 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:47:32.636 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:47:32.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:47:32.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-06-04T07:47:32.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:47:32.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-06-04T07:47:32.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:47:33.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:47:33.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:47:33.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:47:33.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:47:33.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:47:33.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:47:33.066 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:47:33.137 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:47:30
2026-06-04T07:47:33.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88321, datetime.datetime(2026, 6, 4, 7, 47, 30), datetime.datetime(2026, 6, 4, 7, 47, 29), 'salt', 1.87, 100.74, None, 28.69, 156.08, -0.1, 821.78, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:47:33.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:47:33.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-06-04T07:47:33.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:47:29, diff=4.143285s, valid=True
2026-06-04T07:47:33.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:47:33.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:47:33.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:47:12, diff=21.146079s, valid=True
2026-06-04T07:47:33.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:47:33.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-06-04T07:47:33.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:47:23, diff=10.152608s, valid=True
2026-06-04T07:47:33.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:47:33.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:47:33.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:47:33.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:47:33.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:47:33.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:47:33.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:47:12, diff=21.155588s, valid=True
2026-06-04T07:47:33.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:47:33.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:47:33.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:47:33.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126250.156239s, valid=True
2026-06-04T07:47:33.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:47:33.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:47:33.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:47:33.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:47:33.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:47:33.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:47:33.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:47:33.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:47:33.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:47:33.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:47:33.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:47:33.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:47:33.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:47:33.543 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:47:33.744 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:47:34.080 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:47:34.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:47:34.180 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:47:34.180 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:47:34.369 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:47:34.369 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:48:04.399 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:48:04.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:48:04.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:48:04.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:48:04.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:48:05.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:48:05.081 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:48:05.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:48:05.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:48:05.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:48:05.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:48:05.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:48:05.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:48:07.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:48:07.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:48:07.774 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:48:07.774 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:48:07.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:48:07.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:48:07.798 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:48:07.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:48:07.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:48:07.799 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:48:07.799 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:48:07.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:48:07.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:48:07.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:48:08.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:48:08.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:48:08.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:48:08.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:48:08.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:48:08.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:48:08.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:48:08.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:48:08.167 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:48:08.253 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:48:00
2026-06-04T07:48:08.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88322, datetime.datetime(2026, 6, 4, 7, 48), datetime.datetime(2026, 6, 4, 7, 47, 59), 'salt', 1.87, 100.74, None, 27.2, 152.65, -0.1, 821.66, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:48:08.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:48:08.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:48:08.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:47:59, diff=9.261044s, valid=True
2026-06-04T07:48:08.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:48:08.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:48:08.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:48:12, diff=-3.735307s, valid=True
2026-06-04T07:48:08.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:48:08.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:48:08.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:47:54, diff=14.273227s, valid=True
2026-06-04T07:48:08.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:48:08.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:48:08.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:48:08.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:48:08.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:48:08.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:48:08.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:48:12, diff=-3.722839s, valid=True
2026-06-04T07:48:08.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:48:08.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:48:08.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:48:08.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126285.278019s, valid=True
2026-06-04T07:48:08.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:48:08.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:48:08.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:48:08.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:48:08.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:48:08.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:48:08.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:48:08.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:48:08.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:48:08.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:48:08.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:48:08.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:48:08.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:48:08.598 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:48:08.799 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:48:09.131 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:48:09.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:48:09.230 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:48:09.230 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:48:09.494 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:48:09.494 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:48:39.524 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:48:39.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:48:39.525 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:48:39.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:48:39.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:48:39.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:48:39.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:48:39.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:48:39.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:48:39.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:48:39.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:48:39.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:48:39.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:48:42.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:48:42.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:48:42.633 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:48:42.633 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:48:42.645 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:48:42.657 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:48:42.658 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:48:42.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:48:42.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:48:42.659 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:48:42.659 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:48:42.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:48:42.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:48:42.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:48:42.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:48:42.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:48:42.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:48:42.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:48:42.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:48:42.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:48:42.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:48:42.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:48:42.992 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:48:43.069 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:48:30
2026-06-04T07:48:43.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88323, datetime.datetime(2026, 6, 4, 7, 48, 30), datetime.datetime(2026, 6, 4, 7, 48, 29), 'salt', 1.87, 100.78, None, 28.23, 164.68, -0.11, 821.96, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:48:43.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:48:43.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:48:43.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:48:29, diff=14.076896s, valid=True
2026-06-04T07:48:43.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:48:43.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:48:43.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:48:12, diff=31.080372s, valid=True
2026-06-04T07:48:43.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:48:43.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:48:43.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:48:24, diff=19.08855s, valid=True
2026-06-04T07:48:43.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:48:43.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:48:43.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:48:43.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:48:43.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:48:43.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:48:43.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:48:12, diff=31.092311s, valid=True
2026-06-04T07:48:43.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:48:43.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:48:43.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:48:43.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126320.093158s, valid=True
2026-06-04T07:48:43.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:48:43.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:48:43.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:48:43.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:48:43.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:48:43.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:48:43.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:48:43.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:48:43.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:48:43.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:48:43.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:48:43.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:48:43.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:48:43.482 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:48:43.680 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:48:44.014 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:48:44.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:48:44.114 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:48:44.115 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:48:44.300 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:48:44.300 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:49:14.319 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:49:14.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:49:14.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:49:14.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:49:14.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:49:14.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:49:14.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:49:14.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:49:14.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:49:14.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:49:14.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:49:14.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:49:14.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:49:17.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:49:17.648 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:49:17.649 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:49:17.649 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:49:17.659 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:49:17.672 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:49:17.672 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:49:17.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:49:17.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:49:17.674 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:49:17.674 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:49:17.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:49:17.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:49:17.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:49:17.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:49:17.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:49:17.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:49:17.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:49:18.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:49:18.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:49:18.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:49:18.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:49:18.022 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:49:18.102 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:49:00
2026-06-04T07:49:18.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88324, datetime.datetime(2026, 6, 4, 7, 49), datetime.datetime(2026, 6, 4, 7, 49), 'salt', 1.9, 100.74, None, 26.68, 159.44, -0.1, 822.02, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:49:18.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:49:18.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:49:18.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:49:00, diff=18.110542s, valid=True
2026-06-04T07:49:18.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:49:18.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:49:18.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:49:12, diff=6.114107s, valid=True
2026-06-04T07:49:18.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:49:18.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:49:18.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:48:54, diff=24.122515s, valid=True
2026-06-04T07:49:18.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:49:18.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:49:18.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:49:18.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:49:18.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:49:18.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:49:18.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:49:12, diff=6.12624s, valid=True
2026-06-04T07:49:18.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:49:18.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:49:18.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:49:18.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126355.127052s, valid=True
2026-06-04T07:49:18.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:49:18.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:49:18.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:49:18.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:49:18.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:49:18.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:49:18.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:49:18.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:49:18.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:49:18.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:49:18.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:49:18.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:49:18.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:49:18.448 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:49:18.644 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:49:19.009 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:49:19.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:49:19.108 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:49:19.108 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:49:19.365 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:49:19.366 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:49:49.367 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:49:49.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:49:49.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:49:49.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:49:49.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:49:49.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:49:49.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:49:49.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:49:49.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:49:49.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:49:49.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:49:49.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:49:49.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:49:52.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:49:52.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:49:52.489 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:49:52.489 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:49:52.499 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:49:52.511 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:49:52.512 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:49:52.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:49:52.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:49:52.513 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:49:52.513 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:49:52.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:49:52.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:49:52.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:49:52.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:49:52.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:49:52.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:49:52.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:49:52.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:49:52.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:49:52.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:49:52.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:49:52.863 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:49:52.941 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:49:31
2026-06-04T07:49:52.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88325, datetime.datetime(2026, 6, 4, 7, 49, 31), datetime.datetime(2026, 6, 4, 7, 49, 30), 'salt', 1.87, 100.71, None, 25.86, 160.43, -0.1, 821.96, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:49:52.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:49:52.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:49:52.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:49:30, diff=22.949401s, valid=True
2026-06-04T07:49:52.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:49:52.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:49:52.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:49:12, diff=40.952891s, valid=True
2026-06-04T07:49:52.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:49:52.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:49:52.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:49:24, diff=28.961011s, valid=True
2026-06-04T07:49:52.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:49:52.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:49:52.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:49:52.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:49:52.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:49:52.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:49:52.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:49:12, diff=40.964744s, valid=True
2026-06-04T07:49:52.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:49:52.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:49:52.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:49:52.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126389.965534s, valid=True
2026-06-04T07:49:52.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:49:52.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:49:52.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:49:52.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:49:52.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:49:53.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:49:53.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:49:53.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:49:53.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:49:53.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:49:53.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:49:53.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:49:53.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:49:53.285 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:49:53.489 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:49:53.831 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:49:53.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:49:53.932 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:49:53.932 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:49:54.116 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:49:54.116 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:50:24.146 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:50:24.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:50:24.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:50:24.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:50:24.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:50:24.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:50:24.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:50:24.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:50:24.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:50:24.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:50:24.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:50:24.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:50:24.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:50:27.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:50:27.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:50:27.335 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:50:27.335 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:50:27.346 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:50:27.358 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:50:27.359 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:50:27.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:50:27.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:50:27.360 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:50:27.360 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:50:27.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:50:27.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:50:27.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:50:27.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:50:27.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:50:27.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:50:27.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:50:27.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:50:27.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:50:27.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:50:27.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:50:27.718 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:50:27.807 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:50:01
2026-06-04T07:50:27.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88326, datetime.datetime(2026, 6, 4, 7, 50, 1), datetime.datetime(2026, 6, 4, 7, 50), 'salt', 1.8, 100.64, None, 29.78, 154.77, -0.09, 821.84, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:50:27.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:50:27.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:50:27.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:50:00, diff=27.814837s, valid=True
2026-06-04T07:50:27.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:50:27.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:50:27.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:50:12, diff=15.818371s, valid=True
2026-06-04T07:50:27.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:50:27.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:50:27.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:49:55, diff=32.826701s, valid=True
2026-06-04T07:50:27.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:50:27.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:50:27.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:50:27.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:50:27.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:50:27.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:50:27.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:50:12, diff=15.830463s, valid=True
2026-06-04T07:50:27.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:50:27.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:50:27.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:50:27.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126424.831311s, valid=True
2026-06-04T07:50:27.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:50:27.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:50:27.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:50:27.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:50:27.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:50:27.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:50:27.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:50:27.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:50:27.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:50:27.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:50:28.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:50:28.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:50:28.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:50:28.152 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:50:28.357 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:50:28.754 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:50:28.856 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:50:28.856 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:50:28.857 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:50:28.940 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:50:28.941 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:50:58.960 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:50:58.960 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:50:58.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:50:59.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:50:59.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:50:59.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:50:59.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:50:59.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:50:59.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:50:59.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:50:59.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:50:59.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:50:59.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:51:02.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:51:02.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:51:02.287 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:51:02.287 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:51:02.297 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:51:02.310 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:51:02.310 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:51:02.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:51:02.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:51:02.312 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:51:02.312 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:51:02.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:51:02.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-06-04T07:51:02.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:51:02.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-06-04T07:51:02.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:51:02.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T07:51:02.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:51:02.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T07:51:02.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:51:02.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:51:02.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:51:02.667 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:51:02.742 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:51:01
2026-06-04T07:51:02.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88328, datetime.datetime(2026, 6, 4, 7, 51, 1), datetime.datetime(2026, 6, 4, 7, 51, 1), 'salt', 1.87, 100.74, None, 30.63, 158.5, -0.1, 821.84, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:51:02.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:51:02.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-06-04T07:51:02.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:51:01, diff=1.748731s, valid=True
2026-06-04T07:51:02.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:51:02.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T07:51:02.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:51:12, diff=-9.248407s, valid=True
2026-06-04T07:51:02.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:51:02.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-06-04T07:51:02.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:50:55, diff=7.759714s, valid=True
2026-06-04T07:51:02.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:51:02.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:51:02.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:51:02.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:51:02.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:51:02.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T07:51:02.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:51:12, diff=-9.236512s, valid=True
2026-06-04T07:51:02.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:51:02.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:51:02.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:51:02.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126459.764326s, valid=True
2026-06-04T07:51:02.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:51:02.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:51:02.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:51:02.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:51:02.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:51:02.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:51:02.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:51:02.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:51:02.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:51:02.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:51:02.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:51:02.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:51:03.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:51:03.085 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:51:03.290 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:51:03.634 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:51:03.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:51:03.736 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:51:03.736 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:51:03.997 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:51:03.997 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:51:34.027 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:51:34.027 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:51:34.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:51:34.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:51:34.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:51:34.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:51:34.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:51:34.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:51:34.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:51:34.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:51:34.619 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:51:34.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:51:34.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:51:37.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:51:37.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:51:37.530 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:51:37.530 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:51:37.541 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:51:37.553 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:51:37.554 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:51:37.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:51:37.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:51:37.555 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:51:37.555 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:51:37.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:51:37.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:51:37.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:51:37.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:51:37.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:51:37.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:51:37.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:51:37.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:51:37.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:51:37.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:51:37.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:51:37.907 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:51:37.981 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:51:32
2026-06-04T07:51:37.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88329, datetime.datetime(2026, 6, 4, 7, 51, 32), datetime.datetime(2026, 6, 4, 7, 51, 31), 'salt', 1.9, 100.74, None, 30.84, 151.24, -0.1, 821.9, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:51:37.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:51:37.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:51:37.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:51:31, diff=6.989189s, valid=True
2026-06-04T07:51:37.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:51:37.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:51:37.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:51:12, diff=25.992716s, valid=True
2026-06-04T07:51:37.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:51:37.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:51:38.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:51:28, diff=10.000961s, valid=True
2026-06-04T07:51:38.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:51:38.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:51:38.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:51:38.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:51:38.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:51:38.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:51:38.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:51:12, diff=26.004709s, valid=True
2026-06-04T07:51:38.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:51:38.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:51:38.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:51:38.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126495.005506s, valid=True
2026-06-04T07:51:38.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:51:38.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:51:38.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:51:38.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:51:38.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:51:38.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:51:38.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:51:38.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:51:38.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:51:38.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:51:38.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:51:38.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:51:38.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:51:38.406 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:51:38.612 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:51:38.982 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:51:39.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:51:39.083 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:51:39.083 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:51:39.235 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:51:39.235 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:52:09.239 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:52:09.240 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:52:09.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:52:09.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:52:09.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:52:09.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:52:09.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:52:09.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:52:09.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:52:09.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:52:09.661 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:52:09.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:52:09.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:52:12.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:52:12.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:52:12.239 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:52:12.239 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:52:12.255 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:52:12.271 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:52:12.271 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:52:12.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:52:12.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:52:12.272 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:52:12.273 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:52:12.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:52:12.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:52:12.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:52:12.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:52:12.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:52:12.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:52:12.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:52:12.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:52:12.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:52:12.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:52:12.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:52:12.637 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:52:12.714 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:52:02
2026-06-04T07:52:12.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88330, datetime.datetime(2026, 6, 4, 7, 52, 2), datetime.datetime(2026, 6, 4, 7, 52, 1), 'salt', 1.87, 100.71, None, 29.89, 159.82, -0.1, 821.84, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:52:12.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:52:12.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:52:12.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:52:01, diff=11.722471s, valid=True
2026-06-04T07:52:12.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:52:12.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:52:12.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:52:12, diff=0.726064s, valid=True
2026-06-04T07:52:12.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:52:12.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:52:12.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:51:56, diff=16.734446s, valid=True
2026-06-04T07:52:12.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:52:12.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:52:12.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:52:12.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:52:12.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:52:12.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:52:12.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:52:12, diff=0.738245s, valid=True
2026-06-04T07:52:12.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:52:12.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:52:12.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:52:12.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126529.739064s, valid=True
2026-06-04T07:52:12.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:52:12.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:52:12.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:52:12.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:52:12.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:52:12.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:52:12.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:52:12.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:52:12.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:52:12.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:52:12.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:52:12.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:52:13.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:52:13.065 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:52:13.270 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:52:13.610 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:52:13.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:52:13.712 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:52:13.712 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:52:13.920 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:52:13.920 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:52:43.947 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:52:43.947 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:52:43.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:52:44.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:52:44.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:52:44.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:52:44.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:52:44.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:52:44.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:52:44.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:52:44.587 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:52:44.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:52:44.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:52:47.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:52:47.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:52:47.287 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:52:47.287 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:52:47.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:52:47.312 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:52:47.313 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:52:47.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:52:47.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:52:47.314 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:52:47.314 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:52:47.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:52:47.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:52:47.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:52:47.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:52:47.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:52:47.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:52:47.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:52:47.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T07:52:47.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:52:47.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:52:47.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:52:47.707 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:52:47.783 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:52:32
2026-06-04T07:52:47.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88331, datetime.datetime(2026, 6, 4, 7, 52, 32), datetime.datetime(2026, 6, 4, 7, 52, 31), 'salt', 1.87, 100.71, None, 29.32, 167.69, -0.1, 821.84, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:52:47.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:52:47.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:52:47.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:52:31, diff=16.790818s, valid=True
2026-06-04T07:52:47.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:52:47.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:52:47.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:52:12, diff=35.794413s, valid=True
2026-06-04T07:52:47.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:52:47.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:52:47.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:52:26, diff=21.802873s, valid=True
2026-06-04T07:52:47.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:52:47.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:52:47.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:52:47.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:52:47.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:52:47.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T07:52:47.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:52:12, diff=35.806721s, valid=True
2026-06-04T07:52:47.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:52:47.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:52:47.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:52:47.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126564.807595s, valid=True
2026-06-04T07:52:47.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:52:47.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:52:47.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:52:47.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:52:47.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:52:47.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:52:47.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:52:47.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:52:47.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:52:47.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:52:48.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:52:48.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:52:48.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:52:48.202 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:52:48.405 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:52:48.746 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:52:48.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:52:48.847 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:52:48.847 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:52:48.933 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:52:48.933 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:53:18.939 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:53:18.939 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:53:18.940 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:53:19.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:53:19.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:53:19.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:53:19.363 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:53:19.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:53:19.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:53:19.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:53:19.387 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:53:19.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:53:19.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:53:22.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:53:22.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:53:22.230 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:53:22.231 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:53:22.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:53:22.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:53:22.259 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:53:22.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:53:22.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:53:22.261 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:53:22.261 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:53:22.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:53:22.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:53:22.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:53:22.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:53:22.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:53:22.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T07:53:22.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:53:22.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T07:53:22.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:53:22.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:53:22.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:53:22.607 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:53:22.680 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:53:02
2026-06-04T07:53:22.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88332, datetime.datetime(2026, 6, 4, 7, 53, 2), datetime.datetime(2026, 6, 4, 7, 53, 2), 'salt', 1.83, 100.61, None, 27.73, 144.27, -0.09, 821.96, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:53:22.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:53:22.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:53:22.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:53:02, diff=20.687702s, valid=True
2026-06-04T07:53:22.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:53:22.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T07:53:22.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:52:12, diff=70.691191s, valid=True
2026-06-04T07:53:22.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:53:22.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:53:22.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:52:57, diff=25.699305s, valid=True
2026-06-04T07:53:22.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:53:22.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:53:22.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:53:22.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:53:22.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:53:22.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T07:53:22.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:52:12, diff=70.70306s, valid=True
2026-06-04T07:53:22.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:53:22.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:53:22.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:53:22.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126599.703882s, valid=True
2026-06-04T07:53:22.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:53:22.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:53:22.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:53:22.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:53:22.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:53:22.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:53:22.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:53:22.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:53:22.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:53:22.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:53:22.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:53:22.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:53:22.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:53:23.025 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:53:23.228 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:53:23.569 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:53:23.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:53:23.670 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:53:23.670 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:53:23.911 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:53:23.911 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:53:53.930 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:53:53.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:53:53.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:53:54.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:53:54.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:53:54.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:53:54.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:53:54.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:53:54.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:53:54.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:53:54.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:53:54.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:53:54.726 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:53:57.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:53:57.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:53:57.261 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:53:57.261 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:53:57.270 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:53:57.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:53:57.284 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:53:57.284 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:53:57.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:53:57.285 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:53:57.285 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:53:57.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:53:57.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:53:57.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:53:57.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:53:57.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:53:57.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T07:53:57.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:53:57.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T07:53:57.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:53:57.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:53:57.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:53:57.625 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:53:57.697 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:53:33
2026-06-04T07:53:57.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88333, datetime.datetime(2026, 6, 4, 7, 53, 33), datetime.datetime(2026, 6, 4, 7, 53, 32), 'salt', 1.83, 100.61, None, 28.72, 149.29, -0.09, 821.9, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:53:57.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:53:57.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:53:57.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:53:32, diff=25.704613s, valid=True
2026-06-04T07:53:57.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:53:57.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T07:53:57.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:52:12, diff=105.708118s, valid=True
2026-06-04T07:53:57.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:53:57.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:53:57.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:53:27, diff=30.716424s, valid=True
2026-06-04T07:53:57.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:53:57.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:53:57.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:53:57.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:53:57.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:53:57.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T07:53:57.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:52:12, diff=105.720171s, valid=True
2026-06-04T07:53:57.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:53:57.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:53:57.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:53:57.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126634.721003s, valid=True
2026-06-04T07:53:57.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:53:57.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:53:57.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:53:57.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:53:57.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:53:57.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:53:57.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:53:57.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:53:57.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:53:57.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:53:57.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:53:58.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:53:58.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:53:58.109 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:53:58.317 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:53:58.662 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:53:58.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:53:58.765 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:53:58.765 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:53:58.965 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:53:58.966 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:54:28.996 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:54:28.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:54:28.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:54:29.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:54:29.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:54:29.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:54:29.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:54:29.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:54:29.396 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:54:29.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:54:29.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:54:29.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:54:29.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:54:32.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:54:32.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:54:32.333 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:54:32.333 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:54:32.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:54:32.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:54:32.353 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:54:32.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:54:32.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:54:32.354 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:54:32.354 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:54:32.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:54:32.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:54:32.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:54:32.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:54:32.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:54:32.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T07:54:32.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:54:32.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T07:54:32.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:54:32.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:54:32.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:54:32.640 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:54:32.711 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:54:03
2026-06-04T07:54:32.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88334, datetime.datetime(2026, 6, 4, 7, 54, 3), datetime.datetime(2026, 6, 4, 7, 54, 2), 'salt', 1.93, 100.74, None, 35.6, 147.37, -0.11, 821.84, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:54:32.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:54:32.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:54:32.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:54:02, diff=30.718696s, valid=True
2026-06-04T07:54:32.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:54:32.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T07:54:32.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:52:12, diff=140.72182s, valid=True
2026-06-04T07:54:32.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:54:32.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:54:32.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:53:57, diff=35.729045s, valid=True
2026-06-04T07:54:32.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:54:32.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:54:32.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:54:32.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:54:32.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:54:32.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T07:54:32.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:52:12, diff=140.732122s, valid=True
2026-06-04T07:54:32.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:54:32.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:54:32.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:54:32.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126669.732794s, valid=True
2026-06-04T07:54:32.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:54:32.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:54:32.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:54:32.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:54:32.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:54:32.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:54:32.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:54:32.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:54:32.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:54:32.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:54:32.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:54:32.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:54:33.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:54:33.058 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:54:33.262 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:54:33.602 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:54:33.703 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:54:33.703 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:54:33.703 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:54:33.962 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:54:33.963 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:55:03.963 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:55:03.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:55:03.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:55:04.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:55:04.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:55:04.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:55:04.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:55:04.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:55:04.387 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:55:04.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:55:04.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:55:04.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:55:04.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:55:07.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:55:07.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:55:07.225 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:55:07.225 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:55:07.233 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:55:07.245 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:55:07.245 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:55:07.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:55:07.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:55:07.245 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:55:07.246 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:55:07.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:55:07.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:55:07.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:55:07.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:55:07.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:55:07.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T07:55:07.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:55:07.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T07:55:07.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:55:07.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:55:07.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:55:07.564 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:55:07.637 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:55:03
2026-06-04T07:55:07.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88336, datetime.datetime(2026, 6, 4, 7, 55, 3), datetime.datetime(2026, 6, 4, 7, 55, 2), 'salt', 1.9, 100.74, None, 31.86, 158.22, -0.1, 821.84, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:55:07.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:55:07.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:55:07.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:55:02, diff=5.644633s, valid=True
2026-06-04T07:55:07.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:55:07.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T07:55:07.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:52:12, diff=175.648009s, valid=True
2026-06-04T07:55:07.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:55:07.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:55:07.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:54:57, diff=10.655836s, valid=True
2026-06-04T07:55:07.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:55:07.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:55:07.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:55:07.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:55:07.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:55:07.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T07:55:07.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:52:12, diff=175.6594s, valid=True
2026-06-04T07:55:07.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:55:07.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:55:07.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:55:07.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126704.660175s, valid=True
2026-06-04T07:55:07.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:55:07.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:55:07.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:55:07.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:55:07.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:55:07.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:55:07.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:55:07.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:55:07.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:55:07.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:55:07.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:55:07.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:55:07.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:55:07.985 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:55:08.190 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:55:08.548 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:55:08.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:55:08.649 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:55:08.649 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:55:08.829 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:55:08.830 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:55:38.850 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:55:38.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:55:38.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:55:39.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:55:39.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:55:39.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:55:39.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:55:39.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:55:39.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:55:39.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:55:39.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:55:39.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:55:39.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:55:42.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:55:42.145 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:55:42.145 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:55:42.146 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:55:42.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:55:42.170 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:55:42.171 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:55:42.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:55:42.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:55:42.172 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:55:42.172 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:55:42.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:55:42.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:55:42.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:55:42.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:55:42.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:55:42.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T07:55:42.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:55:42.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T07:55:42.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:55:42.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:55:42.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:55:42.510 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:55:42.581 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:55:34
2026-06-04T07:55:42.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88337, datetime.datetime(2026, 6, 4, 7, 55, 34), datetime.datetime(2026, 6, 4, 7, 55, 33), 'salt', 1.87, 100.71, None, 26.32, 164.96, -0.1, 821.78, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:55:42.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:55:42.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:55:42.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:55:33, diff=9.589466s, valid=True
2026-06-04T07:55:42.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:55:42.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T07:55:42.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:56:12, diff=-29.406877s, valid=True
2026-06-04T07:55:42.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:55:42.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:55:42.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:55:28, diff=14.6015s, valid=True
2026-06-04T07:55:42.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:55:42.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:55:42.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:55:42.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:55:42.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:55:42.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T07:55:42.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:56:12, diff=-29.394653s, valid=True
2026-06-04T07:55:42.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:55:42.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:55:42.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:55:42.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126739.60619s, valid=True
2026-06-04T07:55:42.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:55:42.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:55:42.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:55:42.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:55:42.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:55:42.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:55:42.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:55:42.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:55:42.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:55:42.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:55:42.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:55:42.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:55:42.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:55:42.928 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:55:43.130 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:55:43.469 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:55:43.628 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:55:43.628 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:55:43.628 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:55:43.811 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:55:43.811 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:56:13.842 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:56:13.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:56:13.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:56:13.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:56:14.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:56:14.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:56:14.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:56:14.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:56:14.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:56:14.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:56:14.268 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:56:14.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:56:14.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:56:17.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:56:17.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:56:17.220 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:56:17.220 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:56:17.232 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:56:17.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:56:17.245 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:56:17.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:56:17.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:56:17.246 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:56:17.246 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:56:17.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:56:17.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:56:17.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:56:17.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:56:17.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:56:17.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T07:56:17.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:56:17.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T07:56:17.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:56:17.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:56:17.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:56:17.576 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:56:17.650 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:56:04
2026-06-04T07:56:17.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88338, datetime.datetime(2026, 6, 4, 7, 56, 4), datetime.datetime(2026, 6, 4, 7, 56, 3), 'salt', 1.93, 100.68, None, 28.05, 164.63, -0.1, 821.9, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:56:17.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:56:17.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:56:17.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:56:03, diff=14.657399s, valid=True
2026-06-04T07:56:17.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:56:17.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T07:56:17.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:56:12, diff=5.660871s, valid=True
2026-06-04T07:56:17.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:56:17.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:56:17.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:55:58, diff=19.669118s, valid=True
2026-06-04T07:56:17.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:56:17.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:56:17.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:56:17.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:56:17.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:56:17.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T07:56:17.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:56:12, diff=5.672848s, valid=True
2026-06-04T07:56:17.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:56:17.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:56:17.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:56:17.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126774.673663s, valid=True
2026-06-04T07:56:17.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:56:17.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:56:17.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:56:17.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:56:17.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:56:17.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:56:17.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:56:17.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:56:17.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:56:17.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:56:17.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:56:17.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:56:17.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:56:17.992 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:56:18.196 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:56:18.535 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:56:18.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:56:18.636 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:56:18.636 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:56:18.823 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:56:18.824 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:56:48.854 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:56:48.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:56:48.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:56:49.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:56:49.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:56:49.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:56:49.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:56:49.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:56:49.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:56:49.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:56:49.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:56:49.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:56:49.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:56:52.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:56:52.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:56:52.012 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:56:52.013 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:56:52.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:56:52.034 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:56:52.035 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:56:52.036 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:56:52.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:56:52.036 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:56:52.036 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:56:52.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:56:52.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:56:52.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:56:52.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:56:52.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:56:52.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T07:56:52.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:56:52.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T07:56:52.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:56:52.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:56:52.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:56:52.371 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:56:52.442 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:56:34
2026-06-04T07:56:52.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88339, datetime.datetime(2026, 6, 4, 7, 56, 34), datetime.datetime(2026, 6, 4, 7, 56, 34), 'salt', 1.87, 100.64, None, 28.69, 169.73, -0.09, 821.96, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:56:52.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:56:52.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:56:52.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:56:34, diff=18.449987s, valid=True
2026-06-04T07:56:52.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:56:52.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T07:56:52.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:57:12, diff=-19.546342s, valid=True
2026-06-04T07:56:52.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:56:52.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:56:52.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:56:32, diff=20.462211s, valid=True
2026-06-04T07:56:52.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:56:52.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:56:52.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:56:52.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:56:52.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:56:52.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T07:56:52.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:57:12, diff=-19.533892s, valid=True
2026-06-04T07:56:52.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:56:52.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:56:52.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:56:52.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126809.46695s, valid=True
2026-06-04T07:56:52.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:56:52.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:56:52.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:56:52.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:56:52.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:56:52.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:56:52.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:56:52.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:56:52.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:56:52.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:56:52.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:56:52.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:56:52.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:56:52.787 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:56:53.063 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:56:53.403 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:56:53.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:56:53.504 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:56:53.504 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:56:53.685 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:56:53.686 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:57:23.716 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:57:23.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:57:23.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:57:24.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:57:24.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:57:24.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:57:24.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:57:24.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:57:24.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:57:24.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:57:24.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:57:24.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:57:24.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:57:26.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:57:26.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:57:26.989 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:57:26.990 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:57:27.000 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:57:27.013 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:57:27.013 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:57:27.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:57:27.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:57:27.015 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:57:27.015 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:57:27.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:57:27.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:57:27.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:57:27.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:57:27.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:57:27.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T07:57:27.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:57:27.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T07:57:27.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:57:27.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:57:27.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:57:27.345 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:57:27.417 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:57:05
2026-06-04T07:57:27.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88340, datetime.datetime(2026, 6, 4, 7, 57, 5), datetime.datetime(2026, 6, 4, 7, 57, 4), 'salt', 1.97, 100.68, None, 39.06, 164.59, -0.09, 821.9, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:57:27.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:57:27.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:57:27.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:57:04, diff=23.424731s, valid=True
2026-06-04T07:57:27.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:57:27.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T07:57:27.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:57:12, diff=15.428354s, valid=True
2026-06-04T07:57:27.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:57:27.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:57:27.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:56:58, diff=29.436615s, valid=True
2026-06-04T07:57:27.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:57:27.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:57:27.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:57:27.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:57:27.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:57:27.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T07:57:27.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:57:12, diff=15.440358s, valid=True
2026-06-04T07:57:27.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:57:27.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:57:27.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:57:27.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126844.441178s, valid=True
2026-06-04T07:57:27.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:57:27.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:57:27.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:57:27.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:57:27.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:57:27.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:57:27.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:57:27.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:57:27.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:57:27.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:57:27.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:57:27.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:57:27.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:57:27.761 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:57:27.964 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:57:28.305 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:57:28.409 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:57:28.409 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:57:28.409 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:57:28.593 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:57:28.593 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:57:58.622 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:57:58.622 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:57:58.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:57:59.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:57:59.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:57:59.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:57:59.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:57:59.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:57:59.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:57:59.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:57:59.387 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:57:59.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:57:59.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:58:01.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:58:01.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:58:01.939 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:58:01.939 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:58:01.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:58:01.963 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:58:01.964 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:58:01.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:58:01.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:58:01.966 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:58:01.966 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:58:01.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:58:02.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:58:02.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:58:02.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:58:02.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:58:02.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T07:58:02.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:58:02.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T07:58:02.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:58:02.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:58:02.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:58:02.300 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:58:02.371 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:57:35
2026-06-04T07:58:02.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88341, datetime.datetime(2026, 6, 4, 7, 57, 35), datetime.datetime(2026, 6, 4, 7, 57, 34), 'salt', 1.93, 100.74, None, 28.72, 161.25, -0.11, 821.9, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:58:02.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:58:02.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:58:02.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:57:34, diff=28.378884s, valid=True
2026-06-04T07:58:02.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:58:02.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T07:58:02.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:58:12, diff=-9.617645s, valid=True
2026-06-04T07:58:02.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:58:02.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:58:02.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:57:28, diff=34.390847s, valid=True
2026-06-04T07:58:02.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:58:02.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:58:02.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:58:02.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:58:02.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:58:02.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T07:58:02.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:58:12, diff=-9.605409s, valid=True
2026-06-04T07:58:02.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:58:02.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:58:02.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:58:02.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126879.395401s, valid=True
2026-06-04T07:58:02.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:58:02.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:58:02.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:58:02.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:58:02.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:58:02.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:58:02.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:58:02.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:58:02.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:58:02.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:58:02.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:58:02.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:58:02.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:58:02.795 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:58:02.999 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:58:03.338 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:58:03.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:58:03.439 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:58:03.439 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:58:03.608 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:58:03.608 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:58:33.638 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:58:33.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:58:33.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:58:34.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:58:34.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:58:34.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:58:34.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:58:34.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:58:34.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:58:34.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:58:34.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:58:34.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:58:34.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:58:36.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:58:36.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:58:36.942 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:58:36.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:58:36.953 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:58:36.966 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:58:36.966 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:58:36.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:58:36.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:58:36.967 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:58:36.968 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:58:36.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:58:37.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-06-04T07:58:37.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:58:37.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-06-04T07:58:37.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:58:37.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T07:58:37.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:58:37.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T07:58:37.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:58:37.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:58:37.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:58:37.298 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:58:37.370 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:58:35
2026-06-04T07:58:37.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88343, datetime.datetime(2026, 6, 4, 7, 58, 35), datetime.datetime(2026, 6, 4, 7, 58, 34), 'salt', 1.9, 100.68, None, 33.48, 159.18, -0.1, 821.96, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:58:37.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:58:37.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-06-04T07:58:37.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:58:34, diff=3.378048s, valid=True
2026-06-04T07:58:37.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:58:37.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T07:58:37.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:59:12, diff=-34.618528s, valid=True
2026-06-04T07:58:37.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:58:37.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-06-04T07:58:37.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:58:35, diff=2.389608s, valid=True
2026-06-04T07:58:37.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:58:37.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:58:37.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:58:37.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:58:37.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:58:37.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T07:58:37.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:59:12, diff=-34.606338s, valid=True
2026-06-04T07:58:37.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:58:37.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:58:37.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:58:37.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126914.394473s, valid=True
2026-06-04T07:58:37.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:58:37.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:58:37.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:58:37.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:58:37.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:58:37.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:58:37.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:58:37.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:58:37.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:58:37.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:58:37.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:58:37.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:58:37.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:58:37.720 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:58:37.931 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:58:38.382 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:58:38.484 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:58:38.484 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:58:38.485 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:58:38.642 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:58:38.643 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:59:08.673 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:59:08.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:59:08.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:59:08.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:59:09.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:59:09.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:59:09.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:59:09.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:59:09.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:59:09.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:59:09.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:59:09.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:59:09.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:59:12.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:59:12.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:59:12.191 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:59:12.191 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:59:12.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:59:12.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:59:12.214 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:59:12.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:59:12.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:59:12.215 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:59:12.215 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:59:12.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:59:12.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:59:12.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:59:12.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:59:12.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:59:12.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T07:59:12.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:59:12.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T07:59:12.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:59:12.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:59:12.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:59:12.554 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:59:12.629 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:59:05
2026-06-04T07:59:12.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88344, datetime.datetime(2026, 6, 4, 7, 59, 5), datetime.datetime(2026, 6, 4, 7, 59, 5), 'salt', 1.93, 100.78, None, 32.04, 166.32, -0.11, 821.84, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:59:12.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:59:12.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:59:12.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:59:05, diff=7.636781s, valid=True
2026-06-04T07:59:12.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:59:12.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T07:59:12.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:59:12, diff=0.64023s, valid=True
2026-06-04T07:59:12.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:59:12.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:59:12.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:58:59, diff=13.648394s, valid=True
2026-06-04T07:59:12.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:59:12.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:59:12.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:59:12.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:59:12.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:59:12.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T07:59:12.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:59:12, diff=0.652088s, valid=True
2026-06-04T07:59:12.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:59:12.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:59:12.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:59:12.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126949.652889s, valid=True
2026-06-04T07:59:12.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:59:12.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:59:12.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:59:12.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:59:12.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:59:12.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:59:12.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:59:12.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:59:12.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:59:12.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:59:12.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:59:12.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:59:13.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:59:13.046 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:59:13.250 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:59:13.592 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:59:13.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:59:13.693 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:59:13.693 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:59:13.947 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:59:13.947 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T07:59:43.966 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T07:59:43.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T07:59:43.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T07:59:44.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T07:59:44.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T07:59:44.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T07:59:44.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T07:59:44.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T07:59:44.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T07:59:44.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T07:59:44.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T07:59:44.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T07:59:44.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T07:59:47.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T07:59:47.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T07:59:47.153 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-03
2026-06-04T07:59:47.153 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T07:59:47.164 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-03
2026-06-04T07:59:47.177 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-03', '07:31', '17:38', '20:08', '10:10', 88, '19:05', '06:04')
2026-06-04T07:59:47.177 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T07:59:47.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T07:59:47.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T07:59:47.178 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T07:59:47.179 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T07:59:47.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T07:59:47.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T07:59:47.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T07:59:47.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T07:59:47.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:59:47.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T07:59:47.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T07:59:47.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T07:59:47.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T07:59:47.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T07:59:47.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T07:59:47.550 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T07:59:47.632 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 07:59:36
2026-06-04T07:59:47.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88345, datetime.datetime(2026, 6, 4, 7, 59, 36), datetime.datetime(2026, 6, 4, 7, 59, 35), 'salt', 1.87, 100.68, None, 28.26, 153.31, -0.09, 821.9, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T07:59:47.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T07:59:47.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T07:59:47.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:59:35, diff=12.639922s, valid=True
2026-06-04T07:59:47.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T07:59:47.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T07:59:47.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:00:12, diff=-24.356498s, valid=True
2026-06-04T07:59:47.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T07:59:47.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T07:59:47.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:59:29, diff=18.652016s, valid=True
2026-06-04T07:59:47.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T07:59:47.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:59:47.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T07:59:47.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T07:59:47.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T07:59:47.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T07:59:47.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:00:12, diff=-24.344092s, valid=True
2026-06-04T07:59:47.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T07:59:47.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T07:59:47.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T07:59:47.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=126984.656779s, valid=True
2026-06-04T07:59:47.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T07:59:47.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T07:59:47.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T07:59:47.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T07:59:47.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T07:59:47.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T07:59:47.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T07:59:47.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T07:59:47.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T07:59:47.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T07:59:47.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T07:59:47.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T07:59:47.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T07:59:47.978 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T07:59:48.195 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:59:48.544 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T07:59:48.645 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T07:59:48.645 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T07:59:48.645 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T07:59:48.828 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T07:59:48.829 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:00:18.850 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:00:18.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:00:18.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:00:19.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:00:19.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:00:19.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:00:19.746 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:00:19.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:00:19.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:00:19.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:00:19.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:00:19.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:00:19.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:00:22.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:00:22.462 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:00:22.463 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:00:22.463 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:00:22.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:00:22.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:00:22.488 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:00:22.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:00:22.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:00:22.489 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:00:22.489 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:00:22.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:00:22.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:00:22.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:00:22.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:00:22.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:00:22.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:00:22.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:00:22.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:00:22.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:00:22.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:00:22.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:00:22.827 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:00:22.900 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:00:06
2026-06-04T08:00:22.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88346, datetime.datetime(2026, 6, 4, 8, 0, 6), datetime.datetime(2026, 6, 4, 8, 0, 5), 'salt', 1.97, 100.74, None, 23.04, 153.43, -0.1, 821.9, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:00:22.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:00:22.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:00:22.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:00:05, diff=17.90782s, valid=True
2026-06-04T08:00:22.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:00:22.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:00:22.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:00:12, diff=10.911293s, valid=True
2026-06-04T08:00:22.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:00:22.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:00:22.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 07:59:59, diff=23.919403s, valid=True
2026-06-04T08:00:22.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:00:22.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:00:22.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:00:22.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:00:22.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:00:22.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:00:22.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:00:12, diff=10.923132s, valid=True
2026-06-04T08:00:22.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:00:22.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:00:22.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:00:22.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127019.92396s, valid=True
2026-06-04T08:00:22.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:00:22.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:00:22.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:00:22.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:00:22.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:00:22.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:00:22.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:00:22.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:00:23.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:00:23.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:00:23.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:00:23.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:00:23.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:00:23.314 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:00:23.529 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:00:23.876 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:00:23.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:00:23.978 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:00:23.978 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:00:24.143 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:00:24.143 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:00:54.150 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:00:54.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:00:54.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:00:54.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:00:54.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:00:54.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:00:54.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:00:54.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:00:54.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:00:54.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:00:54.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:00:54.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:00:54.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:00:57.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:00:57.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:00:57.982 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:00:57.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:00:57.993 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:00:58.005 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:00:58.006 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:00:58.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:00:58.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:00:58.007 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:00:58.007 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:00:58.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:00:58.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:00:58.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:00:58.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:00:58.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:00:58.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T08:00:58.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:00:58.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T08:00:58.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:00:58.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:00:58.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:00:58.324 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:00:58.394 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:00:36
2026-06-04T08:00:58.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88347, datetime.datetime(2026, 6, 4, 8, 0, 36), datetime.datetime(2026, 6, 4, 8, 0, 35), 'salt', 1.93, 100.71, None, 31.54, 150.91, -0.1, 821.9, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:00:58.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:00:58.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:00:58.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:00:35, diff=23.402072s, valid=True
2026-06-04T08:00:58.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:00:58.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T08:00:58.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:01:12, diff=-13.594542s, valid=True
2026-06-04T08:00:58.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:00:58.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:00:58.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:00:30, diff=28.413363s, valid=True
2026-06-04T08:00:58.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:00:58.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:00:58.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:00:58.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:00:58.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:00:58.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T08:00:58.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:01:12, diff=-13.583038s, valid=True
2026-06-04T08:00:58.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:00:58.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:00:58.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:00:58.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127055.41775s, valid=True
2026-06-04T08:00:58.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:00:58.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:00:58.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:00:58.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:00:58.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:00:58.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:00:58.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:00:58.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:00:58.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:00:58.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:00:58.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:00:58.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:00:58.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:00:58.735 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:00:58.950 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:00:59.296 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:00:59.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:00:59.398 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:00:59.398 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:00:59.631 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:00:59.631 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:01:29.648 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:01:29.648 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:01:29.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:01:29.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:01:29.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:01:30.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:01:30.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:01:30.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:01:30.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:01:30.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:01:30.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:01:30.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:01:30.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:01:33.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:01:33.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:01:33.065 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:01:33.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:01:33.074 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:01:33.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:01:33.086 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:01:33.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:01:33.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:01:33.086 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:01:33.086 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:01:33.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:01:33.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:01:33.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:01:33.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:01:33.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:01:33.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:01:33.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:01:33.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:01:33.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:01:33.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:01:33.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:01:33.363 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:01:33.434 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:01:06
2026-06-04T08:01:33.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88348, datetime.datetime(2026, 6, 4, 8, 1, 6), datetime.datetime(2026, 6, 4, 8, 1, 6), 'salt', 1.97, 100.74, None, 23.29, 171.02, -0.1, 821.9, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:01:33.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:01:33.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:01:33.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:01:06, diff=27.442186s, valid=True
2026-06-04T08:01:33.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:01:33.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:01:33.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:01:12, diff=21.445277s, valid=True
2026-06-04T08:01:33.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:01:33.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:01:33.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:01:00, diff=33.452874s, valid=True
2026-06-04T08:01:33.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:01:33.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:01:33.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:01:33.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:01:33.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:01:33.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:01:33.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:01:12, diff=21.456291s, valid=True
2026-06-04T08:01:33.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:01:33.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:01:33.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:01:33.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127090.457023s, valid=True
2026-06-04T08:01:33.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:01:33.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:01:33.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:01:33.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:01:33.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:01:33.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:01:33.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:01:33.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:01:33.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:01:33.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:01:33.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:01:33.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:01:33.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:01:33.773 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:01:33.986 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:01:34.331 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:01:34.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:01:34.434 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:01:34.434 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:01:34.600 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:01:34.601 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:02:04.602 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:02:04.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:02:04.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:02:04.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:02:04.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:02:05.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:02:05.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:02:05.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:02:05.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:02:05.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:02:05.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:02:05.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:02:05.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:02:07.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:02:07.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:02:07.614 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:02:07.615 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:02:07.625 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:02:07.644 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:02:07.644 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:02:07.645 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:02:07.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:02:07.645 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:02:07.646 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:02:07.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:02:07.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-06-04T08:02:07.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:02:07.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-06-04T08:02:07.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:02:07.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T08:02:07.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:02:07.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T08:02:07.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:02:07.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:02:07.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:02:07.986 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:02:08.058 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:02:07
2026-06-04T08:02:08.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88350, datetime.datetime(2026, 6, 4, 8, 2, 7), datetime.datetime(2026, 6, 4, 8, 2, 6), 'salt', 2.03, 100.71, None, 21.1, 164.0, -0.1, 821.93, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:02:08.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:02:08.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-06-04T08:02:08.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:02:06, diff=2.064485s, valid=True
2026-06-04T08:02:08.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:02:08.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T08:02:08.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:02:12, diff=-3.932594s, valid=True
2026-06-04T08:02:08.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:02:08.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-06-04T08:02:08.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:02:00, diff=8.074047s, valid=True
2026-06-04T08:02:08.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:02:08.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:02:08.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:02:08.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:02:08.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:02:08.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T08:02:08.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:02:12, diff=-3.922962s, valid=True
2026-06-04T08:02:08.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:02:08.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:02:08.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:02:08.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127125.077685s, valid=True
2026-06-04T08:02:08.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:02:08.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:02:08.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:02:08.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:02:08.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:02:08.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:02:08.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:02:08.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:02:08.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:02:08.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:02:08.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:02:08.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:02:08.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:02:08.394 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:02:08.684 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:02:09.030 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:02:09.132 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:02:09.132 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:02:09.132 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:02:09.304 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:02:09.304 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:02:39.326 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:02:39.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:02:39.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:02:39.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:02:39.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:02:39.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:02:39.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:02:39.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:02:39.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:02:39.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:02:39.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:02:39.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:02:39.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:02:42.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:02:42.450 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:02:42.451 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:02:42.451 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:02:42.462 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:02:42.474 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:02:42.475 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:02:42.476 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:02:42.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:02:42.476 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:02:42.477 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:02:42.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:02:42.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:02:42.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:02:42.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:02:42.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:02:42.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T08:02:42.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:02:42.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T08:02:42.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:02:42.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:02:42.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:02:42.801 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:02:42.872 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:02:37
2026-06-04T08:02:42.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88351, datetime.datetime(2026, 6, 4, 8, 2, 37), datetime.datetime(2026, 6, 4, 8, 2, 36), 'salt', 2.06, 100.71, None, 18.35, 151.5, -0.11, 822.02, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:02:42.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:02:42.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:02:42.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:02:36, diff=6.88039s, valid=True
2026-06-04T08:02:42.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:02:42.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T08:02:42.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:03:12, diff=-29.116113s, valid=True
2026-06-04T08:02:42.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:02:42.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:02:42.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:02:31, diff=11.892271s, valid=True
2026-06-04T08:02:42.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:02:42.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:02:42.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:02:42.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:02:42.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:02:42.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T08:02:42.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:03:12, diff=-29.103981s, valid=True
2026-06-04T08:02:42.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:02:42.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:02:42.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:02:42.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127159.896837s, valid=True
2026-06-04T08:02:42.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:02:42.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:02:42.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:02:42.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:02:42.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:02:42.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:02:42.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:02:42.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:02:42.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:02:43.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:02:43.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:02:43.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:02:43.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:02:43.217 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:02:43.432 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:02:43.778 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:02:43.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:02:43.880 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:02:43.880 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:02:44.050 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:02:44.050 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:03:14.054 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:03:14.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:03:14.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:03:14.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:03:14.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:03:14.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:03:14.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:03:14.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:03:14.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:03:14.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:03:14.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:03:14.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:03:14.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:03:17.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:03:17.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:03:17.321 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:03:17.322 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:03:17.333 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:03:17.345 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:03:17.346 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:03:17.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:03:17.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:03:17.347 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:03:17.347 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:03:17.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:03:17.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:03:17.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:03:17.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:03:17.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:03:17.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:03:17.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:03:17.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:03:17.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:03:17.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:03:17.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:03:17.676 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:03:17.749 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:03:07
2026-06-04T08:03:17.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88352, datetime.datetime(2026, 6, 4, 8, 3, 7), datetime.datetime(2026, 6, 4, 8, 3, 7), 'salt', 2.03, 100.68, None, 29.85, 167.19, -0.1, 822.09, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:03:17.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:03:17.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:03:17.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:03:07, diff=10.756416s, valid=True
2026-06-04T08:03:17.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:03:17.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:03:17.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:03:12, diff=5.759917s, valid=True
2026-06-04T08:03:17.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:03:17.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:03:17.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:03:01, diff=16.768168s, valid=True
2026-06-04T08:03:17.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:03:17.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:03:17.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:03:17.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:03:17.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:03:17.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:03:17.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:03:12, diff=5.771894s, valid=True
2026-06-04T08:03:17.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:03:17.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:03:17.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:03:17.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127194.77271s, valid=True
2026-06-04T08:03:17.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:03:17.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:03:17.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:03:17.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:03:17.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:03:17.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:03:17.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:03:17.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:03:17.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:03:17.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:03:17.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:03:18.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:03:18.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:03:18.171 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:03:18.381 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:03:18.725 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:03:18.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:03:18.826 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:03:18.826 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:03:19.195 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:03:19.196 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:03:49.214 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:03:49.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:03:49.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:03:49.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:03:49.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:03:49.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:03:49.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:03:49.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:03:49.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:03:49.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:03:49.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:03:49.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:03:49.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:03:52.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:03:52.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:03:52.658 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:03:52.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:03:52.667 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:03:52.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:03:52.681 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:03:52.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:03:52.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:03:52.682 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:03:52.682 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:03:52.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:03:52.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:03:52.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:03:52.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:03:52.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:03:52.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T08:03:52.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:03:53.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T08:03:53.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:03:53.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:03:53.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:03:53.007 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:03:53.080 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:03:38
2026-06-04T08:03:53.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88353, datetime.datetime(2026, 6, 4, 8, 3, 38), datetime.datetime(2026, 6, 4, 8, 3, 37), 'salt', 2.1, 100.74, None, 26.22, 155.26, -0.1, 822.02, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:03:53.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:03:53.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:03:53.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:03:37, diff=16.087865s, valid=True
2026-06-04T08:03:53.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:03:53.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T08:03:53.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:04:12, diff=-18.908669s, valid=True
2026-06-04T08:03:53.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:03:53.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:03:53.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:03:32, diff=21.099437s, valid=True
2026-06-04T08:03:53.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:03:53.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:03:53.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:03:53.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:03:53.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:03:53.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T08:03:53.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:04:12, diff=-18.896863s, valid=True
2026-06-04T08:03:53.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:03:53.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:03:53.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:03:53.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127230.103965s, valid=True
2026-06-04T08:03:53.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:03:53.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:03:53.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:03:53.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:03:53.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:03:53.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:03:53.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:03:53.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:03:53.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:03:53.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:03:53.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:03:53.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:03:53.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:03:53.425 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:03:53.640 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:03:53.985 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:03:54.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:03:54.086 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:03:54.086 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:03:54.260 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:03:54.260 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:04:24.278 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:04:24.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:04:24.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:04:24.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:04:24.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:04:24.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:04:24.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:04:24.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:04:24.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:04:24.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:04:24.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:04:24.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:04:24.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:04:27.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:04:27.448 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:04:27.448 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:04:27.448 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:04:27.457 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:04:27.468 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:04:27.469 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:04:27.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:04:27.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:04:27.469 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:04:27.469 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:04:27.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:04:27.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:04:27.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:04:27.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:04:27.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:04:27.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:04:27.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:04:27.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:04:27.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:04:27.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:04:27.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:04:27.828 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:04:27.898 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:04:08
2026-06-04T08:04:27.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88354, datetime.datetime(2026, 6, 4, 8, 4, 8), datetime.datetime(2026, 6, 4, 8, 4, 7), 'salt', 2.1, 100.71, None, 26.04, 137.33, -0.1, 822.09, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:04:27.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:04:27.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:04:27.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:04:07, diff=20.905215s, valid=True
2026-06-04T08:04:27.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:04:27.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:04:27.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:04:12, diff=15.90815s, valid=True
2026-06-04T08:04:27.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:04:27.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:04:27.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:04:02, diff=25.914942s, valid=True
2026-06-04T08:04:27.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:04:27.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:04:27.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:04:27.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:04:27.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:04:27.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:04:27.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:04:12, diff=15.918063s, valid=True
2026-06-04T08:04:27.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:04:27.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:04:27.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:04:27.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127264.918764s, valid=True
2026-06-04T08:04:27.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:04:27.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:04:27.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:04:27.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:04:27.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:04:27.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:04:27.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:04:27.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:04:28.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:04:28.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:04:28.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:04:28.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:04:28.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:04:28.320 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:04:28.536 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:04:28.892 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:04:29.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:04:29.001 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:04:29.001 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:04:29.278 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:04:29.278 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:04:59.307 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:04:59.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:04:59.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:04:59.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:04:59.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:04:59.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:04:59.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:04:59.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:04:59.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:04:59.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:04:59.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:05:00.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:05:00.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:05:02.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:05:02.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:05:02.724 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:05:02.725 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:05:02.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:05:02.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:05:02.749 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:05:02.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:05:02.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:05:02.750 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:05:02.750 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:05:02.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:05:03.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:05:03.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:05:03.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:05:03.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:05:03.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T08:05:03.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:05:03.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T08:05:03.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:05:03.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:05:03.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:05:03.521 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:05:03.594 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:04:39
2026-06-04T08:05:03.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88355, datetime.datetime(2026, 6, 4, 8, 4, 39), datetime.datetime(2026, 6, 4, 8, 4, 38), 'salt', 2.06, 100.78, None, 23.29, 152.51, -0.12, 821.9, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:05:03.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:05:03.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:05:03.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:04:38, diff=25.600949s, valid=True
2026-06-04T08:05:03.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:05:03.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T08:05:03.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:05:12, diff=-8.396207s, valid=True
2026-06-04T08:05:03.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:05:03.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:05:03.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:04:32, diff=31.610783s, valid=True
2026-06-04T08:05:03.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:05:03.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:05:03.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:05:03.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:05:03.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:05:03.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T08:05:03.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:05:12, diff=-8.385561s, valid=True
2026-06-04T08:05:03.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:05:03.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:05:03.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:05:03.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127300.615227s, valid=True
2026-06-04T08:05:03.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:05:03.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:05:03.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:05:03.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:05:03.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:05:03.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:05:03.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:05:03.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:05:03.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:05:03.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:05:03.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:05:03.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:05:03.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:05:03.937 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:05:04.154 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:05:04.519 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:05:04.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:05:04.625 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:05:04.625 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:05:04.842 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:05:04.843 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:05:34.861 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:05:34.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:05:34.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:05:34.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:05:34.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:05:35.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:05:35.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:05:35.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:05:35.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:05:35.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:05:35.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:05:35.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:05:35.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:05:38.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:05:38.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:05:38.087 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:05:38.087 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:05:38.096 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:05:38.108 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:05:38.108 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:05:38.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:05:38.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:05:38.109 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:05:38.109 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:05:38.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:05:38.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:05:38.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:05:38.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:05:38.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:05:38.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:05:38.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:05:38.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:05:38.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:05:38.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:05:38.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:05:38.630 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:05:38.701 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:05:09
2026-06-04T08:05:38.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88356, datetime.datetime(2026, 6, 4, 8, 5, 9), datetime.datetime(2026, 6, 4, 8, 5, 9), 'salt', 1.97, 100.71, None, 27.84, 151.78, -0.1, 821.84, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:05:38.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:05:38.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:05:38.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:05:09, diff=29.713897s, valid=True
2026-06-04T08:05:38.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:05:38.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:05:38.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:05:12, diff=26.716781s, valid=True
2026-06-04T08:05:38.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:05:38.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:05:38.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:05:02, diff=36.724923s, valid=True
2026-06-04T08:05:38.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:05:38.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:05:38.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:05:38.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:05:38.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:05:38.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:05:38.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:05:12, diff=26.728071s, valid=True
2026-06-04T08:05:38.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:05:38.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:05:38.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:05:38.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127335.728752s, valid=True
2026-06-04T08:05:38.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:05:38.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:05:38.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:05:38.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:05:38.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:05:38.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:05:38.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:05:38.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:05:38.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:05:38.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:05:38.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:05:39.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:05:39.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:05:39.114 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:05:39.326 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:05:39.685 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:05:39.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:05:39.787 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:05:39.787 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:05:40.031 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:05:40.031 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:06:10.061 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:06:10.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:06:10.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:06:10.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:06:10.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:06:10.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:06:10.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:06:10.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:06:10.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:06:10.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:06:10.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:06:10.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:06:10.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:06:13.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:06:13.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:06:13.767 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:06:13.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:06:13.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:06:13.788 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:06:13.788 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:06:13.788 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:06:13.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:06:13.789 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:06:13.789 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:06:13.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:06:13.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:06:13.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:06:14.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:06:14.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:06:14.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:06:14.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:06:14.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:06:14.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:06:14.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:06:14.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:06:14.271 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:06:14.349 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:06:10
2026-06-04T08:06:14.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88358, datetime.datetime(2026, 6, 4, 8, 6, 10), datetime.datetime(2026, 6, 4, 8, 6, 9), 'salt', 1.93, 100.68, None, 31.9, 150.09, -0.1, 821.78, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:06:14.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:06:14.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:06:14.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:06:09, diff=5.355467s, valid=True
2026-06-04T08:06:14.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:06:14.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:06:14.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:06:12, diff=2.358249s, valid=True
2026-06-04T08:06:14.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:06:14.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:06:14.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:06:03, diff=11.364851s, valid=True
2026-06-04T08:06:14.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:06:14.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:06:14.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:06:14.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:06:14.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:06:14.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:06:14.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:06:12, diff=2.36785s, valid=True
2026-06-04T08:06:14.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:06:14.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:06:14.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:06:14.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127371.368518s, valid=True
2026-06-04T08:06:14.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:06:14.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:06:14.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:06:14.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:06:14.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:06:14.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:06:14.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:06:14.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:06:14.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:06:14.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:06:14.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:06:14.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:06:14.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:06:14.683 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:06:14.895 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:06:15.241 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:06:15.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:06:15.342 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:06:15.342 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:06:15.498 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:06:15.498 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:06:45.528 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:06:45.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:06:45.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:06:45.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:06:45.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:06:46.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:06:46.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:06:46.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:06:46.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:06:46.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:06:46.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:06:46.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:06:46.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:06:48.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:06:48.690 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:06:48.690 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:06:48.691 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:06:48.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:06:48.711 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:06:48.711 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:06:48.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:06:48.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:06:48.712 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:06:48.712 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:06:48.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:06:48.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:06:48.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:06:48.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:06:48.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:06:48.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T08:06:48.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:06:49.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T08:06:49.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:06:49.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:06:49.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:06:49.041 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:06:49.112 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:06:40
2026-06-04T08:06:49.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88359, datetime.datetime(2026, 6, 4, 8, 6, 40), datetime.datetime(2026, 6, 4, 8, 6, 39), 'salt', 1.9, 100.74, None, 35.04, 142.86, -0.1, 821.84, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:06:49.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:06:49.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:06:49.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:06:39, diff=10.120201s, valid=True
2026-06-04T08:06:49.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:06:49.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T08:06:49.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:07:12, diff=-22.87617s, valid=True
2026-06-04T08:06:49.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:06:49.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:06:49.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:06:33, diff=16.132217s, valid=True
2026-06-04T08:06:49.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:06:49.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:06:49.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:06:49.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:06:49.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:06:49.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T08:06:49.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:07:12, diff=-22.86398s, valid=True
2026-06-04T08:06:49.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:06:49.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:06:49.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:06:49.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127406.136831s, valid=True
2026-06-04T08:06:49.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:06:49.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:06:49.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:06:49.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:06:49.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:06:49.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:06:49.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:06:49.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:06:49.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:06:49.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:06:49.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:06:49.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:06:49.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:06:49.456 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:06:49.669 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:06:50.028 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:06:50.135 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:06:50.135 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:06:50.135 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:06:50.360 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:06:50.360 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:07:20.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:07:20.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:07:20.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:07:20.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:07:20.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:07:20.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:07:20.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:07:20.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:07:20.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:07:20.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:07:20.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:07:20.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:07:20.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:07:23.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:07:23.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:07:23.558 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:07:23.558 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:07:23.568 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:07:23.580 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:07:23.581 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:07:23.581 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:07:23.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:07:23.581 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:07:23.582 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:07:23.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:07:23.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:07:23.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:07:23.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:07:23.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:07:23.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:07:23.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:07:23.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:07:23.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:07:23.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:07:23.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:07:23.868 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:07:24.017 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:07:10
2026-06-04T08:07:24.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88360, datetime.datetime(2026, 6, 4, 8, 7, 10), datetime.datetime(2026, 6, 4, 8, 7, 10), 'salt', 1.97, 100.78, None, 34.44, 160.99, -0.11, 822.02, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:07:24.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:07:24.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:07:24.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:07:10, diff=14.023278s, valid=True
2026-06-04T08:07:24.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:07:24.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:07:24.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:07:12, diff=12.0261s, valid=True
2026-06-04T08:07:24.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:07:24.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:07:24.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:07:03, diff=21.032945s, valid=True
2026-06-04T08:07:24.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:07:24.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:07:24.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:07:24.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:07:24.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:07:24.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:07:24.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:07:12, diff=12.036501s, valid=True
2026-06-04T08:07:24.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:07:24.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:07:24.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:07:24.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127441.037289s, valid=True
2026-06-04T08:07:24.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:07:24.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:07:24.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:07:24.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:07:24.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:07:24.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:07:24.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:07:24.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:07:24.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:07:24.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:07:24.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:07:24.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:07:24.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:07:24.354 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:07:24.566 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:07:24.974 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:07:25.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:07:25.075 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:07:25.075 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:07:25.300 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:07:25.301 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:07:55.331 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:07:55.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:07:55.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:07:55.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:07:55.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:07:55.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:07:55.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:07:55.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:07:55.849 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:07:55.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:07:55.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:07:55.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:07:55.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:07:58.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:07:58.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:07:58.354 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:07:58.354 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:07:58.363 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:07:58.374 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:07:58.374 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:07:58.375 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:07:58.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:07:58.375 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:07:58.375 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:07:58.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:07:58.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:07:58.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:07:58.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:07:58.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:07:58.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T08:07:58.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:07:58.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T08:07:58.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:07:58.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:07:58.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:07:58.691 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:07:58.774 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:07:41
2026-06-04T08:07:58.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88361, datetime.datetime(2026, 6, 4, 8, 7, 41), datetime.datetime(2026, 6, 4, 8, 7, 40), 'salt', 2.0, 100.68, None, 33.84, 163.81, -0.09, 822.09, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:07:58.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:07:58.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:07:58.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:07:40, diff=18.780311s, valid=True
2026-06-04T08:07:58.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:07:58.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T08:07:58.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:08:12, diff=-13.216875s, valid=True
2026-06-04T08:07:58.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:07:58.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:07:58.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:07:33, diff=25.789777s, valid=True
2026-06-04T08:07:58.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:07:58.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:07:58.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:07:58.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:07:58.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:07:58.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T08:07:58.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:08:12, diff=-13.207204s, valid=True
2026-06-04T08:07:58.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:07:58.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:07:58.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:07:58.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127475.793452s, valid=True
2026-06-04T08:07:58.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:07:58.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:07:58.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:07:58.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:07:58.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:07:58.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:07:58.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:07:58.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:07:58.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:07:58.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:07:58.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:07:59.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:07:59.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:07:59.107 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:07:59.320 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:07:59.665 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:07:59.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:07:59.768 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:07:59.768 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:07:59.834 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:07:59.835 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:08:29.864 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:08:29.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:08:29.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:08:29.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:08:29.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:08:30.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:08:30.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:08:30.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:08:30.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:08:30.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:08:30.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:08:30.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:08:30.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:08:32.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:08:32.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:08:32.748 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:08:32.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:08:32.756 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:08:32.768 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:08:32.768 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:08:32.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:08:32.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:08:32.769 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:08:32.769 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:08:32.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:08:32.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:08:32.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:08:32.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:08:32.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:08:33.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T08:08:33.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:08:33.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T08:08:33.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:08:33.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:08:33.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:08:33.059 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:08:33.129 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:08:11
2026-06-04T08:08:33.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88362, datetime.datetime(2026, 6, 4, 8, 8, 11), datetime.datetime(2026, 6, 4, 8, 8, 10), 'salt', 2.03, 100.74, None, 22.79, 166.98, -0.11, 822.09, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:08:33.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:08:33.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:08:33.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:08:10, diff=23.136019s, valid=True
2026-06-04T08:08:33.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:08:33.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T08:08:33.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:08:12, diff=21.138897s, valid=True
2026-06-04T08:08:33.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:08:33.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:08:33.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:08:04, diff=29.145761s, valid=True
2026-06-04T08:08:33.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:08:33.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:08:33.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:08:33.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:08:33.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:08:33.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T08:08:33.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:08:12, diff=21.148822s, valid=True
2026-06-04T08:08:33.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:08:33.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:08:33.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:08:33.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127510.149474s, valid=True
2026-06-04T08:08:33.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:08:33.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:08:33.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:08:33.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:08:33.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:08:33.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:08:33.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:08:33.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:08:33.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:08:33.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:08:33.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:08:33.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:08:33.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:08:33.466 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:08:33.752 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:08:34.098 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:08:34.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:08:34.200 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:08:34.200 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:08:34.434 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:08:34.435 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:09:04.451 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:09:04.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:09:04.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:09:04.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:09:04.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:09:04.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:09:04.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:09:04.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:09:04.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:09:04.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:09:04.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:09:04.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:09:04.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:09:07.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:09:07.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:09:07.318 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:09:07.318 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:09:07.327 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:09:07.339 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:09:07.339 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:09:07.339 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:09:07.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:09:07.339 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:09:07.339 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:09:07.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:09:07.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:09:07.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:09:07.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:09:07.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:09:07.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T08:09:07.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:09:07.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T08:09:07.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:09:07.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:09:07.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:09:07.615 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:09:07.686 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:08:41
2026-06-04T08:09:07.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88363, datetime.datetime(2026, 6, 4, 8, 8, 41), datetime.datetime(2026, 6, 4, 8, 8, 40), 'salt', 1.97, 100.61, None, 27.06, 164.28, -0.08, 821.9, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:09:07.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:09:07.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:09:07.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:08:40, diff=27.692403s, valid=True
2026-06-04T08:09:07.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:09:07.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T08:09:07.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:09:12, diff=-4.304769s, valid=True
2026-06-04T08:09:07.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:09:07.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:09:07.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:08:34, diff=33.701891s, valid=True
2026-06-04T08:09:07.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:09:07.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:09:07.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:09:07.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:09:07.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:09:07.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T08:09:07.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:09:12, diff=-4.29501s, valid=True
2026-06-04T08:09:07.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:09:07.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:09:07.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:09:07.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127544.705645s, valid=True
2026-06-04T08:09:07.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:09:07.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:09:07.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:09:07.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:09:07.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:09:07.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:09:07.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:09:07.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:09:07.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:09:07.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:09:07.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:09:07.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:09:07.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:09:08.020 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:09:08.235 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:09:08.583 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:09:08.696 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:09:08.697 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:09:08.697 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:09:08.948 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:09:08.948 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:09:38.979 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:09:38.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:09:38.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:09:39.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:09:39.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:09:39.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:09:39.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:09:39.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:09:39.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:09:39.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:09:39.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:09:39.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:09:39.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:09:41.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:09:41.825 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:09:41.826 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:09:41.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:09:41.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:09:41.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:09:41.847 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:09:41.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:09:41.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:09:41.847 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:09:41.847 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:09:41.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:09:41.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-06-04T08:09:41.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:09:42.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-06-04T08:09:42.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:09:42.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:09:42.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:09:42.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:09:42.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:09:42.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:09:42.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:09:42.126 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:09:42.197 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:09:41
2026-06-04T08:09:42.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88365, datetime.datetime(2026, 6, 4, 8, 9, 41), datetime.datetime(2026, 6, 4, 8, 9, 41), 'salt', 2.1, 100.74, None, 29.71, 172.99, -0.1, 821.96, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:09:42.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:09:42.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-06-04T08:09:42.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:09:41, diff=1.203452s, valid=True
2026-06-04T08:09:42.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:09:42.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:09:42.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:10:12, diff=-29.793679s, valid=True
2026-06-04T08:09:42.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:09:42.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-06-04T08:09:42.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:09:34, diff=8.212901s, valid=True
2026-06-04T08:09:42.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:09:42.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:09:42.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:09:42.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:09:42.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:09:42.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:09:42.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:10:12, diff=-29.784104s, valid=True
2026-06-04T08:09:42.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:09:42.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:09:42.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:09:42.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127579.216544s, valid=True
2026-06-04T08:09:42.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:09:42.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:09:42.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:09:42.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:09:42.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:09:42.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:09:42.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:09:42.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:09:42.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:09:42.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:09:42.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:09:42.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:09:42.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:09:42.603 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:09:42.815 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:09:43.162 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:09:43.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:09:43.263 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:09:43.263 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:09:43.490 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:09:43.491 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:10:13.495 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:10:13.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:10:13.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:10:13.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:10:13.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:10:13.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:10:13.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:10:13.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:10:13.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:10:13.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:10:13.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:10:13.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:10:13.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:10:16.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:10:16.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:10:16.497 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:10:16.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:10:16.506 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:10:16.518 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:10:16.518 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:10:16.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:10:16.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:10:16.519 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:10:16.519 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:10:16.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:10:16.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:10:16.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:10:16.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:10:16.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:10:16.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:10:16.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:10:16.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:10:16.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:10:16.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:10:16.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:10:16.831 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:10:16.905 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:10:12
2026-06-04T08:10:16.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88366, datetime.datetime(2026, 6, 4, 8, 10, 12), datetime.datetime(2026, 6, 4, 8, 10, 11), 'salt', 2.1, 100.74, None, 29.53, 168.81, -0.1, 822.15, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:10:16.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:10:16.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:10:16.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:10:11, diff=5.911088s, valid=True
2026-06-04T08:10:16.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:10:16.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:10:16.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:10:12, diff=4.913958s, valid=True
2026-06-04T08:10:16.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:10:16.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:10:16.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:10:05, diff=11.920713s, valid=True
2026-06-04T08:10:16.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:10:16.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:10:16.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:10:16.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:10:16.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:10:16.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:10:16.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:10:12, diff=4.923743s, valid=True
2026-06-04T08:10:16.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:10:16.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:10:16.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:10:16.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127613.924392s, valid=True
2026-06-04T08:10:16.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:10:16.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:10:16.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:10:16.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:10:16.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:10:16.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:10:16.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:10:16.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:10:17.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:10:17.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:10:17.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:10:17.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:10:17.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:10:17.248 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:10:17.466 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:10:17.818 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:10:17.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:10:17.920 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:10:17.920 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:10:18.154 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:10:18.155 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:10:48.185 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:10:48.185 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:10:48.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:10:48.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:10:48.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:10:48.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:10:48.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:10:48.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:10:48.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:10:48.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:10:48.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:10:48.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:10:48.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:10:51.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:10:51.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:10:51.283 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:10:51.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:10:51.291 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:10:51.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:10:51.303 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:10:51.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:10:51.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:10:51.303 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:10:51.303 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:10:51.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:10:51.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:10:51.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:10:51.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:10:51.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:10:51.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:10:51.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:10:51.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:10:51.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:10:51.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:10:51.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:10:51.579 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:10:51.651 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:10:42
2026-06-04T08:10:51.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88367, datetime.datetime(2026, 6, 4, 8, 10, 42), datetime.datetime(2026, 6, 4, 8, 10, 41), 'salt', 2.06, 100.71, None, 29.29, 168.88, -0.11, 822.02, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:10:51.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:10:51.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:10:51.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:10:41, diff=10.657889s, valid=True
2026-06-04T08:10:51.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:10:51.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:10:51.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:11:12, diff=-20.339254s, valid=True
2026-06-04T08:10:51.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:10:51.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:10:51.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:10:35, diff=16.667475s, valid=True
2026-06-04T08:10:51.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:10:51.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:10:51.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:10:51.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:10:51.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:10:51.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:10:51.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:11:12, diff=-20.329362s, valid=True
2026-06-04T08:10:51.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:10:51.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:10:51.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:10:51.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127648.671286s, valid=True
2026-06-04T08:10:51.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:10:51.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:10:51.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:10:51.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:10:51.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:10:51.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:10:51.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:10:51.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:10:51.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:10:51.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:10:51.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:10:51.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:10:52.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:10:52.060 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:10:52.272 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:10:52.619 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:10:52.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:10:52.721 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:10:52.721 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:10:52.946 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:10:52.946 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:11:22.976 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:11:22.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:11:22.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:11:23.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:11:23.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:11:23.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:11:23.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:11:23.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:11:23.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:11:23.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:11:23.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:11:23.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:11:23.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:11:26.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:11:26.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:11:26.007 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:11:26.007 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:11:26.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:11:26.026 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:11:26.027 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:11:26.027 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:11:26.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:11:26.027 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:11:26.027 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:11:26.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:11:26.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:11:26.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:11:26.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:11:26.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:11:26.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:11:26.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:11:26.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:11:26.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:11:26.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:11:26.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:11:26.302 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:11:26.372 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:11:12
2026-06-04T08:11:26.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88368, datetime.datetime(2026, 6, 4, 8, 11, 12), datetime.datetime(2026, 6, 4, 8, 11, 11), 'salt', 2.06, 100.68, None, 26.39, 154.06, -0.1, 822.02, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:11:26.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:11:26.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:11:26.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:11:11, diff=15.378396s, valid=True
2026-06-04T08:11:26.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:11:26.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:11:26.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:11:12, diff=14.381234s, valid=True
2026-06-04T08:11:26.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:11:26.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:11:26.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:11:05, diff=21.387888s, valid=True
2026-06-04T08:11:26.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:11:26.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:11:26.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:11:26.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:11:26.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:11:26.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:11:26.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:11:12, diff=14.390906s, valid=True
2026-06-04T08:11:26.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:11:26.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:11:26.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:11:26.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127683.391558s, valid=True
2026-06-04T08:11:26.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:11:26.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:11:26.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:11:26.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:11:26.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:11:26.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:11:26.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:11:26.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:11:26.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:11:26.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:11:26.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:11:26.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:11:26.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:11:26.706 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:11:26.918 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:11:27.264 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:11:27.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:11:27.365 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:11:27.365 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:11:27.597 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:11:27.597 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:11:57.627 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:11:57.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:11:57.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:11:57.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:11:57.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:11:58.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:11:58.105 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:11:58.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:11:58.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:11:58.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:11:58.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:11:58.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:11:58.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:12:00.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:12:00.626 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:12:00.626 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:12:00.627 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:12:00.634 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:12:00.645 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:12:00.645 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:12:00.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:12:00.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:12:00.646 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:12:00.647 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:12:00.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:12:00.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:12:00.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:12:00.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:12:00.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:12:00.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:12:00.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:12:00.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:12:00.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:12:00.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:12:00.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:12:00.992 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:12:01.062 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:11:42
2026-06-04T08:12:01.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88369, datetime.datetime(2026, 6, 4, 8, 11, 42), datetime.datetime(2026, 6, 4, 8, 11, 42), 'salt', 2.03, 100.61, None, 35.39, 168.06, -0.09, 822.02, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:12:01.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:12:01.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:12:01.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:11:42, diff=19.068224s, valid=True
2026-06-04T08:12:01.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:12:01.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:12:01.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:12:12, diff=-10.92886s, valid=True
2026-06-04T08:12:01.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:12:01.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:12:01.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:11:35, diff=26.077805s, valid=True
2026-06-04T08:12:01.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:12:01.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:12:01.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:12:01.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:12:01.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:12:01.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:12:01.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:12:12, diff=-10.919177s, valid=True
2026-06-04T08:12:01.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:12:01.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:12:01.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:12:01.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127718.081484s, valid=True
2026-06-04T08:12:01.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:12:01.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:12:01.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:12:01.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:12:01.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:12:01.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:12:01.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:12:01.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:12:01.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:12:01.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:12:01.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:12:01.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:12:01.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:12:01.395 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:12:01.627 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:12:02.030 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:12:02.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:12:02.133 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:12:02.133 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:12:02.366 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:12:02.366 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:12:32.378 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:12:32.378 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:12:32.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:12:32.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:12:32.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:12:32.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:12:32.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:12:32.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:12:32.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:12:32.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:12:32.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:12:32.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:12:32.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:12:35.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:12:35.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:12:35.709 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:12:35.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:12:35.719 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:12:35.732 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:12:35.733 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:12:35.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:12:35.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:12:35.734 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:12:35.734 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:12:35.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:12:35.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:12:35.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:12:35.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:12:35.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:12:35.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:12:35.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:12:36.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:12:36.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:12:36.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:12:36.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:12:36.028 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:12:36.103 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:12:12
2026-06-04T08:12:36.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88370, datetime.datetime(2026, 6, 4, 8, 12, 12), datetime.datetime(2026, 6, 4, 8, 12, 12), 'salt', 2.06, 100.74, None, 27.38, 158.73, -0.11, 822.09, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:12:36.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:12:36.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:12:36.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:12:12, diff=24.110847s, valid=True
2026-06-04T08:12:36.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:12:36.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:12:36.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:12:12, diff=24.114213s, valid=True
2026-06-04T08:12:36.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:12:36.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:12:36.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:12:05, diff=31.122041s, valid=True
2026-06-04T08:12:36.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:12:36.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:12:36.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:12:36.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:12:36.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:12:36.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:12:36.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:12:12, diff=24.125715s, valid=True
2026-06-04T08:12:36.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:12:36.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:12:36.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:12:36.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127753.126501s, valid=True
2026-06-04T08:12:36.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:12:36.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:12:36.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:12:36.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:12:36.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:12:36.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:12:36.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:12:36.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:12:36.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:12:36.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:12:36.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:12:36.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:12:36.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:12:36.446 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:12:36.658 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:12:37.059 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:12:37.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:12:37.163 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:12:37.163 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:12:37.342 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:12:37.343 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:13:07.346 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:13:07.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:13:07.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:13:07.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:13:07.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:13:07.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:13:07.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:13:07.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:13:07.746 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:13:07.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:13:07.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:13:07.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:13:07.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:13:10.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:13:10.450 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:13:10.452 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:13:10.452 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:13:10.465 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:13:10.477 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:13:10.478 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:13:10.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:13:10.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:13:10.479 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:13:10.479 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:13:10.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:13:10.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:13:10.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:13:10.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:13:10.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:13:10.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:13:10.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:13:10.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:13:10.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:13:10.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:13:10.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:13:10.821 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:13:10.893 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:12:43
2026-06-04T08:13:10.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88371, datetime.datetime(2026, 6, 4, 8, 12, 43), datetime.datetime(2026, 6, 4, 8, 12, 42), 'salt', 2.06, 100.71, None, 35.42, 158.43, -0.11, 821.96, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:13:10.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:13:10.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:13:10.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:12:42, diff=28.900999s, valid=True
2026-06-04T08:13:10.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:13:10.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:13:10.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:13:12, diff=-1.095472s, valid=True
2026-06-04T08:13:10.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:13:10.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:13:10.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:12:36, diff=34.912828s, valid=True
2026-06-04T08:13:10.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:13:10.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:13:10.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:13:10.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:13:10.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:13:10.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:13:10.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:13:12, diff=-1.083413s, valid=True
2026-06-04T08:13:10.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:13:10.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:13:10.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:13:10.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127787.917414s, valid=True
2026-06-04T08:13:10.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:13:10.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:13:10.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:13:10.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:13:10.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:13:10.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:13:10.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:13:10.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:13:11.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:13:11.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:13:11.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:13:11.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:13:11.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:13:11.237 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:13:11.465 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:13:11.811 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:13:11.913 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:13:11.914 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:13:11.914 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:13:12.088 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:13:12.088 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:13:42.092 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:13:42.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:13:42.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:13:42.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:13:42.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:13:42.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:13:42.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:13:42.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:13:42.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:13:42.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:13:42.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:13:42.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:13:42.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:13:45.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:13:45.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:13:45.183 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:13:45.184 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:13:45.193 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:13:45.205 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:13:45.206 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:13:45.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:13:45.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:13:45.207 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:13:45.207 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:13:45.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:13:45.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-06-04T08:13:45.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:13:45.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-06-04T08:13:45.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:13:45.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T08:13:45.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:13:45.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T08:13:45.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:13:45.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:13:45.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:13:45.537 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:13:45.616 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:13:43
2026-06-04T08:13:45.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88373, datetime.datetime(2026, 6, 4, 8, 13, 43), datetime.datetime(2026, 6, 4, 8, 13, 42), 'salt', 2.06, 100.68, None, 28.09, 168.79, -0.1, 822.21, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:13:45.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:13:45.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-06-04T08:13:45.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:13:42, diff=3.623756s, valid=True
2026-06-04T08:13:45.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:13:45.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T08:13:45.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:14:12, diff=-26.372798s, valid=True
2026-06-04T08:13:45.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:13:45.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-06-04T08:13:45.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:13:36, diff=9.635415s, valid=True
2026-06-04T08:13:45.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:13:45.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:13:45.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:13:45.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:13:45.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:13:45.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T08:13:45.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:14:12, diff=-26.360882s, valid=True
2026-06-04T08:13:45.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:13:45.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:13:45.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:13:45.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127822.639928s, valid=True
2026-06-04T08:13:45.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:13:45.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:13:45.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:13:45.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:13:45.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:13:45.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:13:45.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:13:45.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:13:45.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:13:45.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:13:45.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:13:45.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:13:45.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:13:45.958 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:13:46.241 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:13:46.582 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:13:46.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:13:46.684 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:13:46.684 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:13:46.861 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:13:46.861 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:14:16.883 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:14:16.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:14:16.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:14:17.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:14:17.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:14:17.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:14:17.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:14:17.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:14:17.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:14:17.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:14:17.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:14:17.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:14:17.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:14:19.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:14:19.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:14:19.976 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:14:19.976 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:14:19.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:14:19.998 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:14:19.998 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:14:19.998 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:14:19.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:14:19.999 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:14:19.999 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:14:20.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:14:20.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:14:20.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:14:20.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:14:20.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:14:20.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:14:20.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:14:20.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:14:20.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:14:20.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:14:20.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:14:20.290 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:14:20.383 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:14:13
2026-06-04T08:14:20.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88374, datetime.datetime(2026, 6, 4, 8, 14, 13), datetime.datetime(2026, 6, 4, 8, 14, 13), 'salt', 2.06, 100.78, None, 27.2, 174.21, -0.12, 821.96, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:14:20.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:14:20.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:14:20.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:14:13, diff=7.390077s, valid=True
2026-06-04T08:14:20.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:14:20.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:14:20.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:14:12, diff=8.393359s, valid=True
2026-06-04T08:14:20.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:14:20.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:14:20.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:14:07, diff=13.401127s, valid=True
2026-06-04T08:14:20.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:14:20.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:14:20.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:14:20.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:14:20.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:14:20.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:14:20.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:14:12, diff=8.40464s, valid=True
2026-06-04T08:14:20.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:14:20.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:14:20.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:14:20.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127857.405387s, valid=True
2026-06-04T08:14:20.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:14:20.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:14:20.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:14:20.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:14:20.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:14:20.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:14:20.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:14:20.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:14:20.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:14:20.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:14:20.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:14:20.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:14:20.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:14:20.725 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:14:20.935 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:14:21.280 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:14:21.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:14:21.382 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:14:21.382 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:14:21.611 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:14:21.611 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:14:51.640 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:14:51.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:14:51.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:14:51.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:14:51.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:14:52.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:14:52.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:14:52.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:14:52.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:14:52.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:14:52.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:14:52.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:14:52.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:14:54.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:14:54.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:14:54.947 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:14:54.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:14:54.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:14:54.969 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:14:54.969 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:14:54.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:14:54.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:14:54.971 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:14:54.971 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:14:54.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:14:55.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:14:55.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:14:55.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:14:55.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:14:55.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:14:55.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:14:55.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:14:55.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:14:55.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:14:55.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:14:55.303 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:14:55.388 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:14:44
2026-06-04T08:14:55.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88375, datetime.datetime(2026, 6, 4, 8, 14, 44), datetime.datetime(2026, 6, 4, 8, 14, 43), 'salt', 2.06, 100.71, None, 35.21, 161.67, -0.11, 822.15, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:14:55.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:14:55.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:14:55.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:14:43, diff=12.395795s, valid=True
2026-06-04T08:14:55.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:14:55.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:14:55.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:15:12, diff=-16.600877s, valid=True
2026-06-04T08:14:55.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:14:55.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:14:55.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:14:37, diff=18.407109s, valid=True
2026-06-04T08:14:55.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:14:55.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:14:55.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:14:55.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:14:55.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:14:55.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:14:55.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:15:12, diff=-16.5893s, valid=True
2026-06-04T08:14:55.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:14:55.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:14:55.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:14:55.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127892.411475s, valid=True
2026-06-04T08:14:55.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:14:55.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:14:55.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:14:55.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:14:55.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:14:55.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:14:55.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:14:55.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:14:55.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:14:55.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:14:55.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:14:55.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:14:55.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:14:55.801 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:14:56.014 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:14:56.359 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:14:56.460 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:14:56.460 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:14:56.461 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:14:56.679 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:14:56.679 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:15:26.709 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:15:26.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:15:26.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:15:26.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:15:26.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:15:27.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:15:27.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:15:27.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:15:27.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:15:27.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:15:27.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:15:27.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:15:27.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:15:29.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:15:29.916 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:15:29.916 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:15:29.916 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:15:29.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:15:29.937 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:15:29.938 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:15:29.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:15:29.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:15:29.938 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:15:29.938 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:15:29.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:15:30.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:15:30.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:15:30.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:15:30.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:15:30.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:15:30.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:15:30.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:15:30.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:15:30.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:15:30.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:15:30.229 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:15:30.300 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:15:14
2026-06-04T08:15:30.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88376, datetime.datetime(2026, 6, 4, 8, 15, 14), datetime.datetime(2026, 6, 4, 8, 15, 13), 'salt', 2.0, 100.74, None, 37.65, 150.93, -0.1, 821.96, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:15:30.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:15:30.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:15:30.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:15:13, diff=17.307585s, valid=True
2026-06-04T08:15:30.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:15:30.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:15:30.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:15:12, diff=18.310824s, valid=True
2026-06-04T08:15:30.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:15:30.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:15:30.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:15:07, diff=23.31849s, valid=True
2026-06-04T08:15:30.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:15:30.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:15:30.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:15:30.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:15:30.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:15:30.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:15:30.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:15:12, diff=18.321973s, valid=True
2026-06-04T08:15:30.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:15:30.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:15:30.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:15:30.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127927.322715s, valid=True
2026-06-04T08:15:30.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:15:30.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:15:30.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:15:30.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:15:30.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:15:30.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:15:30.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:15:30.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:15:30.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:15:30.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:15:30.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:15:30.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:15:30.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:15:30.640 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:15:30.864 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:15:31.212 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:15:31.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:15:31.312 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:15:31.312 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:15:31.487 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:15:31.488 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:16:01.501 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:16:01.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:16:01.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:16:01.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:16:01.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:16:01.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:16:01.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:16:01.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:16:01.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:16:01.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:16:01.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:16:01.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:16:01.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:16:04.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:16:04.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:16:04.434 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:16:04.434 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:16:04.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:16:04.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:16:04.460 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:16:04.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:16:04.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:16:04.462 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:16:04.462 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:16:04.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:16:04.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:16:04.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:16:04.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:16:04.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:16:04.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:16:04.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:16:04.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:16:04.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:16:04.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:16:04.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:16:04.766 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:16:04.840 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:15:44
2026-06-04T08:16:04.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88377, datetime.datetime(2026, 6, 4, 8, 15, 44), datetime.datetime(2026, 6, 4, 8, 15, 43), 'salt', 2.03, 100.74, None, 32.92, 160.64, -0.11, 822.09, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:16:04.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:16:04.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:16:04.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:15:43, diff=21.847565s, valid=True
2026-06-04T08:16:04.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:16:04.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:16:04.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:16:12, diff=-7.14914s, valid=True
2026-06-04T08:16:04.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:16:04.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:16:04.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:15:38, diff=26.858583s, valid=True
2026-06-04T08:16:04.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:16:04.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:16:04.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:16:04.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:16:04.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:16:04.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:16:04.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:16:12, diff=-7.13792s, valid=True
2026-06-04T08:16:04.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:16:04.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:16:04.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:16:04.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127961.862836s, valid=True
2026-06-04T08:16:04.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:16:04.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:16:04.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:16:04.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:16:04.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:16:04.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:16:04.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:16:04.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:16:05.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:16:05.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:16:05.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:16:05.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:16:05.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:16:05.244 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:16:05.456 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:16:05.802 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:16:05.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:16:05.903 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:16:05.903 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:16:06.156 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:16:06.156 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:16:36.186 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:16:36.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:16:36.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:16:36.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:16:36.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:16:36.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:16:36.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:16:36.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:16:36.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:16:36.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:16:36.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:16:36.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:16:36.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:16:39.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:16:39.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:16:39.490 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:16:39.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:16:39.500 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:16:39.513 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:16:39.514 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:16:39.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:16:39.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:16:39.515 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:16:39.515 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:16:39.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:16:39.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:16:39.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:16:39.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:16:39.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:16:39.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:16:39.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:16:39.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:16:39.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:16:39.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:16:39.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:16:39.852 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:16:39.925 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:16:15
2026-06-04T08:16:39.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88378, datetime.datetime(2026, 6, 4, 8, 16, 15), datetime.datetime(2026, 6, 4, 8, 16, 14), 'salt', 1.97, 100.74, None, 38.25, 156.1, -0.1, 821.96, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:16:39.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:16:39.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:16:39.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:16:14, diff=25.931918s, valid=True
2026-06-04T08:16:39.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:16:39.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:16:39.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:16:12, diff=27.934824s, valid=True
2026-06-04T08:16:39.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:16:39.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:16:39.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:16:08, diff=31.942028s, valid=True
2026-06-04T08:16:39.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:16:39.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:16:39.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:16:39.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:16:39.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:16:39.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:16:39.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:16:12, diff=27.945791s, valid=True
2026-06-04T08:16:39.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:16:39.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:16:39.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:16:39.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=127996.946476s, valid=True
2026-06-04T08:16:39.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:16:39.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:16:39.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:16:39.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:16:39.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:16:40.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:16:40.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:16:40.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:16:40.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:16:40.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:16:40.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:16:40.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:16:40.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:16:40.267 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:16:40.478 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:16:40.821 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:16:40.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:16:40.922 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:16:40.922 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:16:41.106 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:16:41.106 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:17:11.134 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:17:11.134 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:17:11.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:17:11.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:17:11.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:17:11.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:17:11.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:17:11.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:17:11.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:17:11.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:17:11.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:17:11.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:17:11.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:17:14.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:17:14.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:17:14.192 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:17:14.192 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:17:14.204 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:17:14.216 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:17:14.217 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:17:14.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:17:14.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:17:14.218 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:17:14.219 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:17:14.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:17:14.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:17:14.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:17:14.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:17:14.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:17:14.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:17:14.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:17:14.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:17:14.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:17:14.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:17:14.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:17:14.534 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:17:14.605 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:16:45
2026-06-04T08:17:14.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88379, datetime.datetime(2026, 6, 4, 8, 16, 45), datetime.datetime(2026, 6, 4, 8, 16, 44), 'salt', 2.03, 100.78, None, 26.92, 168.86, -0.11, 822.21, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:17:14.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:17:14.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:17:14.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:16:44, diff=30.611441s, valid=True
2026-06-04T08:17:14.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:17:14.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:17:14.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:17:12, diff=2.614322s, valid=True
2026-06-04T08:17:14.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:17:14.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:17:14.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:16:38, diff=36.620977s, valid=True
2026-06-04T08:17:14.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:17:14.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:17:14.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:17:14.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:17:14.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:17:14.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:17:14.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:17:12, diff=2.624s, valid=True
2026-06-04T08:17:14.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:17:14.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:17:14.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:17:14.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128031.624659s, valid=True
2026-06-04T08:17:14.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:17:14.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:17:14.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:17:14.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:17:14.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:17:14.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:17:14.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:17:14.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:17:14.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:17:14.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:17:14.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:17:14.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:17:14.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:17:14.955 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:17:15.169 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:17:15.515 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:17:15.616 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:17:15.616 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:17:15.616 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:17:15.786 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:17:15.786 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:17:45.816 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:17:45.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:17:45.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:17:45.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:17:46.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:17:46.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:17:46.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:17:46.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:17:46.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:17:46.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:17:46.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:17:46.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:17:46.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:17:48.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:17:48.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:17:48.944 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:17:48.944 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:17:48.954 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:17:48.966 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:17:48.967 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:17:48.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:17:48.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:17:48.968 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:17:48.968 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:17:48.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:17:49.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:17:49.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:17:49.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:17:49.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:17:49.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:17:49.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:17:49.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:17:49.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:17:49.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:17:49.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:17:49.299 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:17:49.371 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:17:45
2026-06-04T08:17:49.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88381, datetime.datetime(2026, 6, 4, 8, 17, 45), datetime.datetime(2026, 6, 4, 8, 17, 45), 'salt', 2.0, 100.64, None, 32.28, 182.04, -0.09, 822.02, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:17:49.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:17:49.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:17:49.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:17:45, diff=4.377348s, valid=True
2026-06-04T08:17:49.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:17:49.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:17:49.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:18:12, diff=-22.619722s, valid=True
2026-06-04T08:17:49.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:17:49.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:17:49.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:17:39, diff=10.38759s, valid=True
2026-06-04T08:17:49.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:17:49.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:17:49.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:17:49.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:17:49.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:17:49.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:17:49.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:18:12, diff=-22.608481s, valid=True
2026-06-04T08:17:49.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:17:49.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:17:49.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:17:49.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128066.392348s, valid=True
2026-06-04T08:17:49.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:17:49.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:17:49.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:17:49.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:17:49.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:17:49.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:17:49.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:17:49.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:17:49.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:17:49.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:17:49.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:17:49.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:17:49.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:17:49.745 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:17:49.990 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:17:50.399 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:17:50.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:17:50.500 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:17:50.500 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:17:50.684 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:17:50.684 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:18:20.714 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:18:20.715 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:18:20.715 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:18:21.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:18:21.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:18:21.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:18:21.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:18:21.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:18:21.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:18:21.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:18:21.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:18:21.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:18:21.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:18:23.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:18:23.987 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:18:23.988 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:18:23.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:18:24.001 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:18:24.014 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:18:24.014 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:18:24.015 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:18:24.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:18:24.015 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:18:24.015 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:18:24.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:18:24.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:18:24.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:18:24.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:18:24.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:18:24.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:18:24.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:18:24.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:18:24.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:18:24.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:18:24.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:18:24.349 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:18:24.424 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:18:16
2026-06-04T08:18:24.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88382, datetime.datetime(2026, 6, 4, 8, 18, 16), datetime.datetime(2026, 6, 4, 8, 18, 15), 'salt', 2.03, 100.68, None, 29.57, 168.93, -0.1, 821.9, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:18:24.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:18:24.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:18:24.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:18:15, diff=9.43205s, valid=True
2026-06-04T08:18:24.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:18:24.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:18:24.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:18:12, diff=12.435525s, valid=True
2026-06-04T08:18:24.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:18:24.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:18:24.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:18:09, diff=15.443645s, valid=True
2026-06-04T08:18:24.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:18:24.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:18:24.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:18:24.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:18:24.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:18:24.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:18:24.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:18:12, diff=12.44735s, valid=True
2026-06-04T08:18:24.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:18:24.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:18:24.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:18:24.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128101.448184s, valid=True
2026-06-04T08:18:24.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:18:24.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:18:24.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:18:24.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:18:24.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:18:24.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:18:24.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:18:24.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:18:24.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:18:24.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:18:24.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:18:24.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:18:24.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:18:24.773 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:18:24.987 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:18:25.334 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:18:25.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:18:25.435 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:18:25.435 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:18:25.683 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:18:25.684 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:18:55.713 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:18:55.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:18:55.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:18:55.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:18:55.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:18:56.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:18:56.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:18:56.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:18:56.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:18:56.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:18:56.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:18:56.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:18:56.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:18:58.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:18:58.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:18:58.739 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:18:58.739 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:18:58.749 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:18:58.763 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:18:58.763 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:18:58.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:18:58.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:18:58.764 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:18:58.765 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:18:58.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:18:58.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:18:59.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:18:59.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:18:59.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:18:59.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:18:59.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:18:59.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:18:59.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:18:59.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:18:59.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:18:59.219 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:18:59.292 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:18:47
2026-06-04T08:18:59.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88383, datetime.datetime(2026, 6, 4, 8, 18, 47), datetime.datetime(2026, 6, 4, 8, 18, 46), 'salt', 2.03, 100.71, None, 28.76, 159.3, -0.1, 821.9, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:18:59.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:18:59.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:18:59.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:18:46, diff=13.300881s, valid=True
2026-06-04T08:18:59.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:18:59.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:18:59.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:19:12, diff=-12.695337s, valid=True
2026-06-04T08:18:59.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:18:59.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:18:59.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:18:39, diff=20.313296s, valid=True
2026-06-04T08:18:59.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:18:59.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:18:59.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:18:59.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:18:59.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:18:59.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:18:59.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:19:12, diff=-12.682687s, valid=True
2026-06-04T08:18:59.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:18:59.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:18:59.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:18:59.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128136.318207s, valid=True
2026-06-04T08:18:59.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:18:59.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:18:59.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:18:59.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:18:59.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:18:59.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:18:59.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:18:59.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:18:59.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:18:59.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:18:59.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:18:59.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:18:59.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:18:59.638 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:18:59.932 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:19:00.288 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:19:00.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:19:00.390 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:19:00.390 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:19:00.578 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:19:00.578 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:19:30.590 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:19:30.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:19:30.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:19:30.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:19:30.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:19:31.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:19:31.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:19:31.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:19:31.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:19:31.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:19:31.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:19:31.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:19:31.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:19:33.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:19:33.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:19:33.887 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:19:33.887 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:19:33.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:19:33.909 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:19:33.909 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:19:33.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:19:33.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:19:33.910 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:19:33.911 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:19:33.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:19:34.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:19:34.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:19:34.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:19:34.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:19:34.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:19:34.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:19:34.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:19:34.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:19:34.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:19:34.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:19:34.236 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:19:34.308 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:19:17
2026-06-04T08:19:34.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88384, datetime.datetime(2026, 6, 4, 8, 19, 17), datetime.datetime(2026, 6, 4, 8, 19, 16), 'salt', 2.0, 100.74, None, 25.09, 163.81, -0.1, 822.15, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:19:34.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:19:34.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:19:34.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:19:16, diff=18.315866s, valid=True
2026-06-04T08:19:34.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:19:34.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:19:34.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:19:12, diff=22.319429s, valid=True
2026-06-04T08:19:34.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:19:34.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:19:34.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:19:09, diff=25.327889s, valid=True
2026-06-04T08:19:34.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:19:34.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:19:34.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:19:34.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:19:34.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:19:34.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:19:34.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:19:12, diff=22.331699s, valid=True
2026-06-04T08:19:34.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:19:34.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:19:34.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:19:34.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128171.332524s, valid=True
2026-06-04T08:19:34.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:19:34.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:19:34.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:19:34.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:19:34.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:19:34.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:19:34.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:19:34.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:19:34.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:19:34.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:19:34.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:19:34.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:19:34.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:19:34.655 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:19:34.866 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:19:35.210 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:19:35.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:19:35.311 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:19:35.312 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:19:35.519 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:19:35.519 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:20:05.527 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:20:05.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:20:05.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:20:05.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:20:05.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:20:05.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:20:05.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:20:05.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:20:05.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:20:05.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:20:05.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:20:05.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:20:05.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:20:08.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:20:08.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:20:08.607 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:20:08.608 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:20:08.618 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:20:08.631 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:20:08.632 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:20:08.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:20:08.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:20:08.633 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:20:08.633 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:20:08.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:20:08.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:20:08.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:20:08.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:20:08.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:20:08.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:20:08.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:20:08.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:20:08.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:20:08.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:20:08.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:20:08.979 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:20:09.051 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:19:47
2026-06-04T08:20:09.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88385, datetime.datetime(2026, 6, 4, 8, 19, 47), datetime.datetime(2026, 6, 4, 8, 19, 46), 'salt', 2.03, 100.68, None, 28.02, 158.12, -0.1, 822.15, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:20:09.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:20:09.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:20:09.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:19:46, diff=23.057987s, valid=True
2026-06-04T08:20:09.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:20:09.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:20:09.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:20:12, diff=-2.938972s, valid=True
2026-06-04T08:20:09.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:20:09.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:20:09.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:19:39, diff=30.067936s, valid=True
2026-06-04T08:20:09.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:20:09.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:20:09.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:20:09.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:20:09.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:20:09.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:20:09.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:20:12, diff=-2.928406s, valid=True
2026-06-04T08:20:09.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:20:09.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:20:09.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:20:09.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128206.072411s, valid=True
2026-06-04T08:20:09.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:20:09.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:20:09.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:20:09.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:20:09.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:20:09.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:20:09.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:20:09.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:20:09.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:20:09.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:20:09.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:20:09.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:20:09.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:20:09.459 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:20:09.671 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:20:10.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:20:10.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:20:10.153 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:20:10.153 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:20:10.353 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:20:10.353 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:20:40.383 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:20:40.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:20:40.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:20:40.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:20:40.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:20:40.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:20:40.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:20:40.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:20:40.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:20:40.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:20:40.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:20:40.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:20:40.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:20:43.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:20:43.535 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:20:43.536 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:20:43.536 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:20:43.545 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:20:43.557 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:20:43.558 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:20:43.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:20:43.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:20:43.558 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:20:43.558 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:20:43.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:20:43.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:20:43.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:20:43.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:20:43.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:20:43.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:20:43.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:20:43.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:20:43.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:20:43.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:20:43.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:20:43.836 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:20:43.908 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:20:17
2026-06-04T08:20:43.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88386, datetime.datetime(2026, 6, 4, 8, 20, 17), datetime.datetime(2026, 6, 4, 8, 20, 17), 'salt', 2.03, 100.78, None, 26.92, 171.37, -0.11, 822.15, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:20:43.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:20:43.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:20:43.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:20:17, diff=26.915837s, valid=True
2026-06-04T08:20:43.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:20:43.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:20:43.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:20:12, diff=31.919085s, valid=True
2026-06-04T08:20:43.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:20:43.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:20:43.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:20:10, diff=33.926806s, valid=True
2026-06-04T08:20:43.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:20:43.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:20:43.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:20:43.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:20:43.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:20:43.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:20:43.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:20:12, diff=31.930341s, valid=True
2026-06-04T08:20:43.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:20:43.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:20:43.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:20:43.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128240.9311s, valid=True
2026-06-04T08:20:43.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:20:43.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:20:43.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:20:43.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:20:43.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:20:43.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:20:43.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:20:43.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:20:44.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:20:44.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:20:44.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:20:44.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:20:44.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:20:44.248 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:20:44.458 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:20:44.801 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:20:44.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:20:44.902 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:20:44.902 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:20:45.173 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:20:45.174 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:21:15.204 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:21:15.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:21:15.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:21:15.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:21:15.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:21:15.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:21:15.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:21:15.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:21:15.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:21:15.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:21:15.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:21:15.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:21:15.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:21:18.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:21:18.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:21:18.416 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:21:18.416 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:21:18.428 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:21:18.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:21:18.441 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:21:18.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:21:18.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:21:18.442 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:21:18.442 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:21:18.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:21:18.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-06-04T08:21:18.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:21:18.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-06-04T08:21:18.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:21:18.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:21:18.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:21:18.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:21:18.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:21:18.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:21:18.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:21:18.774 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:21:18.846 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:21:18
2026-06-04T08:21:18.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88388, datetime.datetime(2026, 6, 4, 8, 21, 18), datetime.datetime(2026, 6, 4, 8, 21, 17), 'salt', 2.0, 100.68, None, 23.25, 148.23, -0.09, 822.21, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:21:18.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:21:18.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-06-04T08:21:18.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:21:17, diff=1.854307s, valid=True
2026-06-04T08:21:18.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:21:18.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:21:18.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:21:12, diff=6.857809s, valid=True
2026-06-04T08:21:18.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:21:18.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-06-04T08:21:18.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:21:10, diff=8.866005s, valid=True
2026-06-04T08:21:18.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:21:18.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:21:18.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:21:18.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:21:18.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:21:18.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:21:18.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:21:12, diff=6.869744s, valid=True
2026-06-04T08:21:18.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:21:18.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:21:18.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:21:18.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128275.870532s, valid=True
2026-06-04T08:21:18.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:21:18.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:21:18.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:21:18.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:21:18.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:21:18.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:21:18.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:21:18.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:21:19.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:21:19.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:21:19.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:21:19.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:21:19.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:21:19.259 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:21:19.471 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:21:19.818 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:21:19.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:21:19.932 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:21:19.932 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:21:20.166 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:21:20.166 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:21:50.195 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:21:50.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:21:50.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:21:50.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:21:50.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:21:50.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:21:50.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:21:50.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:21:50.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:21:50.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:21:50.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:21:50.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:21:50.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:21:53.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:21:53.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:21:53.456 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:21:53.456 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:21:53.467 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:21:53.479 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:21:53.480 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:21:53.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:21:53.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:21:53.481 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:21:53.482 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:21:53.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:21:53.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:21:53.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:21:53.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:21:53.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:21:53.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:21:53.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:21:53.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:21:53.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:21:53.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:21:53.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:21:53.811 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:21:53.881 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:21:48
2026-06-04T08:21:53.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88389, datetime.datetime(2026, 6, 4, 8, 21, 48), datetime.datetime(2026, 6, 4, 8, 21, 47), 'salt', 2.03, 100.68, None, 22.79, 159.69, -0.1, 822.09, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:21:53.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:21:53.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:21:53.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:21:47, diff=6.889181s, valid=True
2026-06-04T08:21:53.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:21:53.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:21:53.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:22:12, diff=-18.107398s, valid=True
2026-06-04T08:21:53.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:21:53.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:21:53.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:21:40, diff=13.900486s, valid=True
2026-06-04T08:21:53.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:21:53.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:21:53.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:21:53.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:21:53.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:21:53.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:21:53.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:22:12, diff=-18.095816s, valid=True
2026-06-04T08:21:53.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:21:53.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:21:53.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:21:53.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128310.904995s, valid=True
2026-06-04T08:21:53.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:21:53.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:21:53.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:21:53.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:21:53.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:21:53.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:21:53.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:21:53.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:21:53.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:21:54.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:21:54.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:21:54.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:21:54.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:21:54.224 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:21:54.436 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:21:54.781 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:21:54.881 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:21:54.882 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:21:54.882 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:21:55.076 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:21:55.076 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:22:25.100 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:22:25.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:22:25.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:22:25.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:22:25.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:22:25.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:22:25.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:22:25.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:22:25.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:22:25.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:22:25.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:22:25.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:22:25.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:22:28.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:22:28.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:22:28.145 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:22:28.145 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:22:28.155 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:22:28.168 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:22:28.168 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:22:28.169 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:22:28.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:22:28.169 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:22:28.169 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:22:28.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:22:28.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:22:28.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:22:28.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:22:28.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:22:28.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:22:28.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:22:28.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:22:28.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:22:28.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:22:28.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:22:28.506 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:22:28.577 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:22:19
2026-06-04T08:22:28.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88390, datetime.datetime(2026, 6, 4, 8, 22, 19), datetime.datetime(2026, 6, 4, 8, 22, 18), 'salt', 2.06, 100.74, None, 22.94, 169.21, -0.11, 822.15, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:22:28.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:22:28.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:22:28.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:22:18, diff=10.58549s, valid=True
2026-06-04T08:22:28.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:22:28.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:22:28.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:22:12, diff=16.589093s, valid=True
2026-06-04T08:22:28.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:22:28.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:22:28.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:22:10, diff=18.597478s, valid=True
2026-06-04T08:22:28.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:22:28.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:22:28.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:22:28.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:22:28.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:22:28.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:22:28.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:22:12, diff=16.60134s, valid=True
2026-06-04T08:22:28.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:22:28.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:22:28.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:22:28.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128345.602187s, valid=True
2026-06-04T08:22:28.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:22:28.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:22:28.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:22:28.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:22:28.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:22:28.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:22:28.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:22:28.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:22:28.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:22:28.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:22:28.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:22:28.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:22:28.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:22:28.924 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:22:29.137 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:22:29.484 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:22:29.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:22:29.586 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:22:29.586 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:22:29.785 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:22:29.785 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:22:59.815 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:22:59.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:22:59.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:22:59.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:22:59.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:23:00.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:23:00.163 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:23:00.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:23:00.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:23:00.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:23:00.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:23:00.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:23:00.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:23:02.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:23:02.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:23:02.855 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:23:02.855 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:23:02.866 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:23:02.879 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:23:02.879 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:23:02.880 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:23:02.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:23:02.880 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:23:02.881 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:23:02.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:23:03.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:23:03.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:23:03.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:23:03.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:23:03.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:23:03.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:23:03.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:23:03.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:23:03.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:23:03.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:23:03.212 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:23:03.285 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:22:49
2026-06-04T08:23:03.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88391, datetime.datetime(2026, 6, 4, 8, 22, 49), datetime.datetime(2026, 6, 4, 8, 22, 48), 'salt', 2.1, 100.78, None, 26.85, 154.59, -0.11, 822.02, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:23:03.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:23:03.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:23:03.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:22:48, diff=15.292442s, valid=True
2026-06-04T08:23:03.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:23:03.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:23:03.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:23:12, diff=-8.704029s, valid=True
2026-06-04T08:23:03.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:23:03.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:23:03.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:22:41, diff=22.30404s, valid=True
2026-06-04T08:23:03.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:23:03.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:23:03.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:23:03.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:23:03.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:23:03.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:23:03.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:23:12, diff=-8.692224s, valid=True
2026-06-04T08:23:03.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:23:03.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:23:03.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:23:03.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128380.308576s, valid=True
2026-06-04T08:23:03.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:23:03.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:23:03.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:23:03.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:23:03.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:23:03.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:23:03.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:23:03.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:23:03.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:23:03.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:23:03.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:23:03.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:23:03.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:23:03.627 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:23:03.838 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:23:04.241 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:23:04.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:23:04.342 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:23:04.342 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:23:04.539 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:23:04.539 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:23:34.558 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:23:34.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:23:34.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:23:34.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:23:34.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:23:34.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:23:34.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:23:34.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:23:34.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:23:34.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:23:34.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:23:34.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:23:34.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:23:37.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:23:37.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:23:37.657 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:23:37.657 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:23:37.667 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:23:37.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:23:37.680 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:23:37.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:23:37.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:23:37.681 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:23:37.682 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:23:37.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:23:37.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:23:37.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:23:37.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:23:37.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:23:37.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:23:37.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:23:38.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:23:38.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:23:38.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:23:38.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:23:38.024 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:23:38.095 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:23:19
2026-06-04T08:23:38.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88392, datetime.datetime(2026, 6, 4, 8, 23, 19), datetime.datetime(2026, 6, 4, 8, 23, 18), 'salt', 2.06, 100.64, None, 33.55, 162.09, -0.1, 822.02, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:23:38.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:23:38.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:23:38.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:23:18, diff=20.101666s, valid=True
2026-06-04T08:23:38.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:23:38.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:23:38.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:23:12, diff=26.104538s, valid=True
2026-06-04T08:23:38.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:23:38.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:23:38.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:23:11, diff=27.111194s, valid=True
2026-06-04T08:23:38.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:23:38.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:23:38.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:23:38.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:23:38.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:23:38.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:23:38.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:23:12, diff=26.114343s, valid=True
2026-06-04T08:23:38.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:23:38.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:23:38.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:23:38.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128415.115005s, valid=True
2026-06-04T08:23:38.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:23:38.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:23:38.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:23:38.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:23:38.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:23:38.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:23:38.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:23:38.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:23:38.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:23:38.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:23:38.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:23:38.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:23:38.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:23:38.432 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:23:38.648 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:23:39.024 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:23:39.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:23:39.127 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:23:39.127 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:23:39.317 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:23:39.317 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:24:09.347 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:24:09.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:24:09.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:24:09.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:24:09.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:24:09.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:24:09.728 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:24:09.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:24:09.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:24:09.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:24:09.746 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:24:09.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:24:09.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:24:12.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:24:12.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:24:12.302 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:24:12.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:24:12.313 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:24:12.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:24:12.330 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:24:12.330 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:24:12.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:24:12.331 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:24:12.331 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:24:12.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:24:12.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:24:12.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:24:12.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:24:12.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:24:12.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:24:12.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:24:12.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:24:12.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:24:12.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:24:12.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:24:12.674 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:24:12.747 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:23:49
2026-06-04T08:24:12.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88393, datetime.datetime(2026, 6, 4, 8, 23, 49), datetime.datetime(2026, 6, 4, 8, 23, 49), 'salt', 2.06, 100.74, None, 34.12, 150.65, -0.11, 821.9, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:24:12.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:24:12.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:24:12.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:23:49, diff=23.755279s, valid=True
2026-06-04T08:24:12.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:24:12.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:24:12.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:24:12, diff=0.758789s, valid=True
2026-06-04T08:24:12.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:24:12.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:24:12.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:23:41, diff=31.767138s, valid=True
2026-06-04T08:24:12.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:24:12.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:24:12.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:24:12.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:24:12.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:24:12.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:24:12.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:24:12, diff=0.770908s, valid=True
2026-06-04T08:24:12.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:24:12.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:24:12.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:24:12.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128449.771728s, valid=True
2026-06-04T08:24:12.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:24:12.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:24:12.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:24:12.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:24:12.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:24:12.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:24:12.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:24:12.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:24:12.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:24:12.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:24:12.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:24:13.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:24:13.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:24:13.096 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:24:13.384 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:24:13.734 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:24:13.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:24:13.836 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:24:13.836 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:24:14.011 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:24:14.011 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:24:44.027 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:24:44.027 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:24:44.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:24:44.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:24:44.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:24:44.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:24:44.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:24:44.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:24:44.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:24:44.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:24:44.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:24:44.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:24:44.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:24:47.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:24:47.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:24:47.371 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:24:47.371 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:24:47.381 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:24:47.394 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:24:47.394 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:24:47.395 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:24:47.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:24:47.396 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:24:47.396 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:24:47.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:24:47.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:24:47.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:24:47.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:24:47.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:24:47.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:24:47.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:24:47.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:24:47.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:24:47.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:24:47.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:24:47.738 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:24:47.810 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:24:20
2026-06-04T08:24:47.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88394, datetime.datetime(2026, 6, 4, 8, 24, 20), datetime.datetime(2026, 6, 4, 8, 24, 19), 'salt', 2.03, 100.74, None, 33.1, 165.21, -0.11, 822.15, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:24:47.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:24:47.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:24:47.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:24:19, diff=28.81846s, valid=True
2026-06-04T08:24:47.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:24:47.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:24:47.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:24:12, diff=35.822085s, valid=True
2026-06-04T08:24:47.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:24:47.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:24:47.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:24:11, diff=36.830616s, valid=True
2026-06-04T08:24:47.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:24:47.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:24:47.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:24:47.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:24:47.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:24:47.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:24:47.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:24:12, diff=35.834455s, valid=True
2026-06-04T08:24:47.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:24:47.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:24:47.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:24:47.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128484.835294s, valid=True
2026-06-04T08:24:47.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:24:47.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:24:47.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:24:47.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:24:47.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:24:47.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:24:47.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:24:47.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:24:47.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:24:47.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:24:48.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:24:48.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:24:48.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:24:48.160 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:24:48.371 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:24:48.715 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:24:48.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:24:48.816 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:24:48.816 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:24:49.003 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:24:49.003 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:25:19.007 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:25:19.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:25:19.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:25:19.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:25:19.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:25:19.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:25:19.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:25:19.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:25:19.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:25:19.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:25:19.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:25:19.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:25:19.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:25:22.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:25:22.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:25:22.219 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:25:22.219 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:25:22.232 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:25:22.245 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:25:22.246 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:25:22.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:25:22.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:25:22.247 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:25:22.247 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:25:22.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:25:22.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-06-04T08:25:22.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:25:22.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-06-04T08:25:22.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:25:22.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:25:22.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:25:22.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:25:22.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:25:22.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:25:22.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:25:22.580 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:25:22.654 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:25:20
2026-06-04T08:25:22.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88396, datetime.datetime(2026, 6, 4, 8, 25, 20), datetime.datetime(2026, 6, 4, 8, 25, 19), 'salt', 2.0, 100.68, None, 33.59, 167.37, -0.09, 821.96, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:25:22.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:25:22.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-06-04T08:25:22.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:25:19, diff=3.660729s, valid=True
2026-06-04T08:25:22.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:25:22.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:25:22.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:25:12, diff=10.66358s, valid=True
2026-06-04T08:25:22.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:25:22.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-06-04T08:25:22.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:25:12, diff=10.670193s, valid=True
2026-06-04T08:25:22.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:25:22.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:25:22.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:25:22.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:25:22.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:25:22.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:25:22.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:25:12, diff=10.673268s, valid=True
2026-06-04T08:25:22.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:25:22.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:25:22.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:25:22.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128519.673929s, valid=True
2026-06-04T08:25:22.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:25:22.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:25:22.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:25:22.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:25:22.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:25:22.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:25:22.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:25:22.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:25:22.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:25:22.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:25:22.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:25:22.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:25:23.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:25:23.121 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:25:23.333 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:25:23.680 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:25:23.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:25:23.783 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:25:23.783 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:25:24.042 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:25:24.042 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:25:54.062 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:25:54.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:25:54.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:25:54.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:25:54.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:25:54.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:25:54.477 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:25:54.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:25:54.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:25:54.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:25:54.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:25:54.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:25:54.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:25:57.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:25:57.197 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:25:57.198 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:25:57.198 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:25:57.209 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:25:57.222 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:25:57.222 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:25:57.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:25:57.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:25:57.224 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:25:57.224 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:25:57.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:25:57.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:25:57.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:25:57.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:25:57.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:25:57.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:25:57.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:25:57.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:25:57.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:25:57.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:25:57.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:25:57.569 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:25:57.641 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:25:50
2026-06-04T08:25:57.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88397, datetime.datetime(2026, 6, 4, 8, 25, 50), datetime.datetime(2026, 6, 4, 8, 25, 50), 'salt', 2.03, 100.74, None, 29.32, 167.94, -0.11, 822.21, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:25:57.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:25:57.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:25:57.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:25:50, diff=7.649323s, valid=True
2026-06-04T08:25:57.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:25:57.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:25:57.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:26:12, diff=-14.347166s, valid=True
2026-06-04T08:25:57.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:25:57.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:25:57.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:25:42, diff=15.661007s, valid=True
2026-06-04T08:25:57.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:25:57.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:25:57.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:25:57.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:25:57.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:25:57.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:25:57.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:26:12, diff=-14.335272s, valid=True
2026-06-04T08:25:57.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:25:57.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:25:57.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:25:57.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128554.665536s, valid=True
2026-06-04T08:25:57.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:25:57.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:25:57.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:25:57.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:25:57.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:25:57.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:25:57.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:25:57.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:25:57.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:25:57.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:25:57.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:25:57.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:25:57.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:25:57.986 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:25:58.199 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:25:58.548 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:25:58.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:25:58.649 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:25:58.650 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:25:58.874 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:25:58.874 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:26:28.894 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:26:28.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:26:28.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:26:29.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:26:29.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:26:29.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:26:29.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:26:29.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:26:29.485 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:26:29.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:26:29.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:26:29.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:26:29.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:26:32.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:26:32.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:26:32.181 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:26:32.182 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:26:32.192 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:26:32.219 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:26:32.220 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:26:32.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:26:32.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:26:32.221 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:26:32.221 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:26:32.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:26:32.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:26:32.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:26:32.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:26:32.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:26:32.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:26:32.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:26:32.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:26:32.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:26:32.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:26:32.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:26:32.597 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:26:32.677 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:26:21
2026-06-04T08:26:32.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88398, datetime.datetime(2026, 6, 4, 8, 26, 21), datetime.datetime(2026, 6, 4, 8, 26, 20), 'salt', 2.03, 100.78, None, 35.21, 164.06, -0.11, 822.09, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:26:32.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:26:32.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:26:32.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:26:20, diff=12.685321s, valid=True
2026-06-04T08:26:32.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:26:32.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:26:32.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:26:12, diff=20.688961s, valid=True
2026-06-04T08:26:32.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:26:32.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:26:32.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:26:13, diff=19.69751s, valid=True
2026-06-04T08:26:32.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:26:32.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:26:32.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:26:32.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:26:32.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:26:32.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:26:32.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:26:12, diff=20.701408s, valid=True
2026-06-04T08:26:32.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:26:32.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:26:32.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:26:32.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128589.702268s, valid=True
2026-06-04T08:26:32.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:26:32.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:26:32.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:26:32.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:26:32.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:26:32.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:26:32.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:26:32.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:26:32.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:26:32.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:26:32.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:26:33.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:26:33.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:26:33.092 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:26:33.306 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:26:33.653 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:26:33.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:26:33.755 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:26:33.755 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:26:33.944 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:26:33.944 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:27:03.945 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:27:03.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:27:03.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:27:04.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:27:04.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:27:04.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:27:04.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:27:04.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:27:04.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:27:04.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:27:04.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:27:04.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:27:04.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:27:06.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:27:06.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:27:06.886 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:27:06.886 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:27:06.897 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:27:06.911 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:27:06.911 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:27:06.912 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:27:06.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:27:06.913 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:27:06.913 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:27:06.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:27:07.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:27:07.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:27:07.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:27:07.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:27:07.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:27:07.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:27:07.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:27:07.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:27:07.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:27:07.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:27:07.242 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:27:07.325 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:26:51
2026-06-04T08:27:07.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88399, datetime.datetime(2026, 6, 4, 8, 26, 51), datetime.datetime(2026, 6, 4, 8, 26, 50), 'salt', 2.0, 100.71, None, 36.45, 150.69, -0.1, 821.96, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:27:07.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:27:07.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:27:07.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:26:50, diff=17.332934s, valid=True
2026-06-04T08:27:07.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:27:07.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:27:07.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:27:12, diff=-4.663534s, valid=True
2026-06-04T08:27:07.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:27:07.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:27:07.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:26:43, diff=24.34461s, valid=True
2026-06-04T08:27:07.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:27:07.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:27:07.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:27:07.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:27:07.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:27:07.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:27:07.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:27:12, diff=-4.651627s, valid=True
2026-06-04T08:27:07.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:27:07.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:27:07.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:27:07.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128624.349197s, valid=True
2026-06-04T08:27:07.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:27:07.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:27:07.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:27:07.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:27:07.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:27:07.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:27:07.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:27:07.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:27:07.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:27:07.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:27:07.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:27:07.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:27:07.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:27:07.669 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:27:07.881 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:27:08.226 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:27:08.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:27:08.327 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:27:08.327 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:27:08.515 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:27:08.515 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:27:38.525 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:27:38.525 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:27:38.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:27:38.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:27:38.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:27:39.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:27:39.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:27:39.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:27:39.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:27:39.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:27:39.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:27:39.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:27:39.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:27:41.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:27:41.671 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:27:41.672 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:27:41.672 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:27:41.684 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:27:41.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:27:41.698 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:27:41.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:27:41.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:27:41.699 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:27:41.699 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:27:41.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:27:41.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:27:41.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:27:41.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:27:41.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:27:41.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:27:41.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:27:42.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:27:42.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:27:42.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:27:42.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:27:42.032 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:27:42.107 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:27:21
2026-06-04T08:27:42.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88400, datetime.datetime(2026, 6, 4, 8, 27, 21), datetime.datetime(2026, 6, 4, 8, 27, 20), 'salt', 2.03, 100.74, None, 29.82, 162.72, -0.11, 822.09, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:27:42.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:27:42.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:27:42.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:27:20, diff=22.114464s, valid=True
2026-06-04T08:27:42.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:27:42.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:27:42.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:27:12, diff=30.117997s, valid=True
2026-06-04T08:27:42.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:27:42.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:27:42.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:27:13, diff=29.126235s, valid=True
2026-06-04T08:27:42.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:27:42.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:27:42.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:27:42.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:27:42.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:27:42.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:27:42.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:27:12, diff=30.129999s, valid=True
2026-06-04T08:27:42.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:27:42.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:27:42.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:27:42.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128659.130828s, valid=True
2026-06-04T08:27:42.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:27:42.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:27:42.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:27:42.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:27:42.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:27:42.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:27:42.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:27:42.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:27:42.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:27:42.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:27:42.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:27:42.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:27:42.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:27:42.521 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:27:42.735 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:27:43.083 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:27:43.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:27:43.186 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:27:43.186 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:27:43.448 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:27:43.448 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:28:13.461 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:28:13.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:28:13.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:28:13.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:28:13.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:28:13.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:28:13.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:28:13.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:28:13.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:28:13.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:28:13.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:28:13.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:28:13.882 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:28:16.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:28:16.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:28:16.535 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:28:16.535 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:28:16.546 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:28:16.562 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:28:16.563 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:28:16.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:28:16.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:28:16.564 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:28:16.564 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:28:16.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:28:16.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:28:16.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:28:16.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:28:16.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:28:16.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:28:16.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:28:16.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:28:16.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:28:16.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:28:16.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:28:16.889 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:28:16.963 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:27:51
2026-06-04T08:28:16.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88401, datetime.datetime(2026, 6, 4, 8, 27, 51), datetime.datetime(2026, 6, 4, 8, 27, 51), 'salt', 2.0, 100.68, None, 29.14, 153.63, -0.09, 822.09, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:28:16.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:28:16.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:28:16.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:27:51, diff=25.970355s, valid=True
2026-06-04T08:28:16.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:28:16.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:28:16.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:28:12, diff=4.973899s, valid=True
2026-06-04T08:28:16.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:28:16.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:28:16.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:27:43, diff=33.982023s, valid=True
2026-06-04T08:28:16.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:28:16.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:28:16.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:28:16.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:28:16.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:28:16.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:28:16.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:28:12, diff=4.985811s, valid=True
2026-06-04T08:28:16.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:28:16.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:28:16.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:28:16.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128693.986629s, valid=True
2026-06-04T08:28:16.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:28:16.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:28:16.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:28:16.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:28:16.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:28:17.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:28:17.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:28:17.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:28:17.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:28:17.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:28:17.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:28:17.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:28:17.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:28:17.309 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:28:17.522 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:28:17.869 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:28:17.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:28:17.972 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:28:17.972 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:28:18.161 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:28:18.161 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:28:48.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:28:48.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:28:48.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:28:48.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:28:48.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:28:48.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:28:48.806 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:28:48.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:28:48.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:28:48.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:28:48.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:28:48.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:28:48.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:28:51.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:28:51.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:28:51.504 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:28:51.504 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:28:51.514 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:28:51.527 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:28:51.528 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:28:51.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:28:51.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:28:51.529 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:28:51.529 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:28:51.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:28:51.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:28:51.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:28:51.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:28:51.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:28:51.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:28:51.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:28:51.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:28:51.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:28:51.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:28:51.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:28:51.875 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:28:51.952 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:28:22
2026-06-04T08:28:51.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88402, datetime.datetime(2026, 6, 4, 8, 28, 22), datetime.datetime(2026, 6, 4, 8, 28, 21), 'salt', 2.06, 100.74, None, 33.31, 151.14, -0.11, 822.09, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:28:51.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:28:51.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:28:51.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:28:21, diff=30.959951s, valid=True
2026-06-04T08:28:51.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:28:51.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:28:51.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:28:12, diff=39.963607s, valid=True
2026-06-04T08:28:51.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:28:51.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:28:51.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:28:14, diff=37.972168s, valid=True
2026-06-04T08:28:51.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:28:51.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:28:51.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:28:51.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:28:51.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:28:51.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:28:51.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:28:12, diff=39.976082s, valid=True
2026-06-04T08:28:51.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:28:51.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:28:51.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:28:51.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128728.976925s, valid=True
2026-06-04T08:28:51.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:28:51.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:28:51.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:28:51.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:28:51.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:28:52.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:28:52.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:28:52.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:28:52.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:28:52.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:28:52.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:28:52.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:28:52.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:28:52.297 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:28:52.515 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:28:52.862 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:28:52.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:28:52.964 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:28:52.965 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:28:53.152 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:28:53.152 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:29:23.152 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:29:23.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:29:23.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:29:23.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:29:23.310 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:29:23.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:29:23.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:29:23.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:29:23.545 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:29:23.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:29:23.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:29:23.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:29:23.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:29:26.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:29:26.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:29:26.254 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:29:26.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:29:26.267 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:29:26.279 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:29:26.280 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:29:26.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:29:26.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:29:26.281 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:29:26.281 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:29:26.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:29:26.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:29:26.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:29:26.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:29:26.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:29:26.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:29:26.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:29:26.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:29:26.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:29:26.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:29:26.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:29:26.609 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:29:26.681 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:29:22
2026-06-04T08:29:26.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88404, datetime.datetime(2026, 6, 4, 8, 29, 22), datetime.datetime(2026, 6, 4, 8, 29, 21), 'salt', 2.06, 100.74, None, 36.62, 146.84, -0.11, 822.09, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:29:26.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:29:26.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:29:26.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:29:21, diff=5.689108s, valid=True
2026-06-04T08:29:26.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:29:26.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:29:26.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:29:12, diff=14.692704s, valid=True
2026-06-04T08:29:26.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:29:26.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:29:26.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:29:14, diff=12.700914s, valid=True
2026-06-04T08:29:26.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:29:26.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:29:26.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:29:26.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:29:26.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:29:26.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:29:26.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:29:12, diff=14.704674s, valid=True
2026-06-04T08:29:26.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:29:26.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:29:26.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:29:26.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128763.705486s, valid=True
2026-06-04T08:29:26.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:29:26.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:29:26.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:29:26.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:29:26.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:29:26.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:29:26.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:29:26.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:29:26.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:29:26.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:29:26.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:29:26.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:29:26.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:29:27.029 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:29:27.240 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:29:27.641 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:29:27.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:29:27.742 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:29:27.742 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:29:27.958 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:29:27.958 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:29:57.988 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:29:57.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:29:57.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:29:58.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:29:58.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:29:58.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:29:58.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:29:58.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:29:58.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:29:58.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:29:58.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:29:58.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:29:58.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:30:00.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:30:00.953 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:30:00.954 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:30:00.955 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:30:00.964 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:30:00.977 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:30:00.977 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:30:00.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:30:00.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:30:00.978 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:30:00.979 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:30:00.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:30:01.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:30:01.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:30:01.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:30:01.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:30:01.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:30:01.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:30:01.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:30:01.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:30:01.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:30:01.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:30:01.312 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:30:01.383 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:29:52
2026-06-04T08:30:01.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88405, datetime.datetime(2026, 6, 4, 8, 29, 52), datetime.datetime(2026, 6, 4, 8, 29, 52), 'salt', 1.97, 100.74, None, 23.15, 151.75, -0.1, 822.15, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:30:01.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:30:01.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:30:01.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:29:52, diff=9.389758s, valid=True
2026-06-04T08:30:01.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:30:01.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:30:01.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:30:12, diff=-10.607384s, valid=True
2026-06-04T08:30:01.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:30:01.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:30:01.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:29:44, diff=17.399295s, valid=True
2026-06-04T08:30:01.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:30:01.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:30:01.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:30:01.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:30:01.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:30:01.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:30:01.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:30:12, diff=-10.596994s, valid=True
2026-06-04T08:30:01.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:30:01.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:30:01.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:30:01.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128798.403816s, valid=True
2026-06-04T08:30:01.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:30:01.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:30:01.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:30:01.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:30:01.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:30:01.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:30:01.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:30:01.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:30:01.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:30:01.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:30:01.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:30:01.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:30:01.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:30:01.856 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:30:02.115 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:30:02.463 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:30:02.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:30:02.563 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:30:02.563 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:30:02.739 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:30:02.739 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:30:32.768 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:30:32.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:30:32.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:30:32.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:30:32.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:30:33.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:30:33.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:30:33.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:30:33.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:30:33.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:30:33.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:30:33.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:30:33.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:30:35.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:30:35.857 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:30:35.857 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:30:35.857 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:30:35.866 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:30:35.878 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:30:35.878 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:30:35.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:30:35.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:30:35.879 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:30:35.879 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:30:35.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:30:36.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:30:36.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:30:36.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:30:36.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:30:36.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:30:36.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:30:36.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:30:36.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:30:36.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:30:36.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:30:36.232 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:30:36.308 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:30:23
2026-06-04T08:30:36.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88406, datetime.datetime(2026, 6, 4, 8, 30, 23), datetime.datetime(2026, 6, 4, 8, 30, 22), 'salt', 2.0, 100.74, None, 34.08, 144.87, -0.1, 822.09, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:30:36.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:30:36.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:30:36.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:30:22, diff=14.316394s, valid=True
2026-06-04T08:30:36.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:30:36.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:30:36.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:30:12, diff=24.320102s, valid=True
2026-06-04T08:30:36.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:30:36.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:30:36.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:30:15, diff=21.328563s, valid=True
2026-06-04T08:30:36.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:30:36.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:30:36.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:30:36.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:30:36.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:30:36.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:30:36.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:30:12, diff=24.332478s, valid=True
2026-06-04T08:30:36.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:30:36.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:30:36.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:30:36.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128833.333339s, valid=True
2026-06-04T08:30:36.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:30:36.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:30:36.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:30:36.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:30:36.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:30:36.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:30:36.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:30:36.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:30:36.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:30:36.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:30:36.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:30:36.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:30:36.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:30:36.655 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:30:36.946 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:30:37.292 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:30:37.395 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:30:37.395 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:30:37.395 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:30:37.575 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:30:37.575 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:31:07.584 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:31:07.584 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:31:07.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:31:08.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:31:08.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:31:08.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:31:08.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:31:08.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:31:08.363 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:31:08.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:31:08.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:31:08.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:31:08.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:31:11.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:31:11.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:31:11.230 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:31:11.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:31:11.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:31:11.255 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:31:11.255 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:31:11.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:31:11.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:31:11.256 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:31:11.256 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:31:11.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:31:11.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:31:11.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:31:11.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:31:11.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:31:11.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:31:11.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:31:11.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:31:11.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:31:11.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:31:11.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:31:11.592 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:31:11.664 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:30:53
2026-06-04T08:31:11.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88407, datetime.datetime(2026, 6, 4, 8, 30, 53), datetime.datetime(2026, 6, 4, 8, 30, 52), 'salt', 2.03, 100.78, None, 35.28, 148.63, -0.11, 822.02, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:31:11.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:31:11.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:31:11.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:30:52, diff=19.672043s, valid=True
2026-06-04T08:31:11.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:31:11.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:31:11.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:31:12, diff=-0.324325s, valid=True
2026-06-04T08:31:11.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:31:11.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:31:11.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:30:45, diff=26.684111s, valid=True
2026-06-04T08:31:11.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:31:11.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:31:11.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:31:11.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:31:11.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:31:11.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:31:11.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:31:12, diff=-0.312014s, valid=True
2026-06-04T08:31:11.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:31:11.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:31:11.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:31:11.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128868.688842s, valid=True
2026-06-04T08:31:11.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:31:11.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:31:11.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:31:11.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:31:11.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:31:11.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:31:11.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:31:11.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:31:11.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:31:11.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:31:11.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:31:11.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:31:11.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:31:12.017 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:31:12.231 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:31:12.577 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:31:12.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:31:12.678 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:31:12.678 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:31:12.858 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:31:12.858 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:31:42.888 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:31:42.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:31:42.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:31:43.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:31:43.212 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:31:43.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:31:43.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:31:43.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:31:43.461 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:31:43.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:31:43.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:31:43.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:31:43.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:31:46.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:31:46.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:31:46.188 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:31:46.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:31:46.198 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:31:46.211 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:31:46.211 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:31:46.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:31:46.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:31:46.212 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:31:46.213 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:31:46.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:31:46.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:31:46.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:31:46.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:31:46.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:31:46.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:31:46.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:31:46.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:31:46.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:31:46.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:31:46.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:31:46.574 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:31:46.659 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:31:23
2026-06-04T08:31:46.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88408, datetime.datetime(2026, 6, 4, 8, 31, 23), datetime.datetime(2026, 6, 4, 8, 31, 23), 'salt', 2.06, 100.74, None, 31.09, 158.99, -0.11, 822.02, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:31:46.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:31:46.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:31:46.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:31:23, diff=23.666902s, valid=True
2026-06-04T08:31:46.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:31:46.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:31:46.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:31:12, diff=34.670554s, valid=True
2026-06-04T08:31:46.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:31:46.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:31:46.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:31:15, diff=31.678983s, valid=True
2026-06-04T08:31:46.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:31:46.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:31:46.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:31:46.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:31:46.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:31:46.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:31:46.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:31:12, diff=34.682886s, valid=True
2026-06-04T08:31:46.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:31:46.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:31:46.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:31:46.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128903.683745s, valid=True
2026-06-04T08:31:46.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:31:46.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:31:46.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:31:46.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:31:46.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:31:46.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:31:46.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:31:46.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:31:46.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:31:46.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:31:46.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:31:46.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:31:47.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:31:47.073 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:31:47.288 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:31:47.637 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:31:47.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:31:47.739 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:31:47.740 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:31:47.988 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:31:47.988 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:32:17.993 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:32:17.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:32:17.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:32:18.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:32:18.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:32:18.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:32:18.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:32:18.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:32:18.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:32:18.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:32:18.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:32:18.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:32:18.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:32:21.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:32:21.463 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:32:21.464 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:32:21.464 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:32:21.474 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:32:21.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:32:21.488 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:32:21.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:32:21.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:32:21.489 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:32:21.489 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:32:21.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:32:21.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:32:21.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:32:21.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:32:21.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:32:21.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:32:21.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:32:21.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:32:21.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:32:21.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:32:21.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:32:21.847 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:32:21.929 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:31:54
2026-06-04T08:32:21.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88409, datetime.datetime(2026, 6, 4, 8, 31, 54), datetime.datetime(2026, 6, 4, 8, 31, 53), 'salt', 2.06, 100.74, None, 39.23, 162.91, -0.11, 821.96, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:32:21.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:32:21.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:32:21.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:31:53, diff=28.93696s, valid=True
2026-06-04T08:32:21.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:32:21.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:32:21.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:32:12, diff=9.940464s, valid=True
2026-06-04T08:32:21.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:32:21.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:32:21.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:31:45, diff=36.948738s, valid=True
2026-06-04T08:32:21.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:32:21.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:32:21.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:32:21.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:32:21.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:32:21.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:32:21.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:32:12, diff=9.952491s, valid=True
2026-06-04T08:32:21.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:32:21.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:32:21.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:32:21.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128938.953314s, valid=True
2026-06-04T08:32:21.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:32:21.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:32:21.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:32:21.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:32:21.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:32:22.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:32:22.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:32:22.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:32:22.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:32:22.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:32:22.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:32:22.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:32:22.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:32:22.272 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:32:22.482 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:32:22.826 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:32:22.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:32:22.928 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:32:22.928 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:32:23.594 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:32:23.594 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:32:53.598 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:32:53.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:32:53.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:32:54.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:32:54.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:32:54.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:32:54.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:32:54.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:32:54.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:32:54.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:32:54.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:32:54.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:32:54.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:32:57.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:32:57.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:32:57.297 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:32:57.297 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:32:57.308 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:32:57.321 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:32:57.322 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:32:57.322 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:32:57.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:32:57.323 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:32:57.323 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:32:57.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:32:57.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-06-04T08:32:57.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:32:57.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-06-04T08:32:57.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:32:57.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T08:32:57.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:32:57.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T08:32:57.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:32:57.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:32:57.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:32:57.664 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:32:57.749 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:32:54
2026-06-04T08:32:57.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88411, datetime.datetime(2026, 6, 4, 8, 32, 54), datetime.datetime(2026, 6, 4, 8, 32, 53), 'salt', 2.1, 100.68, None, 26.11, 165.99, -0.09, 822.15, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:32:57.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:32:57.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-06-04T08:32:57.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:32:53, diff=4.75706s, valid=True
2026-06-04T08:32:57.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:32:57.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T08:32:57.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:33:12, diff=-14.239452s, valid=True
2026-06-04T08:32:57.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:32:57.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-06-04T08:32:57.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:32:46, diff=11.768821s, valid=True
2026-06-04T08:32:57.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:32:57.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:32:57.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:32:57.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:32:57.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:32:57.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T08:32:57.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:33:12, diff=-14.227448s, valid=True
2026-06-04T08:32:57.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:32:57.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:32:57.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:32:57.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=128974.773383s, valid=True
2026-06-04T08:32:57.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:32:57.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:32:57.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:32:57.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:32:57.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:32:57.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:32:57.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:32:57.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:32:57.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:32:57.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:32:58.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:32:58.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:32:58.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:32:58.160 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:32:58.372 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:32:58.717 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:32:58.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:32:58.818 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:32:58.818 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:32:59.066 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:32:59.066 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:33:29.097 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:33:29.097 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:33:29.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:33:29.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:33:29.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:33:29.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:33:29.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:33:29.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:33:29.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:33:29.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:33:29.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:33:29.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:33:29.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:33:32.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:33:32.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:33:32.342 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:33:32.343 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:33:32.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:33:32.365 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:33:32.366 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:33:32.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:33:32.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:33:32.367 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:33:32.367 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:33:32.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:33:32.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:33:32.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:33:32.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:33:32.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:33:32.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:33:32.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:33:32.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:33:32.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:33:32.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:33:32.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:33:32.742 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:33:32.827 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:33:24
2026-06-04T08:33:32.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88412, datetime.datetime(2026, 6, 4, 8, 33, 24), datetime.datetime(2026, 6, 4, 8, 33, 23), 'salt', 2.06, 100.68, None, 20.92, 157.27, -0.1, 822.15, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:33:32.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:33:32.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:33:32.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:33:23, diff=9.834986s, valid=True
2026-06-04T08:33:32.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:33:32.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:33:32.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:33:12, diff=20.838613s, valid=True
2026-06-04T08:33:32.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:33:32.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:33:32.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:33:16, diff=16.847248s, valid=True
2026-06-04T08:33:32.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:33:32.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:33:32.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:33:32.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:33:32.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:33:32.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:33:32.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:33:12, diff=20.851163s, valid=True
2026-06-04T08:33:32.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:33:32.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:33:32.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:33:32.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129009.85201s, valid=True
2026-06-04T08:33:32.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:33:32.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:33:32.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:33:32.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:33:32.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:33:32.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:33:32.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:33:32.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:33:32.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:33:32.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:33:33.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:33:33.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:33:33.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:33:33.185 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:33:33.401 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:33:33.747 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:33:33.849 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:33:33.849 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:33:33.849 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:33:34.040 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:33:34.040 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:34:04.055 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:34:04.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:34:04.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:34:04.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:34:04.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:34:04.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:34:04.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:34:04.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:34:04.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:34:04.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:34:04.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:34:04.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:34:04.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:34:07.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:34:07.081 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:34:07.082 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:34:07.082 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:34:07.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:34:07.105 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:34:07.106 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:34:07.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:34:07.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:34:07.107 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:34:07.107 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:34:07.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:34:07.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:34:07.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:34:07.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:34:07.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:34:07.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:34:07.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:34:07.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:34:07.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:34:07.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:34:07.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:34:07.458 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:34:07.554 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:33:54
2026-06-04T08:34:07.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88413, datetime.datetime(2026, 6, 4, 8, 33, 54), datetime.datetime(2026, 6, 4, 8, 33, 54), 'salt', 2.1, 100.71, None, 24.21, 165.97, -0.1, 822.15, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:34:07.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:34:07.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:34:07.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:33:54, diff=13.562232s, valid=True
2026-06-04T08:34:07.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:34:07.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:34:07.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:34:12, diff=-4.434172s, valid=True
2026-06-04T08:34:07.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:34:07.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:34:07.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:33:46, diff=21.574249s, valid=True
2026-06-04T08:34:07.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:34:07.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:34:07.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:34:07.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:34:07.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:34:07.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:34:07.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:34:12, diff=-4.421885s, valid=True
2026-06-04T08:34:07.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:34:07.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:34:07.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:34:07.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129044.578955s, valid=True
2026-06-04T08:34:07.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:34:07.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:34:07.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:34:07.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:34:07.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:34:07.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:34:07.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:34:07.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:34:07.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:34:07.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:34:07.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:34:07.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:34:07.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:34:07.900 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:34:08.115 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:34:08.462 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:34:08.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:34:08.564 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:34:08.564 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:34:08.729 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:34:08.729 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:34:38.759 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:34:38.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:34:38.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:34:38.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:34:38.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:34:39.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:34:39.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:34:39.132 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:34:39.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:34:39.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:34:39.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:34:39.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:34:39.147 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:34:41.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:34:41.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:34:41.655 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:34:41.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:34:41.665 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:34:41.678 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:34:41.679 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:34:41.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:34:41.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:34:41.680 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:34:41.680 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:34:41.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:34:41.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:34:41.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:34:41.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:34:41.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:34:41.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:34:41.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:34:42.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:34:42.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:34:42.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:34:42.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:34:42.037 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:34:42.122 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:34:25
2026-06-04T08:34:42.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88414, datetime.datetime(2026, 6, 4, 8, 34, 25), datetime.datetime(2026, 6, 4, 8, 34, 24), 'salt', 2.13, 100.68, None, 35.74, 157.6, -0.1, 822.02, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:34:42.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:34:42.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:34:42.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:34:24, diff=18.130375s, valid=True
2026-06-04T08:34:42.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:34:42.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:34:42.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:34:12, diff=30.133955s, valid=True
2026-06-04T08:34:42.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:34:42.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:34:42.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:34:17, diff=25.142121s, valid=True
2026-06-04T08:34:42.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:34:42.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:34:42.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:34:42.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:34:42.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:34:42.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:34:42.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:34:12, diff=30.145859s, valid=True
2026-06-04T08:34:42.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:34:42.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:34:42.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:34:42.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129079.146663s, valid=True
2026-06-04T08:34:42.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:34:42.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:34:42.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:34:42.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:34:42.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:34:42.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:34:42.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:34:42.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:34:42.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:34:42.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:34:42.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:34:42.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:34:42.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:34:42.467 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:34:42.678 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:34:43.081 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:34:43.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:34:43.182 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:34:43.182 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:34:43.361 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:34:43.361 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:35:13.391 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:35:13.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:35:13.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:35:13.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:35:13.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:35:14.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:35:14.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:35:14.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:35:14.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:35:14.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:35:14.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:35:14.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:35:14.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:35:17.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:35:17.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:35:17.040 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:35:17.040 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:35:17.051 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:35:17.064 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:35:17.065 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:35:17.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:35:17.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:35:17.066 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:35:17.066 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:35:17.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:35:17.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:35:17.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:35:17.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:35:17.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:35:17.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:35:17.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:35:17.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:35:17.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:35:17.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:35:17.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:35:17.424 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:35:17.500 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:34:55
2026-06-04T08:35:17.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88415, datetime.datetime(2026, 6, 4, 8, 34, 55), datetime.datetime(2026, 6, 4, 8, 34, 54), 'salt', 2.1, 100.74, None, 24.17, 159.46, -0.1, 822.15, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:35:17.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:35:17.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:35:17.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:34:54, diff=23.508462s, valid=True
2026-06-04T08:35:17.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:35:17.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:35:17.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:35:12, diff=5.512123s, valid=True
2026-06-04T08:35:17.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:35:17.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:35:17.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:34:47, diff=30.520555s, valid=True
2026-06-04T08:35:17.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:35:17.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:35:17.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:35:17.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:35:17.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:35:17.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:35:17.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:35:12, diff=5.524436s, valid=True
2026-06-04T08:35:17.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:35:17.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:35:17.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:35:17.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129114.52528s, valid=True
2026-06-04T08:35:17.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:35:17.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:35:17.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:35:17.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:35:17.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:35:17.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:35:17.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:35:17.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:35:17.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:35:17.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:35:17.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:35:17.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:35:17.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:35:17.847 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:35:18.060 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:35:18.407 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:35:18.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:35:18.508 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:35:18.508 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:35:18.765 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:35:18.765 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:35:48.775 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:35:48.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:35:48.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:35:49.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:35:49.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:35:49.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:35:49.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:35:49.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:35:49.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:35:49.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:35:49.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:35:49.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:35:49.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:35:52.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:35:52.249 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:35:52.250 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:35:52.250 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:35:52.260 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:35:52.272 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:35:52.273 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:35:52.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:35:52.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:35:52.274 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:35:52.274 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:35:52.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:35:52.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:35:52.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:35:52.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:35:52.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:35:52.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:35:52.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:35:52.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:35:52.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:35:52.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:35:52.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:35:52.611 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:35:52.683 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:35:25
2026-06-04T08:35:52.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88416, datetime.datetime(2026, 6, 4, 8, 35, 25), datetime.datetime(2026, 6, 4, 8, 35, 24), 'salt', 2.06, 100.68, None, 28.97, 146.7, -0.1, 822.21, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:35:52.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:35:52.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:35:52.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:35:24, diff=28.691269s, valid=True
2026-06-04T08:35:52.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:35:52.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:35:52.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:35:12, diff=40.69488s, valid=True
2026-06-04T08:35:52.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:35:52.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:35:52.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:35:17, diff=35.703223s, valid=True
2026-06-04T08:35:52.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:35:52.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:35:52.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:35:52.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:35:52.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:35:52.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:35:52.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:35:12, diff=40.707005s, valid=True
2026-06-04T08:35:52.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:35:52.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:35:52.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:35:52.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129149.707823s, valid=True
2026-06-04T08:35:52.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:35:52.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:35:52.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:35:52.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:35:52.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:35:52.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:35:52.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:35:52.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:35:52.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:35:52.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:35:52.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:35:52.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:35:52.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:35:53.030 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:35:53.313 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:35:53.657 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:35:53.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:35:53.759 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:35:53.759 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:35:54.035 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:35:54.035 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:36:24.038 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:36:24.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:36:24.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:36:24.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:36:24.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:36:24.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:36:24.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:36:24.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:36:24.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:36:24.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:36:24.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:36:24.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:36:24.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:36:27.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:36:27.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:36:27.116 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:36:27.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:36:27.124 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:36:27.136 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:36:27.136 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:36:27.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:36:27.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:36:27.137 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:36:27.137 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:36:27.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:36:27.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-06-04T08:36:27.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:36:27.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-06-04T08:36:27.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:36:27.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:36:27.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:36:27.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:36:27.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:36:27.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:36:27.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:36:27.478 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:36:27.553 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:36:26
2026-06-04T08:36:27.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88418, datetime.datetime(2026, 6, 4, 8, 36, 26), datetime.datetime(2026, 6, 4, 8, 36, 25), 'salt', 2.13, 100.71, None, 29.82, 181.94, -0.1, 822.15, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:36:27.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:36:27.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-06-04T08:36:27.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:36:25, diff=2.560676s, valid=True
2026-06-04T08:36:27.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:36:27.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:36:27.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:36:12, diff=15.564183s, valid=True
2026-06-04T08:36:27.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:36:27.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-06-04T08:36:27.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:36:18, diff=9.572394s, valid=True
2026-06-04T08:36:27.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:36:27.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:36:27.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:36:27.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:36:27.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:36:27.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:36:27.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:36:12, diff=15.576174s, valid=True
2026-06-04T08:36:27.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:36:27.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:36:27.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:36:27.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129184.577008s, valid=True
2026-06-04T08:36:27.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:36:27.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:36:27.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:36:27.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:36:27.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:36:27.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:36:27.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:36:27.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:36:27.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:36:27.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:36:27.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:36:27.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:36:27.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:36:27.900 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:36:28.113 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:36:28.460 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:36:28.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:36:28.562 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:36:28.562 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:36:28.716 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:36:28.716 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:36:58.734 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:36:58.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:36:58.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:36:59.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:36:59.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:36:59.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:36:59.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:36:59.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:36:59.477 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:36:59.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:36:59.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:36:59.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:36:59.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:37:02.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:37:02.132 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:37:02.133 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:37:02.133 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:37:02.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:37:02.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:37:02.157 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:37:02.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:37:02.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:37:02.158 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:37:02.159 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:37:02.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:37:02.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:37:02.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:37:02.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:37:02.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:37:02.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:37:02.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:37:02.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:37:02.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:37:02.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:37:02.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:37:02.508 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:37:02.584 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:36:56
2026-06-04T08:37:02.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88419, datetime.datetime(2026, 6, 4, 8, 36, 56), datetime.datetime(2026, 6, 4, 8, 36, 56), 'salt', 2.13, 100.78, None, 33.06, 161.95, -0.11, 822.15, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:37:02.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:37:02.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:37:02.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:36:56, diff=6.591825s, valid=True
2026-06-04T08:37:02.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:37:02.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:37:02.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:37:12, diff=-9.404504s, valid=True
2026-06-04T08:37:02.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:37:02.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:37:02.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:36:48, diff=14.604166s, valid=True
2026-06-04T08:37:02.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:37:02.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:37:02.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:37:02.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:37:02.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:37:02.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:37:02.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:37:12, diff=-9.391874s, valid=True
2026-06-04T08:37:02.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:37:02.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:37:02.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:37:02.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129219.609003s, valid=True
2026-06-04T08:37:02.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:37:02.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:37:02.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:37:02.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:37:02.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:37:02.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:37:02.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:37:02.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:37:02.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:37:02.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:37:02.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:37:02.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:37:02.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:37:03.005 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:37:03.209 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:37:03.549 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:37:03.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:37:03.649 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:37:03.649 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:37:03.804 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:37:03.804 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:37:33.814 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:37:33.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:37:33.814 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:37:33.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:37:33.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:37:34.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:37:34.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:37:34.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:37:34.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:37:34.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:37:34.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:37:34.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:37:34.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:37:36.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:37:36.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:37:36.969 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:37:36.970 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:37:36.980 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:37:36.992 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:37:36.993 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:37:36.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:37:36.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:37:36.994 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:37:36.994 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:37:37.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:37:37.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:37:37.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:37:37.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:37:37.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:37:37.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:37:37.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:37:37.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:37:37.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:37:37.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:37:37.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:37:37.342 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:37:37.413 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:37:27
2026-06-04T08:37:37.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88420, datetime.datetime(2026, 6, 4, 8, 37, 27), datetime.datetime(2026, 6, 4, 8, 37, 26), 'salt', 2.16, 100.68, None, 29.18, 159.06, -0.1, 822.15, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:37:37.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:37:37.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:37:37.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:37:26, diff=11.421199s, valid=True
2026-06-04T08:37:37.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:37:37.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:37:37.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:37:12, diff=25.42487s, valid=True
2026-06-04T08:37:37.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:37:37.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:37:37.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:37:18, diff=19.433473s, valid=True
2026-06-04T08:37:37.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:37:37.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:37:37.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:37:37.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:37:37.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:37:37.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:37:37.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:37:12, diff=25.437444s, valid=True
2026-06-04T08:37:37.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:37:37.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:37:37.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:37:37.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129254.438304s, valid=True
2026-06-04T08:37:37.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:37:37.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:37:37.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:37:37.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:37:37.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:37:37.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:37:37.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:37:37.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:37:37.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:37:37.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:37:37.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:37:37.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:37:37.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:37:37.761 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:37:37.965 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:37:38.306 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:37:38.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:37:38.407 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:37:38.407 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:37:38.564 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:37:38.565 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:38:08.571 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:38:08.571 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:38:08.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:38:09.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:38:09.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:38:09.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:38:09.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:38:09.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:38:09.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:38:09.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:38:09.310 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:38:09.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:38:09.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:38:12.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:38:12.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:38:12.058 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:38:12.058 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:38:12.069 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:38:12.083 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:38:12.083 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:38:12.084 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:38:12.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:38:12.084 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:38:12.084 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:38:12.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:38:12.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:38:12.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:38:12.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:38:12.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:38:12.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:38:12.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:38:12.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:38:12.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:38:12.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:38:12.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:38:12.421 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:38:12.493 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:37:57
2026-06-04T08:38:12.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88421, datetime.datetime(2026, 6, 4, 8, 37, 57), datetime.datetime(2026, 6, 4, 8, 37, 56), 'salt', 2.13, 100.68, None, 30.06, 157.65, -0.1, 822.27, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:38:12.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:38:12.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:38:12.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:37:56, diff=16.501132s, valid=True
2026-06-04T08:38:12.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:38:12.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:38:12.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:38:12, diff=0.504609s, valid=True
2026-06-04T08:38:12.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:38:12.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:38:12.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:37:48, diff=24.512828s, valid=True
2026-06-04T08:38:12.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:38:12.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:38:12.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:38:12.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:38:12.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:38:12.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:38:12.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:38:12, diff=0.516511s, valid=True
2026-06-04T08:38:12.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:38:12.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:38:12.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:38:12.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129289.51732s, valid=True
2026-06-04T08:38:12.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:38:12.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:38:12.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:38:12.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:38:12.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:38:12.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:38:12.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:38:12.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:38:12.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:38:12.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:38:12.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:38:12.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:38:12.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:38:12.904 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:38:13.113 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:38:13.451 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:38:13.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:38:13.550 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:38:13.550 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:38:13.706 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:38:13.706 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:38:43.733 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:38:43.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:38:43.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:38:43.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:38:43.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:38:44.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:38:44.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:38:44.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:38:44.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:38:44.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:38:44.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:38:44.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:38:44.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:38:46.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:38:46.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:38:46.841 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:38:46.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:38:46.851 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:38:46.864 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:38:46.864 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:38:46.865 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:38:46.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:38:46.866 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:38:46.866 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:38:46.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:38:47.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:38:47.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:38:47.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:38:47.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:38:47.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:38:47.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:38:47.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:38:47.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:38:47.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:38:47.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:38:47.214 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:38:47.286 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:38:27
2026-06-04T08:38:47.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88422, datetime.datetime(2026, 6, 4, 8, 38, 27), datetime.datetime(2026, 6, 4, 8, 38, 26), 'salt', 2.06, 100.68, None, 32.99, 162.42, -0.1, 822.15, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:38:47.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:38:47.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:38:47.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:38:26, diff=21.294093s, valid=True
2026-06-04T08:38:47.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:38:47.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:38:47.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:38:12, diff=35.297814s, valid=True
2026-06-04T08:38:47.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:38:47.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:38:47.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:38:19, diff=28.306295s, valid=True
2026-06-04T08:38:47.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:38:47.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:38:47.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:38:47.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:38:47.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:38:47.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:38:47.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:38:12, diff=35.31028s, valid=True
2026-06-04T08:38:47.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:38:47.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:38:47.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:38:47.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129324.311101s, valid=True
2026-06-04T08:38:47.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:38:47.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:38:47.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:38:47.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:38:47.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:38:47.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:38:47.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:38:47.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:38:47.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:38:47.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:38:47.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:38:47.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:38:47.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:38:47.634 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:38:47.837 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:38:48.174 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:38:48.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:38:48.274 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:38:48.274 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:38:48.519 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:38:48.519 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:39:18.541 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:39:18.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:39:18.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:39:18.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:39:18.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:39:18.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:39:18.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:39:18.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:39:18.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:39:18.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:39:18.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:39:18.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:39:18.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:39:21.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:39:21.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:39:21.755 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:39:21.756 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:39:21.766 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:39:21.778 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:39:21.779 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:39:21.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:39:21.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:39:21.780 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:39:21.780 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:39:21.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:39:21.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:39:21.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:39:22.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:39:22.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:39:22.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:39:22.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:39:22.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:39:22.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:39:22.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:39:22.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:39:22.112 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:39:22.184 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:38:57
2026-06-04T08:39:22.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88423, datetime.datetime(2026, 6, 4, 8, 38, 57), datetime.datetime(2026, 6, 4, 8, 38, 57), 'salt', 2.1, 100.68, None, 32.46, 152.03, -0.09, 822.09, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:39:22.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:39:22.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:39:22.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:38:57, diff=25.191452s, valid=True
2026-06-04T08:39:22.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:39:22.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:39:22.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:39:12, diff=10.195041s, valid=True
2026-06-04T08:39:22.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:39:22.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:39:22.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:38:49, diff=33.203253s, valid=True
2026-06-04T08:39:22.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:39:22.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:39:22.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:39:22.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:39:22.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:39:22.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:39:22.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:39:12, diff=10.206964s, valid=True
2026-06-04T08:39:22.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:39:22.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:39:22.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:39:22.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129359.207774s, valid=True
2026-06-04T08:39:22.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:39:22.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:39:22.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:39:22.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:39:22.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:39:22.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:39:22.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:39:22.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:39:22.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:39:22.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:39:22.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:39:22.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:39:22.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:39:22.592 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:39:22.797 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:39:23.136 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:39:23.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:39:23.237 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:39:23.237 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:39:23.483 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:39:23.484 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:39:53.490 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:39:53.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:39:53.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:39:53.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:39:53.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:39:53.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:39:53.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:39:53.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:39:53.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:39:53.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:39:53.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:39:53.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:39:53.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:39:56.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:39:56.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:39:56.549 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:39:56.550 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:39:56.559 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:39:56.571 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:39:56.572 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:39:56.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:39:56.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:39:56.573 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:39:56.573 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:39:56.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:39:56.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:39:56.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:39:56.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:39:56.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:39:56.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:39:56.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:39:56.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:39:56.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:39:56.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:39:56.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:39:56.907 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:39:56.982 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:39:28
2026-06-04T08:39:56.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88424, datetime.datetime(2026, 6, 4, 8, 39, 28), datetime.datetime(2026, 6, 4, 8, 39, 27), 'salt', 2.16, 100.74, None, 31.47, 170.52, -0.11, 822.02, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:39:56.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:39:56.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:39:56.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:39:27, diff=29.99047s, valid=True
2026-06-04T08:39:56.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:39:56.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:39:56.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:39:12, diff=44.994109s, valid=True
2026-06-04T08:39:56.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:39:56.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:39:57.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:39:23, diff=34.002654s, valid=True
2026-06-04T08:39:57.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:39:57.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:39:57.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:39:57.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:39:57.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:39:57.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:39:57.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:39:12, diff=45.006503s, valid=True
2026-06-04T08:39:57.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:39:57.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:39:57.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:39:57.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129394.00735s, valid=True
2026-06-04T08:39:57.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:39:57.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:39:57.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:39:57.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:39:57.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:39:57.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:39:57.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:39:57.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:39:57.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:39:57.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:39:57.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:39:57.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:39:57.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:39:57.328 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:39:57.533 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:39:57.871 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:39:57.969 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:39:57.970 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:39:57.970 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:39:58.218 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:39:58.218 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:40:28.248 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:40:28.248 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:40:28.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:40:28.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:40:28.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:40:28.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:40:28.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:40:28.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:40:28.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:40:28.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:40:28.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:40:28.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:40:28.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:40:31.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:40:31.653 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:40:31.654 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:40:31.654 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:40:31.665 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:40:31.678 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:40:31.679 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:40:31.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:40:31.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:40:31.680 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:40:31.680 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:40:31.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:40:31.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-06-04T08:40:31.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:40:31.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-06-04T08:40:31.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:40:31.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:40:31.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:40:31.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:40:31.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:40:31.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:40:31.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:40:31.981 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:40:32.055 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:40:28
2026-06-04T08:40:32.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88426, datetime.datetime(2026, 6, 4, 8, 40, 28), datetime.datetime(2026, 6, 4, 8, 40, 27), 'salt', 2.2, 100.78, None, 28.23, 158.02, -0.11, 822.21, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:40:32.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:40:32.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-06-04T08:40:32.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:40:27, diff=5.063003s, valid=True
2026-06-04T08:40:32.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:40:32.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:40:32.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:40:12, diff=20.066449s, valid=True
2026-06-04T08:40:32.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:40:32.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-06-04T08:40:32.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:40:24, diff=8.074444s, valid=True
2026-06-04T08:40:32.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:40:32.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:40:32.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:40:32.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:40:32.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:40:32.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:40:32.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:40:12, diff=20.078061s, valid=True
2026-06-04T08:40:32.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:40:32.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:40:32.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:40:32.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129429.07884s, valid=True
2026-06-04T08:40:32.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:40:32.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:40:32.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:40:32.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:40:32.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:40:32.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:40:32.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:40:32.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:40:32.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:40:32.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:40:32.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:40:32.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:40:32.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:40:32.398 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:40:32.627 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:40:32.964 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:40:33.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:40:33.064 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:40:33.064 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:40:33.238 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:40:33.238 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:41:03.255 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:41:03.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:41:03.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:41:03.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:41:03.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:41:04.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:41:04.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:41:04.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:41:04.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:41:04.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:41:04.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:41:04.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:41:04.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:41:06.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:41:06.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:41:06.615 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:41:06.615 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:41:06.626 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:41:06.638 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:41:06.638 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:41:06.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:41:06.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:41:06.638 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:41:06.638 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:41:06.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:41:06.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:41:06.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:41:06.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:41:06.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:41:06.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:41:06.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:41:06.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:41:06.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:41:06.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:41:06.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:41:06.983 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:41:07.061 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:40:58
2026-06-04T08:41:07.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88427, datetime.datetime(2026, 6, 4, 8, 40, 58), datetime.datetime(2026, 6, 4, 8, 40, 58), 'salt', 2.1, 100.64, None, 27.49, 159.81, -0.09, 822.15, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:41:07.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:41:07.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:41:07.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:40:58, diff=9.068143s, valid=True
2026-06-04T08:41:07.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:41:07.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:41:07.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:41:12, diff=-4.928515s, valid=True
2026-06-04T08:41:07.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:41:07.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:41:07.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:40:50, diff=17.079217s, valid=True
2026-06-04T08:41:07.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:41:07.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:41:07.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:41:07.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:41:07.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:41:07.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:41:07.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:41:12, diff=-4.91719s, valid=True
2026-06-04T08:41:07.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:41:07.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:41:07.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:41:07.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129464.083641s, valid=True
2026-06-04T08:41:07.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:41:07.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:41:07.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:41:07.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:41:07.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:41:07.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:41:07.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:41:07.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:41:07.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:41:07.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:41:07.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:41:07.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:41:07.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:41:07.431 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:41:07.635 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:41:08.032 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:41:08.132 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:41:08.132 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:41:08.132 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:41:08.384 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:41:08.385 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:41:38.398 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:41:38.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:41:38.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:41:38.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:41:38.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:41:39.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:41:39.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:41:39.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:41:39.181 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:41:39.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:41:39.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:41:39.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:41:39.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:41:41.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:41:41.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:41:41.724 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:41:41.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:41:41.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:41:41.754 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:41:41.755 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:41:41.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:41:41.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:41:41.756 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:41:41.756 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:41:41.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:41:41.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:41:41.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:41:41.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:41:41.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:41:42.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:41:42.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:41:42.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:41:42.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:41:42.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:41:42.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:41:42.082 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:41:42.156 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:41:29
2026-06-04T08:41:42.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88428, datetime.datetime(2026, 6, 4, 8, 41, 29), datetime.datetime(2026, 6, 4, 8, 41, 28), 'salt', 2.1, 100.67, None, 37.08, 166.6, -0.09, 822.14, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:41:42.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:41:42.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:41:42.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:41:28, diff=14.162583s, valid=True
2026-06-04T08:41:42.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:41:42.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:41:42.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:41:12, diff=30.165474s, valid=True
2026-06-04T08:41:42.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:41:42.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:41:42.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:41:20, diff=22.172554s, valid=True
2026-06-04T08:41:42.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:41:42.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:41:42.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:41:42.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:41:42.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:41:42.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:41:42.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:41:12, diff=30.175829s, valid=True
2026-06-04T08:41:42.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:41:42.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:41:42.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:41:42.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129499.176502s, valid=True
2026-06-04T08:41:42.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:41:42.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:41:42.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:41:42.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:41:42.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:41:42.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:41:42.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:41:42.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:41:42.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:41:42.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:41:42.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:41:42.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:41:42.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:41:42.495 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:41:42.698 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:41:43.037 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:41:43.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:41:43.136 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:41:43.136 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:41:43.301 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:41:43.301 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:42:13.305 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:42:13.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:42:13.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:42:13.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:42:13.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:42:14.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:42:14.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:42:14.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:42:14.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:42:14.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:42:14.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:42:14.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:42:14.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:42:16.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:42:16.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:42:16.760 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:42:16.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:42:16.774 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:42:16.786 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:42:16.787 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:42:16.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:42:16.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:42:16.788 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:42:16.788 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:42:16.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:42:16.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:42:16.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:42:17.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:42:17.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:42:17.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:42:17.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:42:17.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:42:17.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:42:17.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:42:17.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:42:17.127 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:42:17.196 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:41:59
2026-06-04T08:42:17.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88429, datetime.datetime(2026, 6, 4, 8, 41, 59), datetime.datetime(2026, 6, 4, 8, 41, 58), 'salt', 2.23, 100.77, None, 38.28, 163.78, -0.11, 822.14, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:42:17.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:42:17.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:42:17.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:41:58, diff=19.204408s, valid=True
2026-06-04T08:42:17.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:42:17.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:42:17.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:42:12, diff=5.20802s, valid=True
2026-06-04T08:42:17.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:42:17.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:42:17.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:41:50, diff=27.216508s, valid=True
2026-06-04T08:42:17.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:42:17.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:42:17.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:42:17.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:42:17.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:42:17.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:42:17.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:42:12, diff=5.220385s, valid=True
2026-06-04T08:42:17.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:42:17.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:42:17.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:42:17.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129534.22125s, valid=True
2026-06-04T08:42:17.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:42:17.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:42:17.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:42:17.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:42:17.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:42:17.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:42:17.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:42:17.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:42:17.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:42:17.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:42:17.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:42:17.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:42:17.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:42:17.541 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:42:17.817 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:42:18.155 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:42:18.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:42:18.256 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:42:18.256 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:42:18.437 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:42:18.437 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:42:48.449 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:42:48.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:42:48.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:42:48.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:42:48.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:42:48.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:42:48.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:42:48.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:42:48.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:42:48.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:42:48.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:42:48.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:42:48.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:42:51.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:42:51.552 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:42:51.553 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:42:51.553 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:42:51.562 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:42:51.576 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:42:51.576 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:42:51.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:42:51.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:42:51.577 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:42:51.578 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:42:51.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:42:51.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:42:51.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:42:51.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:42:51.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:42:51.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:42:51.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:42:51.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:42:51.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:42:51.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:42:51.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:42:51.914 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:42:51.992 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:42:30
2026-06-04T08:42:51.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88430, datetime.datetime(2026, 6, 4, 8, 42, 30), datetime.datetime(2026, 6, 4, 8, 42, 29), 'salt', 2.2, 100.68, None, 24.66, 153.56, -0.09, 822.14, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:42:51.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:42:51.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:42:51.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:42:29, diff=22.999899s, valid=True
2026-06-04T08:42:52.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:42:52.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:42:52.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:42:12, diff=40.003539s, valid=True
2026-06-04T08:42:52.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:42:52.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:42:52.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:42:20, diff=32.011842s, valid=True
2026-06-04T08:42:52.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:42:52.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:42:52.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:42:52.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:42:52.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:42:52.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:42:52.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:42:12, diff=40.015696s, valid=True
2026-06-04T08:42:52.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:42:52.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:42:52.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:42:52.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129569.016523s, valid=True
2026-06-04T08:42:52.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:42:52.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:42:52.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:42:52.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:42:52.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:42:52.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:42:52.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:42:52.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:42:52.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:42:52.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:42:52.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:42:52.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:42:52.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:42:52.343 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:42:52.549 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:42:52.892 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:42:52.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:42:52.993 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:42:52.993 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:42:53.178 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:42:53.178 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:43:23.179 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:43:23.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:43:23.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:43:23.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:43:23.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:43:23.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:43:23.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:43:23.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:43:23.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:43:23.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:43:23.744 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:43:23.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:43:23.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:43:26.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:43:26.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:43:26.428 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:43:26.428 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:43:26.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:43:26.453 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:43:26.453 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:43:26.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:43:26.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:43:26.454 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:43:26.455 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:43:26.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:43:26.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:43:26.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:43:26.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:43:26.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:43:26.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:43:26.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:43:26.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:43:26.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:43:26.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:43:26.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:43:26.817 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:43:26.899 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:43:00
2026-06-04T08:43:26.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88431, datetime.datetime(2026, 6, 4, 8, 43), datetime.datetime(2026, 6, 4, 8, 42, 59), 'salt', 2.26, 100.77, None, 21.98, 168.43, -0.11, 822.21, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:43:26.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:43:26.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:43:26.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:42:59, diff=27.90845s, valid=True
2026-06-04T08:43:26.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:43:26.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:43:26.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:43:12, diff=14.911816s, valid=True
2026-06-04T08:43:26.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:43:26.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:43:26.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:42:51, diff=35.919655s, valid=True
2026-06-04T08:43:26.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:43:26.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:43:26.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:43:26.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:43:26.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:43:26.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:43:26.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:43:12, diff=14.923189s, valid=True
2026-06-04T08:43:26.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:43:26.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:43:26.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:43:26.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129603.923974s, valid=True
2026-06-04T08:43:26.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:43:26.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:43:26.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:43:26.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:43:26.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:43:26.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:43:26.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:43:26.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:43:27.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:43:27.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:43:27.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:43:27.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:43:27.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:43:27.356 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:43:27.576 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:43:27.947 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:43:28.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:43:28.057 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:43:28.057 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:43:28.219 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:43:28.219 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:43:58.238 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:43:58.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:43:58.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:43:58.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:43:58.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:43:58.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:43:58.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:43:58.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:43:58.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:43:58.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:43:58.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:43:58.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:43:58.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:44:01.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:44:01.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:44:01.156 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:44:01.156 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:44:01.168 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:44:01.180 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:44:01.181 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:44:01.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:44:01.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:44:01.182 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:44:01.182 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:44:01.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:44:01.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-06-04T08:44:01.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:44:01.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-06-04T08:44:01.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:44:01.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T08:44:01.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:44:01.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-06-04T08:44:01.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:44:01.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:44:01.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:44:01.509 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:44:01.581 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:44:01
2026-06-04T08:44:01.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88433, datetime.datetime(2026, 6, 4, 8, 44, 1), datetime.datetime(2026, 6, 4, 8, 44), 'salt', 2.13, 100.64, None, 31.44, 156.0, -0.09, 822.08, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:44:01.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:44:01.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-06-04T08:44:01.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:44:00, diff=1.588628s, valid=True
2026-06-04T08:44:01.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:44:01.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T08:44:01.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:44:12, diff=-10.408128s, valid=True
2026-06-04T08:44:01.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:44:01.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-06-04T08:44:01.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:43:51, diff=10.59957s, valid=True
2026-06-04T08:44:01.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:44:01.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:44:01.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:44:01.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:44:01.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:44:01.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-06-04T08:44:01.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:44:12, diff=-10.396999s, valid=True
2026-06-04T08:44:01.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:44:01.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:44:01.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:44:01.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129638.603755s, valid=True
2026-06-04T08:44:01.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:44:01.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:44:01.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:44:01.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:44:01.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:44:01.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:44:01.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:44:01.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:44:01.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:44:01.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:44:01.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:44:01.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:44:01.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:44:01.926 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:44:02.130 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:44:02.465 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:44:02.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:44:02.564 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:44:02.564 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:44:02.746 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:44:02.747 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:44:32.772 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:44:32.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:44:32.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:44:32.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:44:32.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:44:33.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:44:33.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:44:33.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:44:33.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:44:33.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:44:33.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:44:33.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:44:33.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:44:35.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:44:35.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:44:35.738 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:44:35.738 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:44:35.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:44:35.761 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:44:35.761 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:44:35.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:44:35.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:44:35.762 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:44:35.763 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:44:35.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:44:35.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:44:35.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:44:35.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:44:35.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:44:36.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:44:36.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:44:36.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-06-04T08:44:36.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:44:36.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:44:36.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:44:36.093 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:44:36.166 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:44:31
2026-06-04T08:44:36.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88434, datetime.datetime(2026, 6, 4, 8, 44, 31), datetime.datetime(2026, 6, 4, 8, 44, 30), 'salt', 2.16, 100.67, None, 22.48, 160.39, -0.1, 822.2, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:44:36.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:44:36.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:44:36.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:44:30, diff=6.17388s, valid=True
2026-06-04T08:44:36.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:44:36.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:44:36.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:44:12, diff=24.177362s, valid=True
2026-06-04T08:44:36.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:44:36.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:44:36.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:44:21, diff=15.185517s, valid=True
2026-06-04T08:44:36.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:44:36.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:44:36.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:44:36.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:44:36.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:44:36.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-06-04T08:44:36.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:44:12, diff=24.189281s, valid=True
2026-06-04T08:44:36.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:44:36.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:44:36.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:44:36.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129673.190085s, valid=True
2026-06-04T08:44:36.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:44:36.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:44:36.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:44:36.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:44:36.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:44:36.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:44:36.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:44:36.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:44:36.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:44:36.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:44:36.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:44:36.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:44:36.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:44:36.579 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:44:36.782 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:44:37.118 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:44:37.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:44:37.218 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:44:37.218 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:44:37.397 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:44:37.397 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:45:07.427 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:45:07.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:45:07.427 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:45:07.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:45:07.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:45:07.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:45:07.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:45:07.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:45:07.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:45:07.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:45:07.814 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:45:07.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:45:07.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:45:10.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:45:10.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:45:10.555 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:45:10.555 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:45:10.565 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:45:10.576 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:45:10.577 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:45:10.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:45:10.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:45:10.577 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:45:10.577 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:45:10.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:45:10.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:45:10.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:45:10.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:45:10.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:45:10.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T08:45:10.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:45:10.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T08:45:10.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:45:10.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:45:10.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:45:10.878 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:45:10.951 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:45:02
2026-06-04T08:45:10.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88435, datetime.datetime(2026, 6, 4, 8, 45, 2), datetime.datetime(2026, 6, 4, 8, 45, 1), 'salt', 2.23, 100.68, None, 23.96, 159.13, -0.1, 822.21, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:45:10.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:45:10.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:45:10.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:45:01, diff=9.958954s, valid=True
2026-06-04T08:45:10.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:45:10.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T08:45:10.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:44:12, diff=58.96212s, valid=True
2026-06-04T08:45:10.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:45:10.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:45:10.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:44:51, diff=19.96955s, valid=True
2026-06-04T08:45:10.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:45:10.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:45:10.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:45:10.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:45:10.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:45:10.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T08:45:10.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:44:12, diff=58.973194s, valid=True
2026-06-04T08:45:10.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:45:10.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:45:10.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:45:10.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129707.973905s, valid=True
2026-06-04T08:45:10.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:45:10.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:45:10.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:45:10.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:45:10.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:45:11.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:45:11.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:45:11.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:45:11.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:45:11.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:45:11.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:45:11.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:45:11.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:45:11.326 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:45:11.530 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:45:11.869 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:45:11.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:45:11.993 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:45:11.993 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:45:12.170 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:45:12.170 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:45:42.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:45:42.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:45:42.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:45:42.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:45:42.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:45:42.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:45:42.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:45:42.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:45:42.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:45:42.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:45:42.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:45:42.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:45:42.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:45:45.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:45:45.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:45:45.575 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:45:45.575 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:45:45.586 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:45:45.606 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:45:45.606 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:45:45.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:45:45.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:45:45.608 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:45:45.608 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:45:45.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:45:45.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:45:45.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:45:45.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:45:45.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:45:45.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T08:45:45.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:45:45.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-06-04T08:45:45.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:45:45.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:45:45.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:45:45.942 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:45:46.014 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:45:32
2026-06-04T08:45:46.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88436, datetime.datetime(2026, 6, 4, 8, 45, 32), datetime.datetime(2026, 6, 4, 8, 45, 31), 'salt', 2.3, 100.77, None, 34.12, 153.3, -0.11, 822.08, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:45:46.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:45:46.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:45:46.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:45:31, diff=15.022102s, valid=True
2026-06-04T08:45:46.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:45:46.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T08:45:46.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:44:12, diff=94.025643s, valid=True
2026-06-04T08:45:46.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:45:46.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:45:46.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:45:32, diff=14.033712s, valid=True
2026-06-04T08:45:46.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:45:46.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:45:46.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:45:46.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:45:46.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:45:46.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-06-04T08:45:46.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:44:12, diff=94.037438s, valid=True
2026-06-04T08:45:46.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:45:46.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:45:46.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:45:46.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129743.038267s, valid=True
2026-06-04T08:45:46.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:45:46.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:45:46.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:45:46.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:45:46.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:45:46.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:45:46.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:45:46.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:45:46.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:45:46.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:45:46.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:45:46.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:45:46.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:45:46.424 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:45:46.630 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:45:46.968 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:45:47.068 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:45:47.068 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:45:47.068 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:45:48.685 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:45:48.685 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:46:18.708 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:46:18.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:46:18.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:46:19.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:46:19.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:46:19.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:46:19.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:46:19.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:46:19.507 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:46:19.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:46:19.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:46:19.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:46:19.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:46:22.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:46:22.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:46:22.566 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:46:22.567 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:46:22.578 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:46:22.590 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:46:22.590 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:46:22.591 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:46:22.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:46:22.592 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:46:22.592 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:46:22.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:46:22.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:46:22.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:46:22.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:46:22.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:46:22.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T08:46:22.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:46:22.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T08:46:22.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:46:22.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:46:22.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:46:22.912 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:46:22.983 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:46:02
2026-06-04T08:46:22.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88437, datetime.datetime(2026, 6, 4, 8, 46, 2), datetime.datetime(2026, 6, 4, 8, 46, 1), 'salt', 2.23, 100.71, None, 24.03, 175.57, -0.1, 822.21, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:46:22.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:46:22.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:46:22.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:46:01, diff=21.990829s, valid=True
2026-06-04T08:46:22.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:46:22.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T08:46:22.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:44:12, diff=130.994308s, valid=True
2026-06-04T08:46:22.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:46:22.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:46:23.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:45:52, diff=31.002267s, valid=True
2026-06-04T08:46:23.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:46:23.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:46:23.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:46:23.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:46:23.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:46:23.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T08:46:23.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:44:12, diff=131.005879s, valid=True
2026-06-04T08:46:23.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:46:23.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:46:23.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:46:23.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129780.006689s, valid=True
2026-06-04T08:46:23.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:46:23.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:46:23.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:46:23.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:46:23.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:46:23.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:46:23.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:46:23.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:46:23.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:46:23.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:46:23.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:46:23.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:46:23.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:46:23.327 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:46:23.530 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:46:23.867 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:46:23.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:46:23.967 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:46:23.967 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:46:24.219 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:46:24.219 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:46:54.249 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:46:54.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:46:54.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:46:54.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:46:54.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:46:54.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:46:54.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:46:54.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:46:54.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:46:54.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:46:54.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:46:54.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:46:54.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:46:57.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:46:57.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:46:57.544 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:46:57.544 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:46:57.555 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:46:57.568 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:46:57.569 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:46:57.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:46:57.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:46:57.570 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:46:57.570 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:46:57.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:46:57.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:46:57.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:46:57.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:46:57.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:46:57.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T08:46:57.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:46:57.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-06-04T08:46:57.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:46:57.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:46:57.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:46:57.902 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:46:57.974 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:46:32
2026-06-04T08:46:57.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88438, datetime.datetime(2026, 6, 4, 8, 46, 32), datetime.datetime(2026, 6, 4, 8, 46, 32), 'salt', 2.23, 100.74, None, 30.13, 147.52, -0.11, 822.14, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:46:57.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:46:57.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:46:57.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:46:32, diff=25.981547s, valid=True
2026-06-04T08:46:57.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:46:57.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T08:46:57.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:44:12, diff=165.985015s, valid=True
2026-06-04T08:46:57.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:46:57.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:46:57.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:46:32, diff=25.993281s, valid=True
2026-06-04T08:46:57.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:46:57.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:46:57.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:46:57.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:46:57.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:46:57.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-06-04T08:46:57.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:44:12, diff=165.996973s, valid=True
2026-06-04T08:46:57.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:46:57.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:46:57.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:46:57.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129814.997793s, valid=True
2026-06-04T08:46:57.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:46:57.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:46:57.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:46:57.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:46:57.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:46:58.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:46:58.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:46:58.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:46:58.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:46:58.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:46:58.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:46:58.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:46:58.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:46:58.318 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:46:58.522 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:46:58.857 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:46:58.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:46:58.956 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:46:58.956 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:46:59.205 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:46:59.206 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:47:29.226 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:47:29.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:47:29.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:47:29.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:47:29.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:47:29.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:47:29.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:47:29.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:47:29.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:47:29.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:47:29.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:47:29.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:47:29.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:47:32.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:47:32.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:47:32.467 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:47:32.468 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:47:32.478 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:47:32.501 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:47:32.502 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:47:32.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:47:32.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:47:32.503 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:47:32.503 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:47:32.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:47:32.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:47:32.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:47:32.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:47:32.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:47:32.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:47:32.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:47:32.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:47:32.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:47:32.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:47:32.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:47:32.841 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:47:32.914 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:47:03
2026-06-04T08:47:32.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88439, datetime.datetime(2026, 6, 4, 8, 47, 3), datetime.datetime(2026, 6, 4, 8, 47, 2), 'salt', 2.3, 100.74, None, 30.73, 148.37, -0.1, 822.21, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:47:32.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:47:32.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:47:32.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:47:02, diff=30.92196s, valid=True
2026-06-04T08:47:32.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:47:32.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:47:32.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:44:12, diff=200.925483s, valid=True
2026-06-04T08:47:32.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:47:32.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:47:32.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:47:02, diff=30.933566s, valid=True
2026-06-04T08:47:32.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:47:32.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:47:32.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:47:32.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:47:32.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:47:32.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:47:32.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:44:12, diff=200.937311s, valid=True
2026-06-04T08:47:32.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:47:32.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:47:32.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:47:32.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129849.938123s, valid=True
2026-06-04T08:47:32.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:47:32.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:47:32.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:47:32.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:47:32.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:47:33.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:47:33.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:47:33.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:47:33.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:47:33.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:47:33.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:47:33.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:47:33.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:47:33.256 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:47:33.458 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:47:33.853 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:47:33.952 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:47:33.952 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:47:33.952 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:47:34.115 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:47:34.115 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:48:04.145 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:48:04.145 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:48:04.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:48:04.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:48:04.314 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:48:04.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:48:04.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:48:04.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:48:04.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:48:04.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:48:04.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:48:04.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:48:04.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:48:07.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:48:07.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:48:07.116 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:48:07.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:48:07.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:48:07.140 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:48:07.140 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:48:07.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:48:07.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:48:07.142 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:48:07.142 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:48:07.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:48:07.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:48:07.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:48:07.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:48:07.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:48:07.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T08:48:07.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:48:07.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T08:48:07.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:48:07.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:48:07.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:48:07.479 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:48:07.550 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:48:03
2026-06-04T08:48:07.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88441, datetime.datetime(2026, 6, 4, 8, 48, 3), datetime.datetime(2026, 6, 4, 8, 48, 2), 'salt', 2.33, 100.74, None, 34.75, 164.27, -0.11, 822.08, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:48:07.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:48:07.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:48:07.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:48:02, diff=5.558632s, valid=True
2026-06-04T08:48:07.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:48:07.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T08:48:07.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:44:12, diff=235.562436s, valid=True
2026-06-04T08:48:07.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:48:07.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:48:07.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:48:01, diff=6.570906s, valid=True
2026-06-04T08:48:07.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:48:07.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:48:07.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:48:07.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:48:07.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:48:07.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T08:48:07.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:44:12, diff=235.574728s, valid=True
2026-06-04T08:48:07.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:48:07.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:48:07.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:48:07.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129884.575552s, valid=True
2026-06-04T08:48:07.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:48:07.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:48:07.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:48:07.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:48:07.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:48:07.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:48:07.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:48:07.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:48:07.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:48:07.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:48:07.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:48:07.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:48:07.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:48:07.897 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:48:08.102 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:48:08.442 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:48:08.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:48:08.543 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:48:08.543 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:48:08.730 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:48:08.730 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:48:38.740 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:48:38.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:48:38.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:48:38.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:48:38.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:48:39.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:48:39.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:48:39.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:48:39.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:48:39.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:48:39.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:48:39.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:48:39.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:48:41.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:48:41.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:48:41.735 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:48:41.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:48:41.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:48:41.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:48:41.758 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:48:41.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:48:41.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:48:41.760 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:48:41.760 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:48:41.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:48:41.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:48:41.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:48:41.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:48:41.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:48:42.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:48:42.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:48:42.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:48:42.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:48:42.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:48:42.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:48:42.098 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:48:42.171 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:48:33
2026-06-04T08:48:42.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88442, datetime.datetime(2026, 6, 4, 8, 48, 33), datetime.datetime(2026, 6, 4, 8, 48, 33), 'salt', 2.2, 100.74, None, 35.57, 149.19, -0.1, 822.08, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:48:42.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:48:42.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:48:42.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:48:33, diff=9.17948s, valid=True
2026-06-04T08:48:42.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:48:42.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:48:42.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:49:12, diff=-29.816884s, valid=True
2026-06-04T08:48:42.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:48:42.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:48:42.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:48:23, diff=19.191693s, valid=True
2026-06-04T08:48:42.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:48:42.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:48:42.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:48:42.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:48:42.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:48:42.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:48:42.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:49:12, diff=-29.804452s, valid=True
2026-06-04T08:48:42.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:48:42.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:48:42.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:48:42.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129919.19638s, valid=True
2026-06-04T08:48:42.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:48:42.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:48:42.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:48:42.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:48:42.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:48:42.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:48:42.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:48:42.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:48:42.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:48:42.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:48:42.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:48:42.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:48:42.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:48:42.587 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:48:42.789 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:48:43.126 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:48:43.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:48:43.226 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:48:43.226 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:48:43.397 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:48:43.398 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:49:13.428 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:49:13.428 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:49:13.428 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:49:13.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:49:13.728 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:49:13.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:49:13.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:49:13.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:49:13.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:49:13.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:49:13.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:49:13.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:49:13.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:49:16.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:49:16.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:49:16.686 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:49:16.686 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:49:16.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:49:16.710 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:49:16.710 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:49:16.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:49:16.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:49:16.712 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:49:16.712 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:49:16.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:49:16.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:49:16.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:49:16.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:49:16.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:49:17.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T08:49:17.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:49:17.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T08:49:17.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:49:17.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:49:17.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:49:17.065 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:49:17.138 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:49:04
2026-06-04T08:49:17.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88443, datetime.datetime(2026, 6, 4, 8, 49, 4), datetime.datetime(2026, 6, 4, 8, 49, 3), 'salt', 2.2, 100.74, None, 30.52, 163.99, -0.1, 822.08, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:49:17.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:49:17.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:49:17.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:49:03, diff=14.146243s, valid=True
2026-06-04T08:49:17.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:49:17.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T08:49:17.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:49:12, diff=5.14971s, valid=True
2026-06-04T08:49:17.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:49:17.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:49:17.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:49:03, diff=14.157887s, valid=True
2026-06-04T08:49:17.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:49:17.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:49:17.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:49:17.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:49:17.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:49:17.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T08:49:17.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:49:12, diff=5.161582s, valid=True
2026-06-04T08:49:17.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:49:17.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:49:17.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:49:17.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129954.162392s, valid=True
2026-06-04T08:49:17.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:49:17.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:49:17.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:49:17.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:49:17.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:49:17.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:49:17.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:49:17.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:49:17.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:49:17.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:49:17.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:49:17.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:49:17.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:49:17.485 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:49:17.690 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:49:18.031 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:49:18.134 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:49:18.134 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:49:18.134 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:49:18.576 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:49:18.577 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:49:48.607 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:49:48.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:49:48.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:49:48.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:49:48.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:49:49.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:49:49.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:49:49.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:49:49.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:49:49.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:49:49.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:49:49.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:49:49.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:49:51.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:49:51.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:49:51.708 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:49:51.708 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:49:51.717 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:49:51.729 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:49:51.730 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:49:51.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:49:51.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:49:51.731 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:49:51.731 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:49:51.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:49:51.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:49:51.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:49:51.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:49:51.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:49:52.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:49:52.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:49:52.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:49:52.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:49:52.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:49:52.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:49:52.068 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:49:52.150 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:49:34
2026-06-04T08:49:52.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88444, datetime.datetime(2026, 6, 4, 8, 49, 34), datetime.datetime(2026, 6, 4, 8, 49, 33), 'salt', 2.16, 100.68, None, 25.51, 166.01, -0.1, 822.14, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:49:52.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:49:52.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:49:52.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:49:33, diff=19.158139s, valid=True
2026-06-04T08:49:52.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:49:52.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:49:52.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:50:12, diff=-19.838346s, valid=True
2026-06-04T08:49:52.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:49:52.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:49:52.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:49:34, diff=18.171878s, valid=True
2026-06-04T08:49:52.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:49:52.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:49:52.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:49:52.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:49:52.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:49:52.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:49:52.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:50:12, diff=-19.824298s, valid=True
2026-06-04T08:49:52.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:49:52.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:49:52.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:49:52.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=129989.176505s, valid=True
2026-06-04T08:49:52.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:49:52.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:49:52.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:49:52.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:49:52.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:49:52.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:49:52.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:49:52.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:49:52.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:49:52.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:49:52.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:49:52.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:49:52.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:49:52.579 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:49:52.785 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:49:53.148 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:49:53.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:49:53.257 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:49:53.257 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:49:54.776 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:49:54.776 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:50:24.806 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:50:24.806 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:50:24.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:50:25.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:50:25.128 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:50:25.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:50:25.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:50:25.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:50:25.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:50:25.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:50:25.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:50:25.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:50:25.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:50:28.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:50:28.059 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:50:28.060 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:50:28.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:50:28.070 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:50:28.083 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:50:28.084 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:50:28.084 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:50:28.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:50:28.085 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:50:28.085 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:50:28.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:50:28.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:50:28.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:50:28.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:50:28.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:50:28.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T08:50:28.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:50:28.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T08:50:28.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:50:28.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:50:28.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:50:28.414 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:50:28.486 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:50:04
2026-06-04T08:50:28.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88445, datetime.datetime(2026, 6, 4, 8, 50, 4), datetime.datetime(2026, 6, 4, 8, 50, 3), 'salt', 2.13, 100.64, None, 24.88, 152.01, -0.09, 822.21, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:50:28.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:50:28.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:50:28.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:50:03, diff=25.494724s, valid=True
2026-06-04T08:50:28.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:50:28.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T08:50:28.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:50:12, diff=16.498201s, valid=True
2026-06-04T08:50:28.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:50:28.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:50:28.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:50:04, diff=24.506302s, valid=True
2026-06-04T08:50:28.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:50:28.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:50:28.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:50:28.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:50:28.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:50:28.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T08:50:28.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:50:12, diff=16.510005s, valid=True
2026-06-04T08:50:28.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:50:28.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:50:28.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:50:28.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=130025.510806s, valid=True
2026-06-04T08:50:28.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:50:28.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:50:28.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:50:28.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:50:28.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:50:28.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:50:28.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:50:28.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:50:28.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:50:28.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:50:28.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:50:28.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:50:28.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:50:28.831 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:50:29.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:50:29.388 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:50:29.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:50:29.489 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:50:29.489 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:50:29.673 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:50:29.673 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:50:59.703 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:50:59.703 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:50:59.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:50:59.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:50:59.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:51:00.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:51:00.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:51:00.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:51:00.081 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:51:00.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:51:00.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:51:00.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:51:00.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:51:02.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:51:02.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:51:02.787 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:51:02.787 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:51:02.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:51:02.810 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:51:02.811 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:51:02.811 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:51:02.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:51:02.812 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:51:02.812 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:51:02.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:51:03.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:51:03.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:51:03.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:51:03.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:51:03.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:51:03.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:51:03.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:51:03.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:51:03.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:51:03.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:51:03.246 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:51:03.317 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:50:34
2026-06-04T08:51:03.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88446, datetime.datetime(2026, 6, 4, 8, 50, 34), datetime.datetime(2026, 6, 4, 8, 50, 34), 'salt', 2.16, 100.71, None, 31.51, 171.2, -0.11, 822.27, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:51:03.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:51:03.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:51:03.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:50:34, diff=29.324778s, valid=True
2026-06-04T08:51:03.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:51:03.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:51:03.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:51:12, diff=-8.671616s, valid=True
2026-06-04T08:51:03.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:51:03.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:51:03.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:50:34, diff=29.336806s, valid=True
2026-06-04T08:51:03.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:51:03.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:51:03.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:51:03.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:51:03.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:51:03.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:51:03.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:51:12, diff=-8.659352s, valid=True
2026-06-04T08:51:03.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:51:03.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:51:03.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:51:03.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=130060.34149s, valid=True
2026-06-04T08:51:03.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:51:03.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:51:03.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:51:03.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:51:03.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:51:03.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:51:03.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:51:03.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:51:03.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:51:03.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:51:03.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:51:03.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:51:03.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:51:03.733 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:51:03.947 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:51:04.293 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:51:04.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:51:04.394 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:51:04.394 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:51:04.647 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:51:04.647 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:51:34.649 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:51:34.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:51:34.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:51:35.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:51:35.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:51:35.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:51:35.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:51:35.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:51:35.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:51:35.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:51:35.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:51:35.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:51:35.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:51:38.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:51:38.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:51:38.063 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:51:38.063 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:51:38.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:51:38.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:51:38.085 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:51:38.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:51:38.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:51:38.086 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:51:38.086 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:51:38.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:51:38.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:51:38.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:51:38.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:51:38.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:51:38.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:51:38.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:51:38.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:51:38.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:51:38.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:51:38.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:51:38.363 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:51:38.435 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:51:35
2026-06-04T08:51:38.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88448, datetime.datetime(2026, 6, 4, 8, 51, 35), datetime.datetime(2026, 6, 4, 8, 51, 34), 'salt', 2.23, 100.64, None, 33.8, 170.17, -0.09, 822.15, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:51:38.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:51:38.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:51:38.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:51:34, diff=4.441127s, valid=True
2026-06-04T08:51:38.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:51:38.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:51:38.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:52:12, diff=-33.556058s, valid=True
2026-06-04T08:51:38.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:51:38.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:51:38.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:51:35, diff=3.450523s, valid=True
2026-06-04T08:51:38.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:51:38.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:51:38.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:51:38.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:51:38.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:51:38.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:51:38.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:52:12, diff=-33.54646s, valid=True
2026-06-04T08:51:38.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:51:38.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:51:38.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:51:38.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=130095.454198s, valid=True
2026-06-04T08:51:38.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:51:38.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:51:38.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:51:38.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:51:38.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:51:38.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:51:38.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:51:38.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:51:38.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:51:38.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:51:38.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:51:38.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:51:38.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:51:38.783 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:51:38.997 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:51:39.341 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:51:39.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:51:39.444 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:51:39.444 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:51:39.623 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:51:39.623 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:52:09.653 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:52:09.653 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:52:09.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:52:09.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:52:09.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:52:10.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:52:10.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:52:10.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:52:10.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:52:10.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:52:10.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:52:10.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:52:10.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:52:13.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:52:13.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:52:13.165 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:52:13.165 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:52:13.175 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:52:13.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:52:13.196 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:52:13.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:52:13.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:52:13.197 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:52:13.197 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:52:13.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:52:13.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:52:13.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:52:13.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:52:13.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:52:13.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T08:52:13.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:52:13.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T08:52:13.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:52:13.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:52:13.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:52:13.536 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:52:13.608 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:52:05
2026-06-04T08:52:13.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88449, datetime.datetime(2026, 6, 4, 8, 52, 5), datetime.datetime(2026, 6, 4, 8, 52, 4), 'salt', 2.23, 100.74, None, 44.99, 161.71, -0.11, 822.02, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:52:13.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:52:13.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:52:13.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:52:04, diff=9.616145s, valid=True
2026-06-04T08:52:13.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:52:13.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T08:52:13.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:52:12, diff=1.619672s, valid=True
2026-06-04T08:52:13.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:52:13.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:52:13.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:52:05, diff=8.62789s, valid=True
2026-06-04T08:52:13.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:52:13.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:52:13.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:52:13.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:52:13.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:52:13.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T08:52:13.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:52:12, diff=1.631656s, valid=True
2026-06-04T08:52:13.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:52:13.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:52:13.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:52:13.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=130130.632473s, valid=True
2026-06-04T08:52:13.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:52:13.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:52:13.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:52:13.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:52:13.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:52:13.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:52:13.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:52:13.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:52:13.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:52:13.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:52:13.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:52:13.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:52:13.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:52:13.955 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:52:14.169 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:52:14.516 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:52:14.618 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:52:14.618 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:52:14.618 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:52:17.087 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:52:17.088 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:52:47.091 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:52:47.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:52:47.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:52:47.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:52:47.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:52:47.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:52:47.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:52:47.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:52:47.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:52:47.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:52:47.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:52:47.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:52:47.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:52:50.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:52:50.198 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:52:50.198 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:52:50.199 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:52:50.206 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:52:50.219 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:52:50.220 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:52:50.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:52:50.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:52:50.221 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:52:50.221 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:52:50.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:52:50.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:52:50.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:52:50.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:52:50.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:52:50.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:52:50.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:52:50.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:52:50.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:52:50.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:52:50.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:52:50.550 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:52:50.622 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:52:35
2026-06-04T08:52:50.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88450, datetime.datetime(2026, 6, 4, 8, 52, 35), datetime.datetime(2026, 6, 4, 8, 52, 35), 'salt', 2.2, 100.68, None, 28.23, 139.72, -0.09, 822.15, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:52:50.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:52:50.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:52:50.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:52:35, diff=15.629519s, valid=True
2026-06-04T08:52:50.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:52:50.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:52:50.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:53:12, diff=-21.367016s, valid=True
2026-06-04T08:52:50.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:52:50.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:52:50.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:52:35, diff=15.64118s, valid=True
2026-06-04T08:52:50.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:52:50.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:52:50.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:52:50.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:52:50.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:52:50.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:52:50.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:53:12, diff=-21.355074s, valid=True
2026-06-04T08:52:50.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:52:50.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:52:50.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:52:50.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=130167.645737s, valid=True
2026-06-04T08:52:50.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:52:50.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:52:50.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:52:50.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:52:50.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:52:50.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:52:50.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:52:50.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:52:50.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:52:50.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:52:50.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:52:50.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:52:50.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:52:50.965 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:52:51.177 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:52:51.583 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:52:51.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:52:51.688 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:52:51.688 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:52:52.150 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:52:52.150 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:53:22.157 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:53:22.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:53:22.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:53:22.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:53:22.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:53:22.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:53:22.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:53:22.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:53:22.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:53:22.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:53:22.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:53:22.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:53:22.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:53:25.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:53:25.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:53:25.434 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:53:25.434 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:53:25.445 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:53:25.458 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:53:25.458 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:53:25.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:53:25.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:53:25.459 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:53:25.459 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:53:25.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:53:25.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:53:25.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:53:25.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:53:25.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:53:25.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T08:53:25.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:53:25.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T08:53:25.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:53:25.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:53:25.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:53:25.816 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:53:25.893 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:53:06
2026-06-04T08:53:25.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88451, datetime.datetime(2026, 6, 4, 8, 53, 6), datetime.datetime(2026, 6, 4, 8, 53, 5), 'salt', 2.23, 100.68, None, 34.58, 160.16, -0.1, 822.08, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:53:25.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:53:25.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:53:25.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:53:05, diff=20.899722s, valid=True
2026-06-04T08:53:25.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:53:25.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T08:53:25.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:53:12, diff=13.902551s, valid=True
2026-06-04T08:53:25.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:53:25.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:53:25.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:53:05, diff=20.910924s, valid=True
2026-06-04T08:53:25.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:53:25.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:53:25.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:53:25.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:53:25.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:53:25.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T08:53:25.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:53:12, diff=13.914568s, valid=True
2026-06-04T08:53:25.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:53:25.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:53:25.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:53:25.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=130202.915351s, valid=True
2026-06-04T08:53:25.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:53:25.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:53:25.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:53:25.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:53:25.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:53:25.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:53:25.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:53:25.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:53:25.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:53:26.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:53:26.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:53:26.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:53:26.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:53:26.233 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:53:26.447 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:53:26.795 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:53:26.897 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:53:26.897 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:53:26.897 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:53:27.153 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:53:27.153 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:53:57.184 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:53:57.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:53:57.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:53:57.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:53:57.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:53:57.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:53:57.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:53:57.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:53:57.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:53:57.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:53:57.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:53:57.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:53:57.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:54:00.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:54:00.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:54:00.062 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:54:00.062 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:54:00.070 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:54:00.082 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:54:00.082 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:54:00.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:54:00.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:54:00.083 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:54:00.083 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:54:00.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:54:00.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:54:00.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:54:00.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:54:00.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:54:00.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:54:00.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:54:00.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:54:00.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:54:00.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:54:00.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:54:00.376 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:54:00.451 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:53:36
2026-06-04T08:54:00.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88452, datetime.datetime(2026, 6, 4, 8, 53, 36), datetime.datetime(2026, 6, 4, 8, 53, 35), 'salt', 2.26, 100.74, None, 34.9, 149.05, -0.11, 822.08, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:54:00.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:54:00.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:54:00.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:53:35, diff=25.457798s, valid=True
2026-06-04T08:54:00.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:54:00.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:54:00.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:54:12, diff=-11.539364s, valid=True
2026-06-04T08:54:00.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:54:00.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:54:00.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:53:36, diff=24.46735s, valid=True
2026-06-04T08:54:00.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:54:00.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:54:00.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:54:00.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:54:00.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:54:00.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:54:00.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:54:12, diff=-11.529191s, valid=True
2026-06-04T08:54:00.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:54:00.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:54:00.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:54:00.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=130237.471575s, valid=True
2026-06-04T08:54:00.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:54:00.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:54:00.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:54:00.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:54:00.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:54:00.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:54:00.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:54:00.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:54:00.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:54:00.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:54:00.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:54:00.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:54:00.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:54:00.859 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:54:01.070 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:54:01.415 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:54:01.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:54:01.516 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:54:01.516 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:54:01.696 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:54:01.697 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:54:31.700 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:54:31.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:54:31.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:54:31.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:54:31.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:54:32.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:54:32.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:54:32.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:54:32.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:54:32.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:54:32.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:54:32.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:54:32.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:54:34.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:54:34.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:54:34.931 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:54:34.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:54:34.938 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:54:34.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:54:34.951 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:54:34.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:54:34.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:54:34.951 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:54:34.952 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:54:34.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:54:35.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:54:35.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:54:35.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:54:35.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:54:35.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T08:54:35.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:54:35.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T08:54:35.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:54:35.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:54:35.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:54:35.279 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:54:35.351 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:54:06
2026-06-04T08:54:35.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88453, datetime.datetime(2026, 6, 4, 8, 54, 6), datetime.datetime(2026, 6, 4, 8, 54, 5), 'salt', 2.26, 100.81, None, 29.99, 165.52, -0.12, 822.21, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:54:35.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:54:35.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:54:35.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:54:05, diff=30.358725s, valid=True
2026-06-04T08:54:35.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:54:35.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T08:54:35.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:54:12, diff=23.362221s, valid=True
2026-06-04T08:54:35.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:54:35.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:54:35.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:54:06, diff=29.370381s, valid=True
2026-06-04T08:54:35.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:54:35.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:54:35.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:54:35.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:54:35.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:54:35.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T08:54:35.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:54:12, diff=23.374105s, valid=True
2026-06-04T08:54:35.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:54:35.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:54:35.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:54:35.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=130272.37491s, valid=True
2026-06-04T08:54:35.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:54:35.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:54:35.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:54:35.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:54:35.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:54:35.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:54:35.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:54:35.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:54:35.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:54:35.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:54:35.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:54:35.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:54:35.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:54:35.695 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:54:35.908 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:54:36.253 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:54:36.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:54:36.357 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:54:36.357 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:54:36.531 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:54:36.531 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:55:06.541 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:55:06.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:55:06.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:55:06.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:55:06.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:55:06.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:55:06.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:55:06.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:55:06.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:55:06.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:55:06.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:55:06.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:55:06.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:55:09.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:55:09.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:55:09.647 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:55:09.648 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:55:09.659 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:55:09.671 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:55:09.672 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:55:09.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:55:09.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:55:09.673 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:55:09.673 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:55:09.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:55:09.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-06-04T08:55:09.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:55:09.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-06-04T08:55:09.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:55:09.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T08:55:09.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:55:09.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T08:55:09.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:55:09.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:55:09.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:55:09.999 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:55:10.070 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:55:07
2026-06-04T08:55:10.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88455, datetime.datetime(2026, 6, 4, 8, 55, 7), datetime.datetime(2026, 6, 4, 8, 55, 6), 'salt', 2.16, 100.77, None, 34.05, 166.57, -0.11, 822.08, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:55:10.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:55:10.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-06-04T08:55:10.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:55:06, diff=4.077779s, valid=True
2026-06-04T08:55:10.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:55:10.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T08:55:10.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:55:12, diff=-1.918876s, valid=True
2026-06-04T08:55:10.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:55:10.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-06-04T08:55:10.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:55:06, diff=4.088824s, valid=True
2026-06-04T08:55:10.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:55:10.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:55:10.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:55:10.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:55:10.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:55:10.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T08:55:10.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:55:12, diff=-1.907706s, valid=True
2026-06-04T08:55:10.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:55:10.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:55:10.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:55:10.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=130307.093052s, valid=True
2026-06-04T08:55:10.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:55:10.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:55:10.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:55:10.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:55:10.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:55:10.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:55:10.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:55:10.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:55:10.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:55:10.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:55:10.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:55:10.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:55:10.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:55:10.480 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:55:10.698 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:55:11.051 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:55:11.153 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:55:11.154 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:55:11.154 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:55:11.405 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:55:11.405 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:55:41.428 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:55:41.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:55:41.429 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:55:41.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:55:41.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:55:42.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:55:42.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:55:42.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:55:42.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:55:42.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:55:42.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:55:42.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:55:42.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:55:44.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:55:44.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:55:44.742 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:55:44.742 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:55:44.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:55:44.766 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:55:44.767 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:55:44.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:55:44.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:55:44.768 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:55:44.768 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:55:44.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:55:44.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:55:44.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:55:45.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:55:45.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:55:45.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:55:45.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:55:45.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:55:45.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:55:45.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:55:45.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:55:45.108 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:55:45.182 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:55:37
2026-06-04T08:55:45.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88456, datetime.datetime(2026, 6, 4, 8, 55, 37), datetime.datetime(2026, 6, 4, 8, 55, 36), 'salt', 2.2, 100.68, None, 27.66, 154.1, -0.09, 822.08, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:55:45.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:55:45.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:55:45.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:55:36, diff=9.190245s, valid=True
2026-06-04T08:55:45.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:55:45.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:55:45.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:56:12, diff=-26.806187s, valid=True
2026-06-04T08:55:45.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:55:45.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:55:45.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:55:36, diff=9.201969s, valid=True
2026-06-04T08:55:45.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:55:45.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:55:45.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:55:45.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:55:45.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:55:45.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:55:45.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:56:12, diff=-26.794314s, valid=True
2026-06-04T08:55:45.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:55:45.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:55:45.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:55:45.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=130342.206508s, valid=True
2026-06-04T08:55:45.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:55:45.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:55:45.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:55:45.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:55:45.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:55:45.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:55:45.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:55:45.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:55:45.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:55:45.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:55:45.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:55:45.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:55:45.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:55:45.534 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:55:45.746 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:55:46.091 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:55:46.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:55:46.193 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:55:46.193 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:55:46.373 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:55:46.374 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:56:16.382 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:56:16.383 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:56:16.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:56:16.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:56:16.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:56:17.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:56:17.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:56:17.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:56:17.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:56:17.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:56:17.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:56:17.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:56:17.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:56:19.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:56:19.682 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:56:19.682 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:56:19.682 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:56:19.692 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:56:19.704 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:56:19.704 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:56:19.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:56:19.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:56:19.704 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:56:19.704 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:56:19.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:56:19.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:56:19.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:56:19.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:56:19.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:56:19.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T08:56:19.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:56:20.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T08:56:20.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:56:20.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:56:20.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:56:20.021 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:56:20.103 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:56:07
2026-06-04T08:56:20.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88457, datetime.datetime(2026, 6, 4, 8, 56, 7), datetime.datetime(2026, 6, 4, 8, 56, 6), 'salt', 2.3, 100.77, None, 32.07, 163.87, -0.11, 822.2, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:56:20.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:56:20.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:56:20.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:56:06, diff=14.110958s, valid=True
2026-06-04T08:56:20.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:56:20.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T08:56:20.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:56:12, diff=8.11413s, valid=True
2026-06-04T08:56:20.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:56:20.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:56:20.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:56:07, diff=13.121484s, valid=True
2026-06-04T08:56:20.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:56:20.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:56:20.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:56:20.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:56:20.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:56:20.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T08:56:20.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:56:12, diff=8.124874s, valid=True
2026-06-04T08:56:20.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:56:20.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:56:20.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:56:20.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=130377.125677s, valid=True
2026-06-04T08:56:20.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:56:20.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:56:20.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:56:20.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:56:20.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:56:20.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:56:20.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:56:20.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:56:20.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:56:20.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:56:20.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:56:20.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:56:20.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:56:20.444 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:56:20.654 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:56:20.996 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:56:21.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:56:21.096 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:56:21.096 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:56:21.278 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:56:21.278 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:56:51.280 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:56:51.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:56:51.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:56:51.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:56:51.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:56:51.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:56:51.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:56:51.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:56:51.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:56:51.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:56:51.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:56:51.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:56:51.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:56:54.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:56:54.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:56:54.389 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:56:54.390 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:56:54.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:56:54.409 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:56:54.410 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:56:54.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:56:54.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:56:54.411 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:56:54.411 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:56:54.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:56:54.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:56:54.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:56:54.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:56:54.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:56:54.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:56:54.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:56:54.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:56:54.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:56:54.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:56:54.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:56:54.769 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:56:54.849 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:56:37
2026-06-04T08:56:54.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88458, datetime.datetime(2026, 6, 4, 8, 56, 37), datetime.datetime(2026, 6, 4, 8, 56, 37), 'salt', 2.26, 100.67, None, 25.86, 138.5, -0.1, 822.27, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:56:54.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:56:54.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:56:54.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:56:37, diff=17.857239s, valid=True
2026-06-04T08:56:54.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:56:54.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:56:54.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:57:12, diff=-17.139261s, valid=True
2026-06-04T08:56:54.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:56:54.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:56:54.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:56:37, diff=17.869003s, valid=True
2026-06-04T08:56:54.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:56:54.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:56:54.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:56:54.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:56:54.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:56:54.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:56:54.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:57:12, diff=-17.12722s, valid=True
2026-06-04T08:56:54.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:56:54.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:56:54.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:56:54.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=130411.873614s, valid=True
2026-06-04T08:56:54.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:56:54.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:56:54.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:56:54.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:56:54.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:56:54.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:56:54.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:56:54.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:56:54.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:56:55.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:56:55.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:56:55.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:56:55.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:56:55.195 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:56:55.406 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:56:55.814 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:56:55.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:56:55.918 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:56:55.918 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:56:56.093 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:56:56.094 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:57:26.124 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:57:26.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:57:26.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:57:26.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:57:26.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:57:26.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:57:26.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:57:26.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:57:26.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:57:26.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:57:26.545 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:57:26.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:57:26.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:57:29.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:57:29.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:57:29.248 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:57:29.248 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:57:29.258 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:57:29.271 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:57:29.271 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:57:29.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:57:29.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:57:29.272 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:57:29.273 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:57:29.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:57:29.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:57:29.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:57:29.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:57:29.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:57:29.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T08:57:29.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:57:29.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T08:57:29.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:57:29.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:57:29.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:57:29.609 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:57:29.678 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:57:08
2026-06-04T08:57:29.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88459, datetime.datetime(2026, 6, 4, 8, 57, 8), datetime.datetime(2026, 6, 4, 8, 57, 7), 'salt', 2.33, 100.77, None, 33.87, 141.58, -0.11, 822.14, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:57:29.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:57:29.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:57:29.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:57:07, diff=22.684925s, valid=True
2026-06-04T08:57:29.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:57:29.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T08:57:29.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:57:12, diff=17.687871s, valid=True
2026-06-04T08:57:29.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:57:29.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:57:29.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:57:07, diff=22.694799s, valid=True
2026-06-04T08:57:29.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:57:29.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:57:29.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:57:29.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:57:29.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:57:29.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T08:57:29.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:57:12, diff=17.697916s, valid=True
2026-06-04T08:57:29.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:57:29.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:57:29.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:57:29.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=130446.698565s, valid=True
2026-06-04T08:57:29.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:57:29.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:57:29.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:57:29.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:57:29.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:57:29.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:57:29.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:57:29.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:57:29.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:57:29.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:57:29.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:57:29.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:57:30.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:57:30.046 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:57:30.266 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:57:30.618 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:57:30.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:57:30.720 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:57:30.720 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:57:30.888 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:57:30.888 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:58:00.918 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:58:00.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:58:00.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:58:01.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:58:01.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:58:01.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:58:01.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:58:01.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:58:01.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:58:01.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:58:01.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:58:01.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:58:01.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:58:03.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:58:03.913 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:58:03.914 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:58:03.914 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:58:03.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:58:03.937 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:58:03.938 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:58:03.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:58:03.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:58:03.939 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:58:03.939 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:58:03.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:58:04.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:58:04.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:58:04.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:58:04.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:58:04.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:58:04.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:58:04.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:58:04.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:58:04.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:58:04.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:58:04.287 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:58:04.359 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:57:38
2026-06-04T08:58:04.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88460, datetime.datetime(2026, 6, 4, 8, 57, 38), datetime.datetime(2026, 6, 4, 8, 57, 37), 'salt', 2.3, 100.74, None, 35.11, 163.21, -0.1, 822.21, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:58:04.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:58:04.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:58:04.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:57:37, diff=27.366925s, valid=True
2026-06-04T08:58:04.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:58:04.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:58:04.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:58:12, diff=-7.629612s, valid=True
2026-06-04T08:58:04.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:58:04.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:58:04.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:57:34, diff=30.37861s, valid=True
2026-06-04T08:58:04.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:58:04.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:58:04.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:58:04.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:58:04.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:58:04.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:58:04.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:58:12, diff=-7.617698s, valid=True
2026-06-04T08:58:04.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:58:04.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:58:04.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:58:04.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=130481.38314s, valid=True
2026-06-04T08:58:04.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:58:04.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:58:04.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:58:04.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:58:04.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:58:04.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:58:04.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:58:04.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:58:04.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:58:04.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:58:04.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:58:04.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:58:04.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:58:04.779 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:58:04.992 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:58:05.344 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:58:05.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:58:05.446 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:58:05.446 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:58:07.448 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:58:07.448 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:58:37.478 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:58:37.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:58:37.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:58:37.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:58:37.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:58:38.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:58:38.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:58:38.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:58:38.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:58:38.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:58:38.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:58:38.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:58:38.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:58:40.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:58:40.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:58:40.559 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:58:40.560 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:58:40.569 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:58:40.582 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:58:40.582 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:58:40.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:58:40.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:58:40.584 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:58:40.584 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:58:40.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:58:40.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-06-04T08:58:40.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:58:40.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-06-04T08:58:40.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:58:40.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:58:40.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:58:40.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:58:40.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:58:40.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:58:40.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:58:40.923 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:58:40.995 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:58:38
2026-06-04T08:58:40.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88462, datetime.datetime(2026, 6, 4, 8, 58, 38), datetime.datetime(2026, 6, 4, 8, 58, 37), 'salt', 2.23, 100.74, None, 30.63, 148.3, -0.11, 822.2, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:58:40.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:58:40.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-06-04T08:58:41.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:58:37, diff=4.003203s, valid=True
2026-06-04T08:58:41.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:58:41.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:58:41.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:59:12, diff=-30.993311s, valid=True
2026-06-04T08:58:41.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:58:41.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-06-04T08:58:41.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:58:29, diff=12.01484s, valid=True
2026-06-04T08:58:41.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:58:41.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:58:41.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:58:41.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:58:41.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:58:41.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:58:41.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:59:12, diff=-30.981473s, valid=True
2026-06-04T08:58:41.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:58:41.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:58:41.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:58:41.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=130518.019368s, valid=True
2026-06-04T08:58:41.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:58:41.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:58:41.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:58:41.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:58:41.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:58:41.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:58:41.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:58:41.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:58:41.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:58:41.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:58:41.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:58:41.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:58:41.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:58:41.352 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:58:41.562 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:58:41.915 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:58:42.017 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:58:42.017 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:58:42.017 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:58:42.223 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:58:42.224 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:59:12.250 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:59:12.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:59:12.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:59:12.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:59:12.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:59:12.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:59:12.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:59:12.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:59:12.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:59:12.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:59:12.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:59:12.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:59:12.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:59:15.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:59:15.409 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:59:15.410 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:59:15.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:59:15.422 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:59:15.434 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:59:15.434 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:59:15.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:59:15.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:59:15.436 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:59:15.436 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:59:15.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:59:15.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:59:15.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:59:15.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:59:15.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:59:15.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T08:59:15.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:59:15.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-06-04T08:59:15.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:59:15.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:59:15.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:59:15.794 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:59:15.868 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:59:09
2026-06-04T08:59:15.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88463, datetime.datetime(2026, 6, 4, 8, 59, 9), datetime.datetime(2026, 6, 4, 8, 59, 8), 'salt', 2.26, 100.67, None, 36.13, 161.92, -0.1, 822.14, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:59:15.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:59:15.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:59:15.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:59:08, diff=7.875441s, valid=True
2026-06-04T08:59:15.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:59:15.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T08:59:15.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:59:12, diff=3.878715s, valid=True
2026-06-04T08:59:15.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:59:15.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:59:15.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:58:59, diff=16.886387s, valid=True
2026-06-04T08:59:15.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:59:15.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:59:15.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:59:15.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:59:15.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:59:15.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-06-04T08:59:15.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:59:12, diff=3.889942s, valid=True
2026-06-04T08:59:15.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:59:15.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:59:15.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:59:15.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=130552.890707s, valid=True
2026-06-04T08:59:15.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:59:15.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:59:15.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:59:15.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:59:15.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:59:15.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:59:15.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:59:15.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:59:15.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:59:16.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:59:16.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:59:16.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:59:16.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:59:16.278 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:59:16.487 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:59:16.832 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:59:16.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:59:16.933 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:59:16.934 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:59:17.090 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:59:17.090 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-06-04T08:59:47.091 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-06-04T08:59:47.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-06-04T08:59:47.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-06-04T08:59:47.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-06-04T08:59:47.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-06-04T08:59:47.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-06-04T08:59:47.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-06-04T08:59:47.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-06-04T08:59:47.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-06-04T08:59:47.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-06-04T08:59:47.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-06-04T08:59:47.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-06-04T08:59:47.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-06-04T08:59:50.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-06-04T08:59:50.236 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-06-04T08:59:50.237 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-06-04
2026-06-04T08:59:50.237 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-06-04T08:59:50.245 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-06-04
2026-06-04T08:59:50.258 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-06-04', '07:31', '17:38', '21:07', '10:50', 82, '19:05', '06:04')
2026-06-04T08:59:50.259 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-06-04T08:59:50.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-06-04T08:59:50.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-06-04T08:59:50.260 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-06-04T08:59:50.260 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-06-04T08:59:50.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-06-04T08:59:50.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-06-04T08:59:50.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-06-04T08:59:50.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-06-04T08:59:50.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:59:50.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:59:50.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-06-04T08:59:50.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-06-04T08:59:50.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-06-04T08:59:50.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-06-04T08:59:50.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-06-04T08:59:50.595 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-06-04T08:59:50.666 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-06-04 08:59:39
2026-06-04T08:59:50.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(88464, datetime.datetime(2026, 6, 4, 8, 59, 39), datetime.datetime(2026, 6, 4, 8, 59, 38), 'salt', 2.2, 100.74, None, 34.97, 150.18, -0.1, 822.2, 'RAIN', 1, 1, 0, 2, 0, 2)]
2026-06-04T08:59:50.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-06-04T08:59:50.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-06-04T08:59:50.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:59:38, diff=12.674047s, valid=True
2026-06-04T08:59:50.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-06-04T08:59:50.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:59:50.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 09:00:12, diff=-21.322486s, valid=True
2026-06-04T08:59:50.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-06-04T08:59:50.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-06-04T08:59:50.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 08:59:29, diff=21.685878s, valid=True
2026-06-04T08:59:50.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-06-04T08:59:50.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:59:50.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-06-04T08:59:50.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-06-04T08:59:50.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-06-04T08:59:50.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-06-04T08:59:50.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-04 09:00:12, diff=-21.310412s, valid=True
2026-06-04T08:59:50.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-06-04T08:59:50.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-06-04T08:59:50.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-06-04T08:59:50.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-06-02 20:43:23, diff=130587.69053s, valid=True
2026-06-04T08:59:50.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-06-04T08:59:50.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-06-02 20:02:07
2026-06-04T08:59:50.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-06-02 20:43:23
2026-06-04T08:59:50.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:41:16
2026-06-04T08:59:50.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-06-04T08:59:50.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-06-04T08:59:50.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-06-04T08:59:50.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-06-04T08:59:50.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-06-04T08:59:50.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-06-04T08:59:50.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-06-04T08:59:50.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-06-04T08:59:50.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-06-04T08:59:51.010 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-06-04T08:59:51.219 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:59:51.563 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-06-04T08:59:51.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-06-04T08:59:51.665 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-06-04T08:59:51.665 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-06-04T08:59:51.823 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-06-04T08:59:51.824 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
